基於PL/SQL的數據庫備份方法
PL/SQL Developer是Oracle 數據庫中用於導入或導出數據庫的主要工具,本文主要介紹了利用PL/SQL Developer導入和導出數據庫的過程,並對導入或導出時的一些注意事項進行了說明,接下來我們就一一介紹。
導出步驟:
1、tools ->export user object 選擇選項,導出.sql 文件。
2、tools ->export tables-> Oracle Export 選擇選項導出.dmp 文件。
導入步驟:
注:導入之前最好把以前的表刪除,當然導入另外數據庫除外。
1、tools->import tables->SQL Inserts 導入.sql 文件。
2、tools->import talbes->Oracle Import然后再導入dmp 文件。
一些說明:
Tools->Export User Objects導出的是建表語句(包括存儲結構)。PS :這種方式只能導出屬於這個用戶的表,其他用戶的表不能導出,建議用命令行(exp,imp)導出。
Tools->Export Tables里面包含三種導出方式,三種方式都能導出表結構以及數據,如下:
• Oracle Export
• Sql Insert
• pl/sql developer
第一種是導出為.dmp 的文件格式,.dmp 文件是二進制的,可以跨平台,還能包含權限,效率也很不錯,用得最廣 。
第二種是導出為.sql 文件的,可用文本編輯器查看,通用性比較好,但效率不如第一種,適合小數據量導入導出。尤其注意的是表中不能有大字段 (blob,clob,long ),如果有,會提示不能導出(提示如下: table contains one or more LONG columns cannot export in sql format,user Pl/sql developer format instead)。
第三種是導出為.pde 格式的,.pde 為Pl/sql developer 自有的文件格式,只能用Pl/sql developer 自己導入導出,不能用編輯器查看。
PS :只有"Oracle Export" 方式導出再導入后,表結構和索引結構沒有發生變化,另兩種方式都改變了索引類型。
--------------------------------------------------------------------------------------------------------------------------------------------------------------
第1章 導入數據的苦惱
最近,一直再為搭建測試數據庫的事情煩惱,主要碰到如下困難:
1、使用oracle dump 方式導出的數據在導入的時候不能隨意選擇一張表的數據進行導入;一般業務的表的數量都有1000左右,在出現由於某張表數據異常導致的故障時,用dump 文件進行恢復基本不可行或者很費事;
2、表存在外鍵約束和觸發器,使用oracle dump import 方式導入表的時候不能非常簡單的禁止觸發器和外鍵,導致大量錯誤產生,導入的表的數據不全,部分表數據沒有導入;
3、當修改了某些表的數據后需要將這些表的數據恢復到測試環境搭建時的數據,import 不能將這些表的數據清空后重新導入。
4、當修改了某些表的字段后需要將這些表的數據恢復到測試環境搭建時的數據,import 不能將這些表重建后重新導入。
那么有沒有一個工具能夠解決上面我們這位工程師的苦惱呢?
第2章 PL/SQL Developer導入導出工具
PL/SQL Developer位於PLSQL DEV工具的“Tools ”菜單下的“Export tables„”和“Import tables „”下,可以進行數據的導出和導入。
2.1 導出功能介紹
Where clause: 使導出操作支持where 條件,比如你只需要導出每張表的10000條記錄,可以在輸入框里輸入“rownum < 10001”。
Compress file: 選中后支持導出文件的壓縮,節省存儲空間,但是壓縮會占用多余的時間。
Include storage: 導出的文件中包含建表信息,如果需要在導入的時候能支持建表操作,需要選中該項。
2.2 導入功能介紹
Drop tables:支持在導入數據前先刪除表,選擇該項后,默認選擇“Create tables”選項,並且“Truncate tables”和“Delete table”操作變成灰色不可用狀態。
Create tables :支持在導入數據前先創建表,比如我們已將建好了用戶,這個時候需要導入表而之前又沒有執行建表腳本的時候,可以選中此項。
Truncate tables :支持在導入數據前先清空表數據,想恢復表數據到建測試環境的時候可以使用這個選項,該選項和“Delete tables”互斥。
Delete tables :支持在導入數據前刪除表數據,這個選項目前還沒有發現比較特殊的使用意義,該選項和“Truncate tables”互斥。該選項的導入速度大大慢於“Truncate tables”,一般使用“Truncate tables”。
2.3 如何解決導出clob 和blob 類型數據報錯的問題
當表字段中含有clob 和blob 類型數據時,使用PL/SQL Developer導出會報stream read error 的錯誤,導出操作終止,說明PL/SQL Developer方式導出不支持這種類型,oracle export方式可以支持這種類型。 由於需要導出的表很多,PL/SQL在導出前都要對需要導出的表進行分析,通常都會花費十幾分鍾的時間,然而由於某張表存在clob 和blob 類型數據時就會異常終止,那之前的操作時間就會浪費,為了導出所有表需要將導出的表進行標記,只導出沒有clob 和blob 類型數據的表。我們通常的做法是在導出表的時候用ctrl 或者shift 按鍵進行手工選擇,通過導出的日志記錄不能導出的表,然后手工將這些表反選出待導出的表。但是這樣操作費時費力,需要通過不停反復的操作,才能知道哪些表不能導出。 下面介紹一下如何使用oracle 系統視圖all_tab_columns和PL/SQL在導出表的時候提供的Object selection功能快速導出不包含clob 和blob 的表數據。
1、使用下面的sql 語句拼出Object selection的文件內容。
--不包含clob 和blob 的表 select distinct('TABLE "'||a.OWNER ||'"."'||a.TABLE_NAME||'"') from sys.all_tab_columns a where a.OWNER = 'ICDPUB' and a.TABLE_NAME not in (select t.TABLE_NAME from sys.all_tab_columns t where t.OWNER = 'ICDPUB' and t.DATA_TYPE in ('CLOB','BLOB'))
注意:上面的sql 語句里的ICDPUB 是用戶名
2、按照上面的語句的執行結果生成Object selection的文件(后綴是.osf ),文件的內容如下:
PL/SQL Developer Object Selection File 1
TABLE "ICDPUB"."ACTIVE_ALARMS"
TABLE "ICDPUB"."ALLAPPOINT"
TABLE "ICDPUB"."ALLOPTIONVIEW"
TABLE "ICDPUB"."ALLOTCONFIG"
TABLE "ICDPUB"."ALLPAPERAUTHVIEW"
TABLE "ICDPUB"."ALLPAPERVIEW"
TABLE "ICDPUB"."ALLQUESTIONVIEW"
3、在導出表功能的表選擇框里單擊右鍵選擇“Load Object selection”,選擇上一步制作的文件, 完成表的選擇。
4、選擇合適的參數,進行導出操作。
5、用oracle export方式導出包含clob 和blob 的數據。