程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle數據庫備份與恢復(1):exp和imp

Oracle數據庫備份與恢復(1):exp和imp

編輯:Oracle數據庫基礎

一、基本命令

1、 獲取幫助

$ exp help=y

$ imp help=y

2、三種工作方式

(1)交互式方式

$ exp // 然後按提示輸入所需要的參數

(2)命令行方式

$ exp user/pwd@dbname file=/Oracle/test.dmp full=y // 命令行中輸入所需的參數

(3)參數文件方式

$ exp parfile=username.par // 在參數文件中輸入所需的參數

參數文件 username.par 內容 userid=username/userpassWord buffer=8192000

compress=n grants=y

file=/Oracle/test.dmp full=y

3、三種模式

(1)表方式,將指定表的數據導出/導入。

導出:導出一張或幾張表:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,table2

導出某張表的部分數據

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1 query=\“where col1=\‘…\’and col2 \<…\”

導入:導入一張或幾張表

$ imp user/pwd file=/dir/xxx.dmp log=xxx.log tables=table1,

table2 fromuser=dbuser touser=dbuser2 commit=y ignore=y

(2)用戶方式,將指定用戶的所有對象及數據導出/導入。

導出:$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=(xx, yy)

只導出數據對象,不導出數據 (rows=n )

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log owner=user rows=n

導入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2

commit=y ignore=y

(3)全庫方式,將數據庫中的所有對象導出/導入導出:

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log full=ycommit=y ignore=y

導入:$ imp user/pwd file=/dir/xxx.dmp log=xxx.log fromuser=dbuser touser=dbuser2 

二、高級選項

1、分割成多個文件

以多個固定大小文件方式導出:這種做法通常用在表數據量較大,單個 dump文件可能會超出文件系統的限制的情況

$ exp user/pwd file=1.dmp,2.dmp,3.dmp,…filesize=1000m log=xxx.log full=y

以多個固定大小文件方式導入

$ imp user/pwd file=1.dmp,2.dmp,3.dmp,… filesize=1000m

tables=xxx fromuser=dbuser touser=dbuser2 commit=y ignore=y

2、增量導出/導入

// Oracle 9i 以後 exp 不再支持 inctype

必須為 SYS 或 SYSTEM 才可執行增量導出導入

增量導出: 包括三個類型:

(1)“完全”增量導出(Complete) // 備份整個數據庫

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=complete

(2)“增量型”增量導出 導出上一次備份後改變的數據。

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=incremental

(3) “累計型”增量導出(Cumulative)只導出自上次“完全”導出之後數據庫中變化 了的信息。

$ exp user/pwd file=/dir/xxx.dmp log=xxx.log inctype=cumulative

增量導入:$ imp usr/pwd FULL=y inctype=system/restore/inct ype

其中:

SYSTEM: 導入系統對象

RESTORE: 導入所有用戶對象

3、以SYSDBA進行導出/導入

(1)用於 Oracle 技術支持

(2)用於表空間傳輸

例:$ imp \'usr/pwd@instance as sysdba\' tablespaces=xx transport_tablespace=y file=xxx.dmp datafiles=xxx.dbf $ imp file=expdat.dmp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y“datafile=(c:tempapp_data,c:tempapp_index)”

4、表空間傳輸 (速度快)

表空間傳輸是8i 新增加的一種快速在數據庫間移動數據的一種辦法,是把一個數據庫上的格式數據文件附加到另外一個數據庫中,而不是把數據導出成 dmp 文件,這 在有些時候是非常管用的,因為傳輸表空間移動數據就象復制文件一樣快。

(1)關於傳輸表空間有一些規則 (10g前):

源數據庫和目標數據庫必須運行在相同的硬件平台上

源數據庫與目標數據庫必須使用相同的字符集

源數據庫與目標數據庫一定要有相同大小的數據塊

目標數據庫不能有與遷移表空間同名的表空間

SYS 的對象不能遷移

必須傳輸自包含的對象集

有一些對象,如物化視圖,基於函數的索引等不能被傳輸(同字節序文件的跨平台可以用更換數據文件的文件頭的方法)

(10g 支持跨平台的表空間傳輸,只要操作系統字節順序相同,就可以進行表空間 傳輸。需要使用 RMAN轉換文件格式,略)

