達夢數據庫的備份也分為物理備份和邏輯備份。邏輯備份通過expdb和impdb實現,有意思的是,這兩個工具的名稱與Oracle10g推出的數據庫expdp/impdp很接近,不過在語法和功能上與Oracle數據庫exp/imp更加類似。導出工具expdb支持兩種模式,一種與Oracle的exp兼容,另一種兼容達夢早起版本的語法,其中前一種提供的功能更強大,因此這里只描述和exp兼容的模式。
C:/dmdbms/bin>expdb userid=test/testtest file=e:/dmdbms/backup/t.dmp log=e:/dmdbms/backup/t.log tables=t
login success
即將導出指定的表通過常規路徑 ...
. . 正在導出表 "test"."test"."T" 4 行被導出
****************** total ***********************
0 databases output...
0 schemas output...
1 tables output...
0 indexes output...
0 triggers output...
0 views output...
0 stored procedures output...
0 sequences output...
0 roles output...
0 dblinks output...
0 synonyms output...
********************* end **********************
成功終止導出, 沒有出現警告。語法完全和Oracle的exp一致,不用過多的解釋,不過也有一些不方便的地方。比如userid不能省略;比如不提供密碼不會以隱藏方式提示輸入,而是直接保存;再比如userid、file和log參數都是必選參數,不能忽略使用默認值。下面看看導出整個TEST用戶和導出TEST數據庫:
C:/dmdbms/bin>expdb userid=test/testtest file=e:/dmdbms/backup/full.dmp log=e:/dmdbms/backup/full.log full=y
login success
即將導出指定的表通過常規路徑 ...
. . 正在導出表 "test"."test"."t_num" 0 行
. . 正在導出表 "test"."test"."T_PART_COL" 0 行
. . 正在導出表 "test"."test"."T_PART_RANGE" 0 行
. . 正在導出表 "test"."test"."T_PART_HASH" 0 行
. . 正在導出表 "test"."test"."T_RECORD" 1000000 行被導出
. . 正在導出表 "test"."test"."t" 4 行被導出
4 procedures output...
****************** total ***********************
1 databases output...
2 schemas output...
6 tables output...
22 indexes output...
0 triggers output...
0 views output...
4 stored procedures output...
1 sequences output...
0 roles output...
0 dblinks output...
2 synonyms output...
********************* end **********************
成功終止導出, 沒有出現警告。
C:/dmdbms/bin>expdb userid=test/testtest file=e:/dmdbms/backup/test.dmp log=e:/dmdbms/backup/test.log owner=test
login success
即將導出指定的表通過常規路徑 ...
. . 正在導出表 "test"."test"."t_num" 0 行
. . 正在導出表 "test"."test"."T_PART_COL" 0 行
. . 正在導出表 "test"."test"."T_PART_RANGE" 0 行
. . 正在導出表 "test"."test"."T_PART_HASH" 0 行
. . 正在導出表 "test"."test"."T_RECORD" 1000000 行被導出
. . 正在導出表 "test"."test"."t" 4 行被導出
4 procedures output...
****************** total ***********************
0 databases output...
1 schemas output...
6 tables output...
22 indexes output...
0 triggers output...
0 views output...
4 stored procedures output...
1 sequences output...
0 roles output...
0 dblinks output...
2 synonyms output...
********************* end **********************
成功終止導出, 沒有出現警告。除了上面介紹的這幾個例子,expdb還支持絕大部分exp的參數。可能是與達夢數據庫的內存管理機制有關,expdb不支持buffer和recordlength等與客戶端分配內存有關的參數。下面再看看導入工具,和expdb一樣,impdb也支持兩種模式,一種是Oracle的imp兼容模式,另一種是與老版本兼容的模式,推薦使用功能更強的第一種模式。
C:/dmdbms/bin>impdb userid=test/testtest file=e:/dmdbms/backup/test.dmp log=e:/dmdbms/backup/t.log tables=t ignore=y
impdb version: 0X1000101
login success
表 t 已經存在
. . 正在導入表 test.test.t
4行被導入
Error Code -2352: 無效的同義詞名 'S_T'
CREATE SYNONYM "S_T" FOR "test"."T"
Error Code -2352: 無效的同義詞名 'S_TEST'
CREATE SYNONYM "S_TEST" FOR "test"."F_TAX"
****************** total ***********************
0 databases input...
1 schemas input...
0 tables input...
0 indexes input...
0 triggers input...
0 views input...
0 stored procedures input...
0 sequences input...
0 roles input...
0 dblinks input...
0 synonyms input...
********************* end **********************
成功終止導入, 但出現警告。可以看到,雖然和Oracle的imp命令兼容,但是處理方式還是有所區別的。再導入的時候選擇的是全用戶導出的dmp文件,不過導入的時候明確指定了導入表T,impdb在導入過程中,確實過濾了表,只導入T表的數據,但是用戶中的其他對象,比如同義詞被再次導入。這一點應該算是個小bug吧。最后看一個FROMUSER/TOUSER的導入:
C:/dmdbms/bin>impdb userid=test/testtest file=e:/dmdbms/backup/test.dmp log=e:/dmdbms/backup/abc.log fromuser=test touser=abc
impdb version: 0X1000101
login success
Error Code -1970: 授權者沒有此授權權限
GRANT "DBA" TO "test";
Error Code -1970: 授權者沒有此授權權限
GRANT "PUBLIC" TO "test";
.. 正在導入表 test.ABC.t_num 0行被導入
.. 正在導入表 test.ABC.T_PART_COL 0行被導入
.. 正在導入表 test.ABC.T_PART_RANGE 0行被導入
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555518" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555519" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555520" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555521" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
Error Code -1461: 表 'T_PART_RANGE' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555522" ON
"T_PART_RANGE" ("CREATE_DATE" ASC);
.. 正在導入表 test.ABC.T_PART_HASH 0行被導入
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555523" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555524" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555525" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555526" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555527" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555528" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555529" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555530" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555531" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555532" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555533" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555534" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555535" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555536" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555537" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555538" ON
"T_PART_HASH" ("ID" ASC);
Error Code -1461: 表 'T_PART_HASH' 上已存在CLUSTER索引
CREATE SCHEMA "ABC" AUTHORIZATION "ABC" CREATE CLUSTER INDEX "INDEX33555539" ON
"T_PART_HASH" ("ID" ASC);
. . 正在導入表 test.ABC.T_RECORD
1000000行被導入
. . 正在導入表 test.ABC.t
4行被導入
Error Code -2352: 無效的同義詞名 'S_T'
CREATE SYNONYM "S_T" FOR "test"."T"
Error Code -2352: 無效的同義詞名 'S_TEST'
CREATE SYNONYM "S_TEST" FOR "test"."F_TAX"
****************** total ***********************
0 databases input...
1 schemas input...
6 tables input...
0 indexes input...
0 triggers input...
0 views input...
4 stored procedures input...
1 sequences input...
0 roles input...
0 dblinks input...
0 synonyms input...
********************* end **********************
成功終止導入, 但出現警告。可以看到,大部分對象處理都沒有問題,但是對于分區表而言,雖然表導入了,但是建立索引的時候出現了很多錯誤,這說明導入工具處理分區表還存在bug。不過總的來說,expdb和impdb對于exp/imp工具的兼容性還是非常不錯的,對于一個沒有多少達夢數據庫經驗的人,只要對Oracle的exp/imp熟悉,就可以很快上手進行操作了。
新聞熱點
疑難解答