達夢資料庫支援邏輯備份和實體備份嗎?
答案是肯定的。
邏輯備份是指利用dexp導出工具,将指定對象(庫級、模式級、表級)的資料導出到檔案的備份方式。邏輯備份針對的是資料内容,并不關心這些資料實體存儲在什麼位置。
實體備份則直接掃描資料庫檔案,找出那些已經配置設定、使用的資料頁,拷貝并儲存到備份集中。實體備份過程中,不關心資料頁的具體内容是什麼,也不關心資料頁屬于哪一張表,隻是簡單的根據資料庫檔案系統的描述,來挑選有效的資料頁。
這兩種備份方式,分别适應不同的應用場景,這裡重點介紹實體備份中的表備份,關于邏輯備份更詳細的說明
在實體備份中,按照備份内容不同,可以分為資料備份和歸檔日志備份。資料備份主要針對資料檔案内容,包括庫備份、表空間備份和表備份。
本文主要針對表備份還原的使用進行講解。
目錄
1、表備份
2、表還原
3、備份還原文法
3.1、備份文法:
3.2、還原文法:
4、示例
4.1、備份示例
4.2、還原示例
5、表還原進階主題
5.1、指定還原時不重建索引
5.2、指定還原時不重建限制
6、實戰補充
6.1、批量生成表備份的SQL語句
6.2、批量進行表備份
6.3、批量生成表還原的語句
6.4、批量進行表還原
7、實戰補充進階
7.1、跨使用者還原
7.2、詳細操作
7.2.1、原使用者下批量生成備份表的SQL語句
7.2.2、源使用者批量進行表備份
7.2.3、邏輯導出源使用者表結構
7.2.4、邏輯導入目的使用者表結構
7.2.5、目的使用者批量生成還原表結構的SQL語句
7.2.6、目的使用者批量進行表結構還原
7.2.7、目的使用者批量生成還原表的SQL語句
7.2.8、目的使用者批量進行表還原
7.2.9、目的使用者建立索引
7.2.10、使用源使用者根據列為非空的表查詢拼出設定表列非空的語句
7.2.11、目的使用者修改列為非空
8、注意事項
9、附錄
9.1、總結
9.2、還原時使用不同條件的測試情況
所有測試基于版本:DM8.1.2.128-ENT
1、表備份
表備份是指拷貝指定表的所有資料頁到備份集中,并會記錄各個資料頁之間的邏輯關系用以恢複。表備份隻能在聯機狀态下執行,一次表備份操作隻能備份一張使用者表,并且不支援增量表備份。
表備份主要包括資料備份和元資訊備份兩部分。與庫備份和表空間備份不同,表備份不是直接掃描資料檔案,而是從BUFFER中加載資料頁,拷貝到備份片檔案中。表備份的元資訊則包括建表語句、重建限制語句、重建索引語句,以及其他相關屬性資訊。表備份不需要配置歸檔就可以執行,并且不支援增量表備份。
2、表還原
表還原是從表備份集讀取資料,重新恢複目标表資料,還會在目标表上重建索引、限制。
3、備份還原文法
3.1、備份文法:
BACKUP TABLE <表名>
[TO <備份名>] [BACKUPSET '<備份集路徑>'] [DEVICE TYPE <媒體類型> [PARMS '<媒體參數>']]
[BACKUPINFO '<備份描述>']
[MAXPIECESIZE <備份片限制大小>]
[LIMIT <read_limit>|<write_limit>]
[IDENTIFIED BY <密碼>|”<密碼>” [WITH ENCRYPTION <TYPE>][ENCRYPT WITH <加密算法>]]
[COMPRESSED [LEVEL <壓縮級别>]]
[TRACE FILE '<TRACE檔案名>'] [TRACE LEVEL <TRACE日志級别>];
<read_limit>::= READ SPEED <讀速度上限> [WRITE SPEED <寫速度上限>]
<write_limit>::= WRITE SPEED <寫速度上限>
TABLE:指定備份的表,隻能備份使用者表。
TO:指定生成備份名稱。若未指定,系統随機生成,預設備份名格式為:DB_備份類型_表名_備份時間。其中,備份時間為開始備份的系統時間。
BACKUPSET:指定目前備份集生成路徑。若指定為相對路徑,則在預設備份路徑中生成備份集。若不指定具體備份集路徑,則在預設備份路徑下以約定規則生成預設的表備份集目錄。表備份預設備份集目錄名生成規則:TAB_表名_BTREE_時間,如TAB_T1_BTREE_20180518_143057_123456。表明該備份集為2018年5月18日14時30分57秒123456毫秒時生成的表名為T1的表備份集。若表名超長使備份集目錄完整名稱長度大于128個位元組将直接報錯路徑過長。
DEVICE TYPE:指存儲備份集的媒體類型,表備份暫時隻支援DISK。
PARMS:隻對媒體類型為TAPE時有效。
BACKUPINFO:備份的描述資訊。最大不超過256個位元組。
MAXPIECESIZE:最大備份片檔案大小上限,以M為機關,最小32M,32位系統最大2G,64位系統最大128G。
LIMIT:指定備份時最大的讀寫檔案速度,機關為M/S,預設為0,表示無速度限制。
IDENTIFIED BY:指定備份時的加密密碼。密碼可以用雙引号括起來,這樣可以避免一些特殊字元通不過文法檢測。密碼的設定規則遵行ini參數pwd_policy指定的密碼政策。
WITH ENCRYPTION:指定加密類型,0表示不加密,不對備份檔案進行加密處理;1表示簡單加密,對備份檔案設定密碼,但檔案内容仍以明文方式存儲;2表示完全資料加密,對備份檔案進行完全的加密,備份檔案以密文方式存儲。當不指定WITH ENCRYPTION子句時,采用簡單加密。
ENCRYPT WITH:指定加密算法。當不指定ENCRYPT WITH子句時,使用AES256_CFB加密算法。
說明:加密算法包括:
DES_ECB、DES_CBC、DES_CFB、DES_OFB、DESEDE_ECB、 DESEDE_CBC、DESEDE_CFB、DESEDE_OFB、AES128_ECB、 AES128_CBC、AES128_CFB 、AES128_OFB、AES192_ECB、 AES192_CBC、AES192_CFB 、AES192_OFB、AES256_ECB、 AES256_CBC、AES256_CFB 、AES256_OFB 、RC4
COMPRESSED:是否對備份資料進行壓縮處理。LEVEL表示壓縮等級,取值範圍0~9:0表示不壓縮;1表示1級壓縮;9表示9級壓縮。壓縮級别越高,壓縮速度越慢,但壓縮比越高。若指定COMPRESSED,但未指定LEVEL,則壓縮等級預設1;若未指定COMPRESSED,則預設不進行壓縮處理。
TRACE FILE:指定生成的TRACE檔案。啟用TRACE,但不指定TRACE FILE時,預設在DM資料庫系統的log目錄下生成DM_SBTTRACE_年月.LOG檔案;若使用相對路徑,則生成在執行碼同級目錄下;若使用者指定TRACE FILE,則指定的檔案不能為已經存在的檔案,否則報錯。TRACE FILE不可以為ASM檔案。
TRACE LEVEL:是否啟用TRACE。有效值1、2,預設為1表示不啟用TRACE,此時若指定了TRACE FILE,會生成TRACE檔案,但不寫入TRACE資訊;為2啟用TRACE并在TRACE檔案中寫入TRACE相關内容。
READ SPEED:備份時讀速度上限,取值範圍0~2147483647,機關為M/S,0表示無限制。
WRITE SPEED:備份時寫速度上限,取值範圍0~2147483647,機關為M/S,0表示無限制。
使用說明:
1. 僅支援對使用者的非分區的行存儲表和堆表進行備份,不支援對分區表的備份。在非分區表中,也不支援對臨時表、物化視圖表、物化視圖附屬表、日志表和特定模式(DBG_PKG/INFORMATION_SCHEMA/INFO_SCHEM/SYSREP/SYSGEO/SYSJOB/SYSCPT/SYS)下的表進行表備份。
2. 表的列類型為對象類型的表不支援表備份。
3. 表備份不備份表上的注釋以及default表達式中的函數定義,是以還原時需使用者自行确認。
4. 當備份資料超過限制大小時,會生成新的備份檔案,新的備份檔案名是初始檔案名後加檔案編号。
5. 表備份時,其所屬表空間必須處于聯機狀态。
6. 目前表備份不支援備份到TAPE媒體上。
3.2、還原文法:
RESTORE TABLE [<表名>] [STRUCT] [KEEP TRXID]
FROM BACKUPSET'<備份集路徑>' [DEVICE TYPE <媒體類型> [PARMS '<媒體參數>']]
[IDENTIFIED BY <密碼>|”<密碼>” [ENCRYPT WITH <加密算法>]]
[TRACE FILE '<TRACE檔案名>'] [TRACE LEVEL <TRACE日志級别>];
表名:指定需要還原的表名稱。指定表名還原時資料庫中必須存在該表,否則報錯,不會從備份集判斷是否存在目标表。
STRUCT:執行表結構還原,若未指定,則認為是表中資料還原;表資料還原要求還原目标表結構與備份集中完全一緻,否則報錯,是以表結構還原可以在表資料還原之前執行,減少報錯。
KEEP TRXID:指定還原後資料頁上記錄的TRXID保持不變,若發現備份時系統最大的TRXID大于等于目前系統的最大TRXID,則将目前系統最大事務ID+1000。調整後副作用:rec_id >= next_trxid的記錄,或者rec_id <= bak_max_trxid + 1000的記錄,可能因為執行了表還原,導緻查詢結果不正确,原本不可見的資料,變得可見了。
BACKUPSET:表備份時指定的備份集路徑。若指定為相對路徑,會在預設備份目錄下搜尋備份集。
DEVICE TYPE:指存儲備份集的媒體類型,表還原暫時隻支援DISK。
PARMS:隻對媒體類型為TAPE時有效。
IDENTIFIED BY:加密備份表時,使用者設定的加密密碼。密碼可以用雙引号括起來,這樣可以避免一些特殊字元通不過文法檢測。
ENCRYPT WITH:加密備份表時,使用者設定的加密算法。當不指定ENCRYPT WITH子句時,預設為AES256_CFB加密算法。
TRACE FILE:指定生成的TRACE檔案。啟用TRACE,但不指定TRACE FILE時,預設在DM資料庫系統的log目錄下生成DM_SBTTRACE_年月.log檔案;若使用相對路徑,則生成在執行碼同級目錄下;若使用者指定TRACE FILE,則指定的檔案不能為已經存在的檔案,否則報錯。TRACE FILE不可以為ASM檔案。
TRACE LEVEL:是否啟用TRACE。有效值1、2,預設為1表示不啟用TRACE,此時若指定了TRACE FILE,會生成TRACE檔案,但不寫入TRACE資訊;為2啟用TRACE并在TRACE檔案中寫入TRACE相關内容。
使用說明:
1. 僅支援對普通使用者表進行還原,包括堆表。其中,系統表、臨時表、物化視圖表、物化視圖附屬表、日志表以及特定模式(DBG_PKG/INFORMATION_SCHEMA/INFO_SCHEM/SYSREP/SYSGEO/SYSJOB/SYSCPT/SYS)下的表不支援還原。
2. 列類型為對象類型的表不支援表還原。
3. 若還原表中存在位圖連接配接索引和位圖連接配接虛索引則不支援還原。
4. 若為加密庫,表還原時要求源庫與目标庫加密算法一緻。
5. 備份集路徑指備份集所在目錄,其中應包含完整備份資料,包括中繼資料檔案(.meta)和備份片檔案(.bak)。僅支援從表備份集中還原表。
6. 表名設定為可選參數。若指定,則資料庫中必須存在該表且表定義必須與備份表嚴格一緻;若不指定,則使用備份集中記錄的備份表作為還原目标表。
7. 目标表所在的表空間必須處于聯機狀态。
8. 資料守護環境下,主庫允許表備份還原,備庫不允許。
9. MOUNT和SUSPEND狀态下不允許進行表還原。
10. MPP環境不允許進行表還原。
11. 若在語句中指定STRUCT關鍵字,則執行表結構還原。表結構還原會根據備份集中備份表還原要求,對目标表定義進行校驗,并删除目标表中已存在的二級索引和限制。
12. 若不指定STRUCT關鍵字,則執行表資料還原,表資料還原預設僅會将備份表中聚集索引上的資料進行還原。表資料還原預設僅會在目标表定義與備份表一緻且不存在二級索引和限制的情況下執行。
13. 若在未指定STRUCT的情況下,執行還原出現存在二級索引或備援限制的錯誤,或在不指定目标表的情況下,報目标不存在的錯誤,可先執行STRUCT還原後,再繼續執行實際資料的還原。
14. 若使用者指定TRACE FILE,則指定的檔案不能為已經存在的檔案,否則報錯;也不可以為ASM檔案。
15. 若表中存在大字段列,且表備份時INI參數BLOB_OUTROW_REC_STOR大于0,但建立還原目标表時INI參數BLOB_OUTROW_REC_STOR等于0,那麼若大字段列存在行外資料,則在執行表還原時會報錯,且表資料會丢失。
16. 表還原不檢查目标表的預設表達式(default值)。
17. 若表列進行了加密,則表還原時不能跨庫或跨表還原,隻能還原到自身。
4、示例
4.1、備份示例
完整的備份表步驟如下:
1) 保證資料庫處于OPEN狀态;
2) 建立待備份的表TAB_01:
SQL>CREATE TABLE TAB_01(C1 INT);
3) DIsql中輸入備份表語句,簡單的備份語句如下:
SQL>BACKUP TABLE TAB_01 BACKUPSET '/home/dm_bak/tab_bak_01';
4.2、還原示例
完整的表備份還原步驟如下:
1) 保證資料庫為OPEN狀态;
2) 建立待備份的表;
SQL>CREATE TABLE TAB_FOR_RES_01(C1 INT);
3) 備份表資料;
SQL>BACKUP TABLE TAB_FOR_RES_01 BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
4) 校驗備份,此步驟為可選;
SQL>SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_01');
5) 還原表資料。
SQL>RESTORE TABLE TAB_FOR_RES_01 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
表還原實質是表内資料的還原,以及索引和限制等的重建。如果備份檔案與目标表中都包含索引或限制該如何還原呢?
下面以表中包含索引為例說明如何還原表,具體步驟如下:
1) 保證資料庫為OPEN狀态;
2) 建立待備份的表;
SQL>CREATE TABLE TAB_FOR_RES_02(C1 INT);
3) 建立索引;
SQL>CREATE INDEX I_TAB_FOR_RES_02 ON TAB_FOR_RES_02(C1);
4) 備份表;
SQL>BACKUP TABLE TAB_FOR_RES_02 BACKUPSET '/home/dm_bak/tab_bak_for_res_02';
5) 校驗備份,此步驟為可選;
SQL>SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_02');
6) 執行表結構還原,表備份和目标表中都包含索引,如果直接執行表資料還原會報錯:
還原表中存在二級索引或備援限制;
SQL>RESTORE TABLE TAB_FOR_RES_02 STRUCT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';
7) 執行表資料還原。
SQL>RESTORE TABLE TAB_FOR_RES_02 FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_02';
5、表還原進階主題
5.1、指定還原時不重建索引
表備份時會預設備份表中的索引,還原時使用RESTORE TABLE...WITHOUT INDEX...語句可選擇不還原索引。完整示例如下:
1) 保證資料庫為OPEN狀态;
2) 準備資料,建立待備份的表及索引;
SQL>CREATE TABLE TAB_FOR_IDX_01(C1 INT);
SQL>CREATE INDEX I_TAB_FOR_IDX_01 ON TAB_FOR_IDX_01 (C1);
3) 備份表資料;
SQL>BACKUP TABLE TAB_FOR_IDX_01 BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
4) 校驗備份,此步驟為可選;
SQL>SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_01');
5) 還原表資料,但不重建索引。
SQL>RESTORE TABLE TAB_FOR_RES WITHOUT INDEX FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
5.2、指定還原時不重建限制
表備份時會預設備份表中的索引定義,還原時使用RESTORE TABLE...WITHOUT CONSTRAINT...語句可選擇還原時不重建限制。完整示例如下:
1) 保證資料庫為OPEN狀态;
2) 準備資料,建立待備份的表及索引;
SQL>CREATE TABLE TAB_FOR_CONS_01(C1 INT);
SQL>CREATE INDEX I_TAB_FOR_CONS_01 ON TAB_FOR_CONS_01 (C1);
3) 備份表資料;
SQL>BACKUP TABLE TAB_FOR_CONS_01 BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
4) 校驗備份,此步驟為可選;
SQL>SELECT SF_BAKSET_CHECK('DISK','/home/dm_bak/tab_bak_for_res_01');
5) 還原表資料,但不還原限制。
SQL>RESTORE TABLE TAB_FOR_RES WITHOUT CONSTRAINT FROM BACKUPSET '/home/dm_bak/tab_bak_for_res_01';
6、實戰補充
實際工作中如果隻涉及幾張表,那麼參考以上方式手工進行表的備份還原就可以了,個别情況下可能需要備份上百張表或更多表,那麼使用以上方式去做的話效率是非常低的,是以可以使用以下方式批量操作
6.1、批量生成表備份的SQL語句
--使用要進行備份的使用者登入資料庫,執行以下SQL
SELECT 'BACKUP TABLE "'||TABLE_NAME||'" BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
6.2、批量進行表備份
--示例備份SQL語句如下,以下SQL還可以拆分,分别到不同的session去執行
BACKUP TABLE "REGION" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_REGION';
BACKUP TABLE "CITY" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_CITY';
BACKUP TABLE "LOCATION" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_LOCATION';
BACKUP TABLE "JOB" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB';
BACKUP TABLE "DEPARTMENT" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_DEPARTMENT';
BACKUP TABLE "EMPLOYEE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_EMPLOYEE';
BACKUP TABLE "JOB_HISTORY" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB_HISTORY';
BACKUP TABLE "T_OWNERS" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERS';
BACKUP TABLE "T_OWNERTYPE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERTYPE';
BACKUP TABLE "T_PRICETABLE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_PRICETABLE';
BACKUP TABLE "T_AREA" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_AREA';
BACKUP TABLE "T_OPERATOR" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OPERATOR';
BACKUP TABLE "T_ADDRESS" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ADDRESS';
BACKUP TABLE "T_ACCOUNT" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ACCOUNT';
6.3、批量生成表還原的語句
--使用要進行備份的使用者登入資料庫,執行以下SQL
SELECT 'RESTORE TABLE "'||TABLE_NAME||'" FROM BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
6.4、批量進行表還原
RESTORE TABLE "REGION" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_REGION';
RESTORE TABLE "CITY" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_CITY';
RESTORE TABLE "LOCATION" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_LOCATION';
RESTORE TABLE "JOB" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB';
RESTORE TABLE "DEPARTMENT" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_DEPARTMENT';
RESTORE TABLE "EMPLOYEE" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_EMPLOYEE';
RESTORE TABLE "JOB_HISTORY" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB_HISTORY';
RESTORE TABLE "T_OWNERS" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERS';
RESTORE TABLE "T_OWNERTYPE" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERTYPE';
RESTORE TABLE "T_PRICETABLE" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_PRICETABLE';
RESTORE TABLE "T_AREA" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_AREA';
RESTORE TABLE "T_OPERATOR" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OPERATOR';
RESTORE TABLE "T_ADDRESS" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ADDRESS';
RESTORE TABLE "T_ACCOUNT" FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ACCOUNT';
7、實戰補充進階
通過以上示例,我們已經實作了批量對表進行備份還原,不過,其實表備份還原還有更有意思的玩法。
7.1、跨使用者還原
與其說跨使用者還原,不如說是跨模式還原,在達夢中建立一個使用者A,就會自動生成一個與使用者名同名的模式名,具體使用者名和模式名的對應關系這裡不再細說。通過使用表備份,我們可以将源使用者A的表備份,并還原到目的使用者B下,也就是說,使用表備份,也可以實作在達夢資料庫中模式間的資料遷移。
7.2、詳細操作
現在有一個需求,要求将A使用者的資料遷移到B使用者,邏輯導入導出效率較慢,尋求更高的效率完成,那麼表的備份還原也是一個不錯的方法。
源使用者:A
目的使用者:B
7.2.1、原使用者下批量生成備份表的SQL語句
--A使用者連接配接資料庫執行以下SQL,批量生成表備份的SQL語句
SELECT 'BACKUP TABLE "A"."'||TABLE_NAME||'" BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
7.2.2、源使用者批量進行表備份
--A使用者執行以下SQL進行表備份操作
BACKUP TABLE "A"."REGION" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_REGION';
BACKUP TABLE "A"."CITY" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_CITY';
BACKUP TABLE "A"."LOCATION" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_LOCATION';
BACKUP TABLE "A"."JOB" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB';
BACKUP TABLE "A"."DEPARTMENT" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_DEPARTMENT';
BACKUP TABLE "A"."EMPLOYEE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_EMPLOYEE';
BACKUP TABLE "A"."JOB_HISTORY" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB_HISTORY';
BACKUP TABLE "A"."T_OWNERS" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERS';
BACKUP TABLE "A"."T_OWNERTYPE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERTYPE';
BACKUP TABLE "A"."T_PRICETABLE" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_PRICETABLE';
BACKUP TABLE "A"."T_AREA" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_AREA';
BACKUP TABLE "A"."T_OPERATOR" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OPERATOR';
BACKUP TABLE "A"."T_ADDRESS" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ADDRESS';
BACKUP TABLE "A"."T_ACCOUNT" BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ACCOUNT';
7.2.3、邏輯導出源使用者表結構
--使用邏輯導出的方式将A使用者的對象導出,當然,也可以選擇隻導出表對象
./dexp A/123456789@localhost:5236 FILE=A.dmp DIRECTORY=/home/dmdba/dmbak SCHEMAS=A PARALLEL=4 ROWS=N log=dexp_`date +%Y%m%d%H%M%S`.log
7.2.4、邏輯導入目的使用者表結構
--将A的對象邏輯導入到B使用者下,注意,限制不導入,後邊使用表還原時限制會自動還原
./dimp B/123456789@localhost:5236 FILE=A.dmp DIRECTORY=/home/dmdba/dmbak REMAP_SCHEMA=A:B TABLE_EXISTS_ACTION=REPLACE COMMIT_ROWS=10000 PARALLEL=4 log=dimp_`date +%Y%m%d%H%M%S`.log INDEXFILE=idx.sql CONSTRAINTS=N
7.2.5、目的使用者批量生成還原表結構的SQL語句
--目的使用者B執行以下SQL,生成還原表結構的語句
SELECT 'RESTORE TABLE "B"."'||TABLE_NAME||'" STRUCT FROM BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
7.2.6、目的使用者批量進行表結構還原
--B使用者執行以下SQL進行表結構還原,這一步是為了清理表上的備援限制和索引
RESTORE TABLE "B"."REGION" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_REGION';
RESTORE TABLE "B"."CITY" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_CITY';
RESTORE TABLE "B"."LOCATION" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_LOCATION';
RESTORE TABLE "B"."JOB" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB';
RESTORE TABLE "B"."DEPARTMENT" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_DEPARTMENT';
RESTORE TABLE "B"."EMPLOYEE" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_EMPLOYEE';
RESTORE TABLE "B"."JOB_HISTORY" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB_HISTORY';
RESTORE TABLE "B"."T_OWNERS" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERS';
RESTORE TABLE "B"."T_OWNERTYPE" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERTYPE';
RESTORE TABLE "B"."T_PRICETABLE" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_PRICETABLE';
RESTORE TABLE "B"."T_AREA" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_AREA';
RESTORE TABLE "B"."T_OPERATOR" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OPERATOR';
RESTORE TABLE "B"."T_ADDRESS" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ADDRESS';
RESTORE TABLE "B"."T_ACCOUNT" STRUCT FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ACCOUNT';
7.2.7、目的使用者批量生成還原表的SQL語句
--目的使用者B執行以下SQL,生成還原表的語句
SELECT 'RESTORE TABLE "B"."'||TABLE_NAME||'"WITHOUT INDEX FROM BACKUPSET ''/home/dmdba/dmbak/TAB_BAK_'||TABLE_NAME ||''';' FROM USER_TABLES;
7.2.8、目的使用者批量進行表還原
--B使用者執行以下SQL進行表還原,注意,不重建索引,因為重建後的索引不屬于B使用者的預設索引表空間,而是位于A使用者的預設索引表空間下
RESTORE TABLE "B"."REGION" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_REGION';
RESTORE TABLE "B"."CITY" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_CITY';
RESTORE TABLE "B"."LOCATION" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_LOCATION';
RESTORE TABLE "B"."JOB" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB';
RESTORE TABLE "B"."DEPARTMENT" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_DEPARTMENT';
RESTORE TABLE "B"."EMPLOYEE" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_EMPLOYEE';
RESTORE TABLE "B"."JOB_HISTORY" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_JOB_HISTORY';
RESTORE TABLE "B"."T_OWNERS" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERS';
RESTORE TABLE "B"."T_OWNERTYPE" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OWNERTYPE';
RESTORE TABLE "B"."T_PRICETABLE" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_PRICETABLE';
RESTORE TABLE "B"."T_AREA" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_AREA';
RESTORE TABLE "B"."T_OPERATOR" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_OPERATOR';
RESTORE TABLE "B"."T_ADDRESS" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ADDRESS';
RESTORE TABLE "B"."T_ACCOUNT" WITHOUT INDEX FROM BACKUPSET '/home/dmdba/dmbak/TAB_BAK_T_ACCOUNT';
7.2.9、目的使用者建立索引
SQL> start /home/dmdba/dmbak/idx.sql
7.2.10、使用源使用者根據列為非空的表查詢拼出設定表列非空的語句
SELECT
'ALTER TABLE "B"."'
||TABLE_NAME
||'" ALTER COLUMN "'
||COL_NAME
||'" SET NOT NULL;'
FROM
(
SELECT DISTINCT
B.NAME AS TABLE_NAME,
D."NAME" AS COL_NAME
FROM
SYSOBJECTS B
INNER JOIN SYSCOLUMNS D
ON
B.ID=D.ID
WHERE
B.TYPE$ ='SCHOBJ'
AND B.SUBTYPE$ ='UTAB'
AND D.NULLABLE$ ='N'
AND B.SCHID =
(
SELECT A.ID FROM SYSOBJECTS A WHERE A.NAME='SYSDBA' AND A.TYPE$='SCH'
)
GROUP BY
B.NAME,
D."NAME"
);
7.2.11、目的使用者修改列為非空
--B使用者執行以下SQL修改對應表的列為非空,由于表還原後,非主鍵列的not null丢失,是以需要單獨執行設定非空
ALTER TABLE "B"."QUERYFUNCDEFINE" ALTER COLUMN "MODULEID" SET NOT NULL;
ALTER TABLE "B"."QUERYFUNCDEFINE" ALTER COLUMN "FUNCCODE" SET NOT NULL;
ALTER TABLE "B"."T1" ALTER COLUMN "C1" SET NOT NULL;
ALTER TABLE "B"."T2" ALTER COLUMN "C1" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "ACTIVITY_NAME" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "INTRACTIVE_TYPE" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "EMAIL" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "MOBILE" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "USERAGENT" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "EMAIL_TITLE" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "LABEL" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "CATEGORY1" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "TIME" SET NOT NULL;
ALTER TABLE "B"."USERINFO" ALTER COLUMN "TIME1" SET NOT NULL;
8、注意事項
- 表列類型為對象類型的表不支援表備份,也不支援表還原。
- 表備份不備份表上的注釋,default表達式中函數定義,是以還原時需使用者自行确認。
- 表名中包含保留字的表不允備份還原。
- 若還原表中存在位圖連接配接索引和位圖連接配接虛索引也不支援還原。
- 表備份支援壓縮,但不支援without語句。
- 跨使用者還原表時必須指定表名,否則将還原到原來的使用者下。
- 跨使用者還原要求目的使用者表已存在,否則即使指定了表名,仍然會報錯“第1 行附近出現錯誤[-2106]:無效的表或視圖名[T1].”而導緻還原失敗。
- 非cluster主鍵的表必須先使用“RESTORE TABLE "模式名"."表名" STRUCT FROM BACKUPSET '備份集目錄';”還原表結構,因為dimp導入時可不導入限制索引,但是表上的主鍵限制和系統定義的二級索引還是會建立,如果直接執行“restore table from backupset”會報錯“[-8327]:還原表中存在二級索引或備援限制.”
- cluster主鍵的表可直接指定表名方式還原表,無需“restore table struct from backupset”這一步驟
- 表還原後,限制位于目的使用者的預設表空間下,但還原後的索引仍然位于原使用者的預設索引表空間下,是以索引需要表還原後重建,或使用本文中的方式在還原表時加without index選項不還原索引,而是使用目的使用者執行dimp導入對象時的indexfile參數生成的SQL檔案(索引建立語句),該檔案中的SQL不帶索引存儲的表空間,是以可以直接到目的使用者執行。
- 在第2點中提到的注意事項可以通過邏輯導的方式(dexp/dimp)把結構遷移到目的使用者,此後在進行表還原時,表的注釋和預設值等不會丢失
- 如果擔心7.2.10中查到的設定非空語句有問題(7.2.10使用的語句拼出的SQL包含了主鍵列的非空設定語句,但在表還原時,主鍵正常還原,主鍵自動在對應的列上已經加過了not null),可以使用以下方式,隻查詢拼寫出非主鍵的列非空語句
SELECT
'ALTER TABLE "'
||TABLE_NAME
||'" ALTER COLUMN "'
||COL_NAME
||'" SET NOT NULL;'
FROM
(
SELECT DISTINCT
B.NAME AS TABLE_NAME,
D."NAME" AS COL_NAME
FROM
SYSOBJECTS B
INNER JOIN SYSCOLUMNS D
ON
B.ID=D.ID
WHERE
B.TYPE$ ='SCHOBJ'
AND B.SUBTYPE$ ='UTAB'
AND D.NULLABLE$ ='N'
AND B.SCHID =
(
SELECT A.ID FROM SYSOBJECTS A WHERE A.NAME='SYSDBA' AND A.TYPE$='SCH'
)
EXCEPT
(
SELECT
A.TABLE_NAME,
A.COLUMN_NAME
FROM
USER_CONS_COLUMNS A
INNER JOIN USER_CONSTRAINTS B
ON
A.CONSTRAINT_NAME=B.CONSTRAINT_NAME
WHERE
B.CONSTRAINT_TYPE='P'
AND B.OWNER ='SYSDBA'
)
) ;
9、附錄
9.1、總結
9.2、還原時使用不同條件的測試情況
--表結構還原
STRUCT:主鍵,主鍵列的not null,唯一限制,系統定義的索引都被删除,但檢查限制還在
STRUCT WITHOUT INDEX:在STRUCT相同
STRUCT WITHOUT CONSTRAINT:在STRUCT基礎上,删除了檢查限制l
STRUCT WITHOUT INDEX WITHOUT CONSTRAINT:與STRUCT WITHOUT CONSTRAINT相同
--表還原
STRUCT + RESTORE:其他列的not null丢失,索引所處的表空間錯誤
STRUCT + RESTORE WITHOUT INDEX:其他列的not null丢失,索引沒有重建,可手動重建(如果沒有not null的列,推薦的方式)
STRUCT + RESTORE WITHOUT CONSTRAINT:表還原報錯[-8327]:還原表中存在二級索引或備援限制.
STRUCT + RESTORE WITHOUT INDEX WITHOUT CONSTRAINT:表還原報錯[-8327]:還原表中存在二級索引或備援限制.
STRUCT WITHOUT INDEX + RESTORE四種情況與以上一樣
STRUCT WITHOUT CONSTRAINT + RESTORE:其他列的not null丢失,索引所處的表空間錯誤
STRUCT WITHOUT CONSTRAINT + RESTORE WITHOUT INDEX:其他列的not null丢失,索引沒有重建,可手動重建
STRUCT WITHOUT CONSTRAINT + RESTORE WITHOUT CONSTRAINT:所有限制,所有列上的not null,系統定義索引全部删除
STRUCT WITHOUT CONSTRAINT + RESTORE WITHOUT INDEX WITHOUT CONSTRAINT:所有限制,索引,所有列上的not null全部删除
STRUCT WITHOUT INDEX WITHOUT CONSTRAINT + RESTORE四種情況與以上一樣