(2)檢測一個表空間是否符合傳輸標准的方法:

SQL > exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true); SQL > select * from sys.transport_set_violations;

如果沒有行選擇,表示該表空間只包含表數據,並且是自包含的。對於有些非自包含的表空間,如數據表空間和索引表空間,可以一起傳輸。

(3)簡要使用步驟:

如果想參考詳細使用方法,也可以參考 Oracle聯機幫助。

1).設置表空間為只讀(假定表空間名字為 APP_Data 和 APP_Index)

SQL > alter tablespace app_data read only; SQL > alter tablespace app_index read only;

2).發出 EXP命令

SQL> host exp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y tablespaces=(app_data, app_index)

以上需要注意的是。為了在 SQL 中執行 EXP,USERID 必須用三個引號,在 UNIX中也必須注意 避免“/”的使用。在 816和以後,必須使用 sysdba才能操作。這個命令在 SQL中必須放置在一行(這裡是因為顯示問題放在了兩行)

3).拷貝。dbf數據文件(以及。dmp文件)到另一個地點,即目標數據庫可以是 cp(unix)或 cop y(Windows)或通過 FTP傳輸文件(一定要在 bin方式)

4).把本地的表空間設置為讀寫

$ alter tablespace app_data read write;

$ alter tablespace app_index read write;

5).在目標數據庫附加該數據文件 (直接指定數據文件名)

(表空間不能存在,必須建立相應用戶名或者用 fromuser/touser)

$ imp file=expdat.dmp userid=“”“sys/passWord as sysdba”“” transport_tablespace=y datafiles=(“c:\app_data.dbf,c:\app_index.dbf”) tablespaces=app_data,app_index tts_owners=hr,oe

6).設置目標數據庫表空間為讀寫

$ alter tablespace app_data read write;

$ alter tablespace app_index read write; 

三、優化

1、加快exp速度

加大large_pool_size,可以提高 exp的速度 采用直接路徑的方式(direct=y),數據不需要經過內存進行整合和檢查。 設置較大的 buffer,如果導出大對象,小buffer會失敗。

export文件不在Oracle使用的驅動器上,不要export到NFS文件系統。

UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能

2、加快imp速度

建立一個indexfile,在數據 import完成後在建立索引將import文件放在不同的驅動器上增加 DB_BLOCK_BUFFERS增加 LOG_BUFFER

用非歸檔方式運行 Oracle:ALTER DATABASE NOARCHIVELOG; 建立大的表空間和回滾段,OFFLINE其他回滾段,回滾段的大小為最大表的 1/2 使用 COMMIT=N

使用 ANALYZE=N

單用戶模式導入

UNIX環境:用管道模式直接導入導出來提高 imp/exp的性能

3、通過unix/Linux PIPE管道加快exp/imp速度

通過管道導出數據:

(1)通過 mknod -p 建立管道

$ mknod /home/exppipe p // 在目錄/home下建立一個管道 exppipe注意參數 p

(2)通過 exp和 gzip導出數據到建立的管道並壓縮

$ exp test/test file=/home/exppipe & gzip < /home/exppipe > exp.dmp.gz

$ exp test/test tables=bitmap file=/home/newsys/test.pipe & gzip < /home/newsys/test.pipe > bitmap.dmp.gz

(3)導出成功完成之後刪除建立的管道

$ rm -rf /home/exppipe

導出腳本:

###UNIX下 Oracle數據庫通過 PIPE管道進行備份

###### using "export" and "tar" command to bakup Oracle datebase #######

trap "" 1 #nohup

LOGFILE=/opt/bakup/log/bakup_ora.log

export LOGFILE

DUMPDIR=/archlog_node1

export DUMPDIR

exec >$LOGFILE 2>&1

echo

echo ' Begin at ' `date`

echo

# clear old result file

cd $DUMPDIR

if [ -f exp.dmp.Z ]

then echo "clear old result file"

rm exp.dmp.Z

fi

# make pipe

mkfifo exp.pipe

chmod a+rw exp.pipe

# gain the dmp.Z file

compress < exp.pipe > exp.dmp.Z &

su -u Oracle -c "exp userid=ll/ll file=$DUMPDIR/exp.pipe full=y buffer=20000000"

echo

echo ' exp end at '`date`

 echo

# rm pipe

rm exp.pipe

# tar the dmp.Z file to tape

mt -f /dev/rmt/0 rew

tar cvf /dev/rmt/0 exp.dmp.Z

echo

echo ' tar end at '`date`

echo

通過管道導入生成的文件:

(1)通過 mknod -p 建立管道

$ mknod /home/exppipe p

(2)導入生成的壓縮文件

$ imp test/test file=/home/exppipe fromuser=test touser=Macro & gunzip < exp.dmp.gz > /home/exppipe

(3)刪除管道

$ rm –fr /home/exppipe

(4)全庫導入的一般步驟

注意:在導出時,需要通過toad或其他工具提取源數據庫創建主鍵和索引的腳本

(1)先全庫加 rows=n 把結構導進去

$ imp system/manager file=exp.dmp log=imp.log full=y rows=n indexes=n

(2)使業務用戶的觸發器失效/刪除主鍵和唯一索引

spool drop_pk_u.sql

select 'alter table '||table_name||' drop constraint '||constraint_name||';'

from user_constraints

where constraint_type in ('P','U');

/

spool off

spool disable_trigger.sql

select 'alter trigger '||trigger_name||' disable;'

from user_triggers;

/

spool off

@drop_pk_u.sql

@disable_trigger.sql

(3)以 ignore=y全庫導入$ imp system/manager file=exp.dmp log=imp.log full=y ignore=y

(4)通過 toad或其他工具提取源數據庫創建主鍵和索引的腳本,在目標數據庫中創建主鍵和索引。使觸發器生效。 

四、常見問題

1、字符集問題

ORACLE多國語言設置是為了支持世界范圍的語言與字符集,一般對語言提示, 貨幣形式,排序方式和 CHAR,VARCHAR2,C LOB,LONG 字段的數據的顯示等有效。Oracle 的多國語言設置最主要的兩個特性就是國家語言設置與字符集設置,國家語 言設置決定了界面或提示使用的語言種類,字符集決定了數據庫保存與字符集有關數據(如文本)時候的編碼規則。

Oracle字符集設定,分為數據庫字符集和客戶端字符集環境設置。在數據庫端,

字符集在創建數據庫的時候設定,並保存在數據庫props$表中。

在客戶端的字符集環境比較簡單,主要就是環境變量或注冊表項 NLS_ LANG,注意 NLS_LANG的優先級別為:參數文件<注冊表<環境變量

使用一點點技巧,就可以使導出/導入在不同的字符集的數據庫上轉換數據。這裡需要一個2進制文件編輯工具即可,如 uedit32.用編輯方式打開導出的dmp文件,獲取 2 、3 字節 的內容 , 如 00 01 , 先把它轉換 為 10 進制數,為1 ,使用函數

NLS_CHARSET_NAME 即可獲得該字符集:

SQL> select nls_charset_name(1) from dual; NLS_CHARSET_NAME(1)

------------------- US7ASCII

可以知道該dmp文件的字符集為 US7ASCII,如果需要把該 dmp文件的字符集換成ZHS16GBK,則需要用 NLS_CHARSET_ID 獲取該字符集的編號: SQL> select nls_charset_id('zhs16gbk') from dual; NLS_CHARSET_ID('ZHS16GBK')

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

把852換成16進制數,為354,把 2、3字節的 00 01 換成03 54,即完成了把該 dmp文件字符集從us7ascii 到 zhs16gbk 的轉化,這樣,再把該dmp文件導入到 zhs16gbk 字符集的數據庫就可以了。

2、版本問題

Exp/Imp很多時候,可以跨版本使用,如在版本7與版本8之間導出導入數據,但這樣做必須選擇正確的版本,規則為:總是使用IMP的版本匹配數據庫的版本,如果要導入到 816,則使用816的導入工具。總是使用 EXP 的版本匹配兩個數據庫中低的那個版本,如在815與816之間互導,則使用815的EXP 工具。

imp和exp版本不能往上兼容: imp可以導入低版本exp生成的文件, 不能導入高版本exp生成的文件。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved