邏輯導入導出exp/imp與數據泵expdp/impdp


傳統的導入導出exp/imp

1.概述:

傳統的導出導入程序指的是exp/imp,用於實施數據庫的邏輯備份和恢復。

導出程序exp將數據庫中對象的定義和數據備份到一個操作系統二進制文件中。

導入程序imp讀取二進制導出文件並將對象定義和數據載入數據庫中

2.

導出和導入數據庫對象的四種模式是:

1,數據庫模式:導出和導入整個數據庫中的所有對象

2,表空間模式:導出和導入一個或多個指定的表空間中的所有對象,10g新增添可傳輸表空間。

3,用戶模式:導出和導入一個用戶模式中的所有對象

4,表模式:導出和導入一個或多個指定的表或表分區

實驗:

1>scott表的導入導出自己的表

SYS@ PROD>conn scott/tiger
Connected.
SCOTT@ PROD>create table emp1 as select * from emp;

Table created.

SCOTT@ PROD>create table dept1 as select * from dept;

Table created.

quit

drop table dept1 purge;

drop table emp1 purge;

exp scott/tiger file=/home/oracle/backup/empdept1.dmp tables="(emp1,dept1)";

當在tables后面不加雙引號時會報錯:

-bash: syntax error near unexpected token `('

SQL> drop table emp1 purge;

SQL> drop table dept1 purge;

imp scott/tiger file=/home/oracle/backup/empdept1.dmp

查看數據驗證

2>sys導出scott表

exp \'sys/system as sysdba\' file=/home/oracle/backup/sysscott.dmp tables="(scott.emp1,scott.dept1)";

drop table dept1 purge;

drop table emp1 purge;

imp \'sys/system as sysdba\' file=/home/oracle/backup/sysscott.dmp fromuser=scott;

3>導入導出用戶

exp test/test file=/home/oracle/backup/test.dmp owner=test;

drop user test cascade;

grant connect,resource to test identified by test;

grant dba to test;

imp test/test file=/home/oracle/backup/test.dmp full=y;

如果用sys來完成也可以使用如下命令:

imp 'sys/system@prod as sysdba' file=/home/oracle/backup/scott.dmp fromuser=scott touser=scott

sys用戶也可以將導出的scott的內容導入給其他用戶

imp 'sys/system@prod as sysdba' file=/home/oracle/backup/scott.dmp fromuser=scott touser=tim

4>導入導出表空間


SYS@ PROD>create tablespace tb1 datafile '/u01/app/oracle/oradata/PROD/mytb1.dbf' size 5M;

scott用戶下:

create table t1(year number(4),month number(2),amount number(2,1)) tablespace tb1;

insert into t1 values(1991,1,1.1);

insert into t1 values(1991,2,1.2);

insert into t1 values(1991,3,1.3);

insert into t1 values(1991,4,1.4);

commit;

alter tablespace tb1 read only;

exp \'/ as sysdba\' tablespaces=tb1 transport_tablespace=y file=/home/oracle/backup/exp_tb1.dmp;

將數據文件/u01/app/oracle/oradata/PROD/mytb1.dbf和/u01/app/oracle/oradata/PROD/mytb1.dbf復制到另一台設備進行導入,這也是遠程導入導出

imp userid=\'/ as sysdba\' tablespaces=tb1 transport_tablespace=y file=/home/oracle/backup/exp_tb1.dmp datafiles=/u01/app/oracle/oradata/PROD/mytb1.dbf;

驗證在這台設備有沒有T1。

SQL>select tablespace_name,status from dba_tablespaces;

SQL>select * from scott.t1;

重設回讀寫方式

SQL>alter tablespace tb1 read write;

5>

什么叫自包含:

當前表空間中的對象不依賴該表空間之外的對象。

例如:有TEST表空間,里面有個表叫T1,如果在T1上建個索引叫T1_idx,而這個索引建在USERS表空間上,由於T1_idx索引是依賴T1表的,

那么,TEST表空間是自包含的,可以遷移,但會甩掉T1_idx索引,USERS表空間不是自包含的,不符合遷移條件。

檢查表空間是否自包含可以使用程序包

如上面的例子

SQL> execute dbms_tts.transport_set_check('USERS');

SQL> select * from TRANSPORT_SET_VIOLATIONS;

VIOLATIONS

------------------------------------------------------------------------------------------------------------------------

ORA-39907: 索引 SCOTT.EMP1_IDX (在表空間 TEST 中) 指向表 SCOTT.EMP1 (在表空間 USERS 中)。

6>導出整個數據庫

exp 'sys/system@prod as sysdba' file=/home/oracle/backup/full.dmp full=y

 

補充1:使用Query選項選擇性導出數據

exp n1/n1 file=query_bak.dmp query=\"where object_type=\'TABLE\'\" tables=test

補充2:可以得到DDL語句

exp n1/n1 rows=n compress=n tables=test file=test.dmp log=exp_test.log buffer=10240000

imp n1/n1 rows=n full=y ignore=y show=y file=test.dmp log=imp_test.log buffer=10240000

rows  導出的數據行

compress  是否壓縮導出的文件

log  屏幕輸出的日志文件

ignore  忽略創建錯誤

buffer  數據緩沖區大小

 


 

數據泵expdp/impdp

數據泵優點:

1)改進性能(較傳統的exp/imp速度提高1-2個數量級)

2)重啟作業能力

3)並行執行能力

4)關聯運行作業能力

5)估算空間需求能力

6)操作網絡方式

 

mkdir -p /home/oracle/dp_dump
chmod 777 /home/oracle/dp_dump

sqlplus / as sysdba
create directory dump_dir as '/home/oracle/dp_dump';
grant read,write on directory dump_dir to scott;

1>導出用戶users

expdp scott/tiger dumpfile=scott.dmp directory=dump_dir schemas=scott;

導入到同用戶下面

impdp scott/scott directory=dump_dir dumpfile=scott.dmp schemas=scott;
導入到指定用戶下test下
impdp test/test directory=dump_dir dumpfile=scott.dmp remap_schema=scott:test;

比如是自己的創建的用戶不是系統scott用戶的話,在導出的時候可能會報錯說此用戶已存在,這是在語句后面加exclude=user即可。

注意:解決10g IMPDP導入JOB失敗的方法,事先創建用戶,賦予imp_full_database權限:grant imp_full_database to test;

2>導出tables

expdp scott/scott dumpfile=emp1.dmp directory=dump_dir tables=scott.emp1;

從一個用戶導出的表導入到不同用戶下
impdp test/test dumpfile=emp1.dmp directory=dump_dir tables=scott.emp1 remap_schema=scott:test;

3>通過query查詢條件導出

expdp scott/tiger dumpfile=test_query.dmp directory=dump_dir tables=scott.emp query='" where rownum  < 5"';

4>將tablespaces導出
expdp \'sys/oracle as sysdba\' dumpfile=users.dmp directory=dump_dir tablespaces=users,system;

5>將數據庫導出

expdp system/oracle dumpfile=full.dmp directory=dump_dir full=y;
expdp \'sys/oracle as sysdba\' dumpfile=dump_dir:full.dmp full=y;

6>

導出dblink
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:db_link.dmp full=y include=db_link

job
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:job.dmp full=y include=job

存儲過程
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:procedure.dmp full=y include=procedure

視圖
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:view.dmp full=y include=view

導出物化視圖
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:mview.dmp full=y include=materialized_view

expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:package.dmp full=y include=package

觸發器
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:trigger.dmp full=y include=trigger

序列
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:sequence.dmp full=y include=sequence

索引
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:index.dmp full=y include=index

約束
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:constraint.dmp full=y include=constraint

函數
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:function.dmp full=y include=function

同義詞
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:synonym.dmp full=y include=synonym

導出權限
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:grant.dmp full=y include=grant

導出以上所有對象
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:object.dmp full=y include=function,package,view,sequence,trigger,index,constraint,procedure,job,db_link

導出固定的兩張表
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:emp_dept.dmp schemas=scott include=table:\"IN \(\'EMP\',\'DEPT\'\)\"

不導出這兩張表
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:par_scott.dmp schemas=scott exclude=table:\"IN \(\'EMP\',\'DEPT\'\)\"

導出全庫數據以外的所有對象定義
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:full_structure.dmp full=y content=metadata_only

只導出數據
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:full_structure.dmp full=y content=data_only

4路並行導出
expdp \'sys/oracle as sysdba\' dumpfile=dumpdir:full_structure_%U.dmp full=y content=metadata_only parallel=4 filesize=30m

排除導出
expdp \'/ as sysdba\' dumpfile=dump_dir:full.dmp exclude=audit,tablespace,profile,sys_user,role,grant,resource_cost,trusted_db_link,directory,context,system_procobjact,schema reuse_dumpfiles=y full=y

7>遠程導入導出(從一台設備到另一台設備上)

 192.168.3.88這台設備作為源端:

mkdir -p /home/oracle/dp_dump
chmod 777 /home/oracle/dp_dump

sqlplus / as sysdba
create directory dump_dir as '/home/oracle/dp_dump';
grant read,write on directory dump_dir to scott;

expdp scott/tiger dumpfile=scott.dmp directory=dump_dir schemas=scott;

192.168.3.99這台設備作為目標端

mkdir -p /home/oracle/dp_dump
chmod 777 /home/oracle/dp_dump

sqlplus / as sysdba
create directory dump_dir as '/home/oracle/dp_dump';
grant read,write on directory dump_dir to public;

創建遠程連接

相關的查詢字典:dba_db_links

create public database link test_link connect to scott identified by tiger using '(DESCRIPTION =(ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.88)(PORT = 1521)))(CONNECT_DATA =(SERVICE_NAME = prod)))';

注:using后面是tns服務名也可指定服務名的內容像我寫的一樣。

impdp test1/test directory=dump_dir schemas=scott network_link=test_link remap_schema=scott:test1 exclude=user;

注:其中test1是我自己創建的用戶,要把88端的scott用戶下的表遠程導入到99端test1用戶下。

配置完以后可以用sqlplus sys/oracle@網絡服務名(源端):1521/實例名試連一下源端,如果失敗,把using配置的這個tns復制配置到99上即可。

完,驗證成功。

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

exp/imp使用常見的問題

1.在用exp導出報錯是:EXP-00091:Exporting questionable statistics

解決思路:

首先用過查詢字符集來判斷是否和客戶端有差異。

SYS@ PROD>select * from v$nls_parameters where parameter='NLS_CHARACTERSET';

PARAMETER                  VALUE
-------------------------------- --------------------------------------------------
NLS_CHARACTERSET AL32UTF8

然后再操作系統層面上查看$NLS_LANG的設置如下:一般來說結果要么沒有設置,要么就是設置有問題。

echo $NLS_LANG

export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

再次運行導出語句成功

exp n1/n1 tables=t file=t.dmp rows=n

那么要是在有警告的情況下能否導入。

這就要在導入的例如test0用戶下創建一個和導出的表的表結構一樣的一張表,然后

imp test0/oracle file=t.dmp tables=t statistics=always;

發現導入成功。

2.IMP-00013的問題更改dba,和imp_full_database權限即可,不建議更改dba權限。

3.有時用strace exp...可以查看追蹤哪里出錯

 

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

得到一個dump怎么查看里面有哪些表,可以使用strings,awk,sed結合

strings test.dmp |grep "create table  "|awk '{print $3}'|sed 's/"//g'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM