1. 程式人生 > >oracle數據泵導入導出數據

oracle數據泵導入導出數據

直接 div alter 結構 true 導出導入 sts nec gather

數據泵是10g推出的功能,個人倒數據比較喜歡用數據泵。

其導入的時候利用remap參數很方便轉換表空間以及schema,並且可以忽略服務端與客戶端字符集問題(exp/imp需要排查字符集)。

數據泵也有不方便的地方,如果遠程導出導入,必須安裝數據庫服務端(client不行);需要在數據庫中創建一個路徑directory(dba_directories);並且主流工具支持exp/imp的導入導出(plsql developer),所以發現數據泵流行程度沒有想象中高。

以下簡單介紹schema的導入導出

以schema方式導出生產庫用戶下所有對象,並導入測試庫。

註:eamdb為生產庫,eamprd為生產庫用戶,密碼為eamprd

eamuat為測試庫,eamprduat為測試庫用戶,密碼為eamprduat

一、生產庫的導出(以sqlplus命令行的方式)。

1.以sys或者system用戶身份登錄生產數據庫。

2.創建schema導出路徑(DUMP_DIR名稱可替換),並在dba_directories中查看

create directory DUMP_DIR as ‘/xxx/xxx’;
select * from dba_directories;

3.把導出路徑與導出權限授權給eamprd,如果用system等高級帳號導出,則不用。

grant read,write on directory DUMP_DIR to eamprd;
grant exp_full_database to eamprd;

4.退出sqlplus,在oracle系統用戶下運行,導出對應的SCHEMA,推薦第二種。

expdp eamprd/eamprd@eamdb DIRECTORY=DUMP_DIR DUMPFILE=eamdb.dmp
expdp system/xxxx@eamdb directory=dump_dir dumpfile=eamdb.dmp schemas=eamprd

導出重點參數:

版本:高往低需加version=xx.x 導出某些張表tables=xxxx content=metadata_only(只要結構) content=data_only(只要數據)

5.把eamdb.dmp拷貝到測試庫。

二、測試庫的導入

1.以sys或者system身份登陸測試庫。

2.建立導入表空間和臨時表空間(名稱、路徑、表空間大小,請自行替換)。

create tablespace tbs_EAMUAT datafile ‘/xxxx/xxxxx/EAMUAT.DBF‘ size 10240M autoextend on next 1024M maxsize 20480M;
create temporary tablespace EAMUAT_TEMP tempfile ‘/xxx/xxx/EAMUAT_TEMP.DBF‘ size 5120M;

3.建立用戶及賦予權限(也可以不建立用戶),導入時最好給予用戶dba權限,以防導入時創建某些對象權限不夠,註意需要回收其對users表空間的權限。

create user eamprduat identified by eamprduat default tablespace tbs_EAMUAT temporary tablespace EAMUAT_TEMP;
grant connect,resource,create view,create session,dba to eamprduat;
revoke unlimited tablespace from eamprduat;
alter user eamprduat quota unlimited on tbs_EAMUAT;

4.建立導入路徑(把eamdb.dmp放在此路徑下),並授權。

create directory DUMP_DIR as ‘/xxxxx/xxxxx‘;
grant read,write on directory DUMP_DIR to eamprduat;

5.導入數據(在oracle系統用戶下運行),註意remap_schema參數,請自行替換

impdp eamprduat/eamprduat@eamuat DIRECTORY=DUMP_DIR DUMPFILE=eamdb.dmp LOGFILE=impdp.log remap_schema=eamprd:eamprduat;

導入重點參數:

remap_schema=eamprd:eamprduat,eamxxx:xxx,xxx:xxx

remap_tablespace=eamdev:eamxxx,eamxxx:xxx,xxx:xxx

table_exists_action=replace(替換)append(追加)

exclude=table_statistics 此參數是取消對表的統計信息收集,如果表太多,不取消的話特別慢,之後可以手動收集,或等oracle自動收集。

execute dbms_stats.gather_table_stats(ownname=>‘USERNAME‘,tabname=>‘TABLE_NAME‘,cascade=>TRUE)

如導入報錯:ORA-31684: Object type USER:"xxxxx" already exists,不用理會,因為之前建立了用戶。

也可以在導入的語句中直接remap一個不存在的用戶,會自動生成,其密碼和權限與導出時候一樣,但其表空間如果不想用users,必須手工創建。

oracle數據泵導入導出數據