Oracle備份與恢復系列 五 邏輯匯入匯出

snowdba發表於2014-08-14
許多使用者現在依然使用邏輯備份匯入匯出來備份資料庫。並沒有使用RMAN物理備份。經常出現歸檔日誌佔滿磁碟空間的問題(既然採用邏輯備份也不知道這些歸檔日誌有什麼用)。我們希望使用者能啟用RMAN備份,將邏輯備份改為物理備份,但這些是商務的事情,不是單純的技術上的事了。

下面總結一下邏輯備份的知識點,以備不時之需。

當執行export/import應用程式時,有四種模式,分別代表提取或插入資料庫內容時所涉及的工作範圍:
  • 完整資料庫模式(Full database model):在匯出過程中,除了少數內容外,整個資料庫的內容都被寫入一個檔案中。某些使用者物件(SYS、ORDSYS、CTXSYS)並不被匯出。定義完整資料庫模式的匯出引數為FULL,匯入引數是FULL=Y。
  • 使用者模式(User model):在匯出過程中,屬於特定使用者的所有資料庫物件被寫到一個檔案中。可以用owner引數來指定這些使用者。屬於該使用者的所有表、索引、檢視、觸發器、同義詞、資料庫連結、物件、儲存過程等等,都被寫入到匯出檔案中。匯入過程中,在匯出檔案中屬於指定使用者的所有資料庫物件都在資料庫中建立。匯入使用者是在FROMUSER引數張定義的。
  • 表模式(Table model):在匯出過程中,單個表以及相關的物件(例如:索引、約束、觸發器、授權)被寫入到一個檔案中。每個表必須用TABLES引數命令。只有被授權的使用者才可以匯出屬於其他使用者的表。再匯入過程中,表從匯出檔案中被讀出,並建立在資料庫中。定義表模式的匯入引數也為TABLES。
  • 表空間模式(Tablespace mode):在匯出過程中,對應於所選表空間以及這些表空間中所包含的所有物件的“後設資料”被寫入一個檔案中。實際的表資料並不寫入匯出檔案中。生產的匯出檔案聯通表空間資料檔案一起從源資料庫傳送到目標資料庫。在匯入過程中,表空間和物件源資料被新增到目標資料庫上。
下面看看匯入匯出共用的一些重要引數
userid     執行匯入匯出程式的使用者提供的資料庫使用者名稱和密碼,例如userid=snow/snow as sysdba 或者userid=scott/tiger
file       將要建立的匯出檔案、或是將要匯入需要引用的檔案。該檔案預設生成路徑為當前執行匯入匯出的路徑下。
log        執行匯入匯出操作時候的螢幕輸出可以儲存在log中。該檔案預設生成路徑為當前執行匯入匯出的路徑下。
help       幫助檔案。輸入help=y可以獲取幫助資訊
tables     指定要匯入或者匯出的表名
fromuser   指定匯出檔案中包含的原物件擁有者
touser     指定建立和擁有匯入物件的新模式(schema)。例如我們可以匯出A的物件,匯入到B(schema)模式中。可以使用   FROMUSER=A TOUSER=B

概念性的東西就總結這些,接下來開始試驗環節

實驗一 互動式匯出完整的資料庫
[oracle@snow ~]$ exp

Export: Release 11.2.0.3.0 - Production on Sun Aug 10 23:25:40 2014

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.


Username: sys as sysdba   <==匯出所有物件需要dba的許可權,或者EXP_FULL_DATABASE
Password: 

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Enter array fetch buffer size: 4096 >  <==預設回車

Export file: expdat.dmp >      <==預設路徑為當前路徑/home/oracle

(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 1   <==完整資料庫

Export grants (yes/no): yes > yes   <==匯出所有物件的授權

Export table data (yes/no): yes > yes   <==匯出表資料

Compress extents (yes/no): yes > no  <==如果壓縮,在匯入時建立的物件建立命令會將所有的資料合併到一個廚師域中。如果不壓縮,物件將按照它們在匯出中已有的域設定被建立

Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8MSWIN1252 character set (possible charset conversion)

About to export the entire database ...
. exporting tablespace definitions
. exporting profiles
. exporting user definitions
. exporting roles
. exporting resource costs
. exporting rollback segment definitions
. exporting database links
. exporting sequence numbers
. exporting directory aliases
. exporting context namespaces
. exporting foreign function library names
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions
....

. exporting statistics
Export terminated successfully with warnings.

執行成功後看下生成的檔案,大小為141M
[oracle@snow ~]$ du -sh *
141M    expdat.dmp

檢視一下當前的segments大小為1553.5MB
SYS@ALEX >select sum(bytes/1024/1024) MB from dba_segments;

        MB
----------
    1553.5

檢視一下當前的資料檔案大小為1648.125MB
SYS@ALEX >select sum(bytes/1024/1024) MB from dba_data_files;

        MB
----------
  1648.125

除了上面的互動式邏輯備份命令,也可以使用一行命令來完成上面的操作:
注意sys賬號要加入 as sysdba,並且用\轉義符來修飾'
[oracle@snow ~]$  exp \'sys/oracle as sysdba\' file=/home/oracle/full.dmp full=y   


實驗二 透過引數檔案匯出完整的資料庫

新增一個引數檔案,輸入以下配置資訊
vi /home/oracle/export_full.par

#export the entire database
#rows = n: 只匯出物件定義,不到處資料
#buffer = 10000  : 提取緩衝區大小設定為10000位元組。該引數有助於大型匯出更快地執行
userid = "sys/oracle as sysdba"
file = /home/oracle/full_par.dmp
log = /home/oracle/full_par.loge
full = y
rows = n 
buffer = 10000  
compress = n

[oracle@snow ~]$ exp parfile=/home/oracle/export_full.par


實驗三 以直接模式匯出完整的資料庫
看到direct是不是想起了sqlloader的直接路徑載入了,沒錯在exp中定義direct=y可以直接從資料檔案中讀取,避開了資料庫緩衝池。在大型表上採用該引數是一個最佳化的手段。但是資料量小的狀態下並沒有什麼明顯的優勢。
vi /home/oracle/export_full_d.par

#export the entire database
userid = "sys/oracle as sysdba"
file = /home/oracle/full_direct.dmp
log = /home/oracle/full_direct.log
full = y
compress = n
direct = y

[oracle@snow ~]$ exp parfile=/home/oracle/export_full_d.par



實驗四 匯入整個資料庫用於顯示
如果只想到處檔案中包含表和索引定義,可以使indexfile引數。使用時將註釋##去掉就可以了

vi /home/oracle/import_full_dis.par
userid = "sys/oracle as sysdba"
file = /home/oracle/full.dmp
log = /home/oracle/full_dis.log
##indexfile= /home/oradata/full.idx
full = y
show = y

如果你也喜歡把secureCRT調成Traditional的那種綠色字型,輸入完下面的命令後就會想起電影《駭客帝國》


使用者模式的匯入/匯出
實驗五 替換並克隆使用者scott

1 使用dba匯出使用者scott
vi /home/oracle/export_user_scott.par
userid = "sys/oracle as sysdba"
file=/home/oracle/export_user_scott.dmp 
log=/home/oracle/export_user_scott.log 
owner = SCOTT

exp parfile=/home/oracle/export_user_scott.par

使用scott使用者匯出
vi /home/oracle/export_user_scott2.par
userid = "scott/tiger"
file=/home/oracle/export_user_scott2.dmp 
log=/home/oracle/export_user_scott2.log 

exp parfile=/home/oracle/export_user_scott2.par
或者
exp scott/tiger file=/home/oracle/export_user_scott.dmp log=/home/oracle/export_user_scott.log 

2 刪除使用者scott
select username from dba_users where username='SCOTT';
drop user scott cascade;
select username from dba_users where username='SCOTT';

3 匯入使用者scott
grant connect,resource to scott identified by tiger;
alter user scott default tablespace users temporary tablespace TEMP;

使用scott使用者
imp userid=scott/tiger file=/home/oracle/export_user_scott2.dmp
使用dba使用者
imp userid=\'sys/oracle as sysdba\' file=/home/oracle/export_user_scott.dmp

4 將scott使用者資料匯入使用者lily
只匯入結構,不匯入資料rows=n
conn / as sysdba
grant connect,resource to lily identified by kitty;
alter user lily default tablespace users temporary tablespace TEMP;

imp \'sys/oracle as sysdba\'  file=/home/oracle/export_user_scott.dmp fromuser=scott touser=lily rows=n;

檢視lily下的表結構和表資料
SYS@ALEX >conn lily/kitty                                                                                       
LILY@ALEX >select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BONUS                          TABLE
DEPT                           TABLE
EMP                            TABLE
SALGRADE                       TABLE

LILY@ALEX >select * from dept;
no rows selected  <==只匯入了結構,沒有資料

實驗六 匯出一個資料庫表

1 匯出表
我們將使用者SCOTT下的salgrade表匯出,並且新增query限制條件,只匯出grade>3的資料,總計2條。
vi /home/oracle/export_SALGRADE.par

USERID   = "sys/oracle as sysdba"
FILE     = /home/oracle/export_SALGRADE.dmp
LOG      = /home/oracle/export_SALGRADE.log
TABLES   = (SCOTT.SALGRADE)
QUERY    = "WHERE grade > 3"
COMPRESS = N

exp parfile=/home/oracle/export_SALGRADE.par

螢幕輸出如下:
Current user changed to SCOTT
. . exporting table                       SALGRADE          2 rows exported


2 刪除部分資料
delete from SALGRADE where grade > 3;

commit;

3 匯入表

vi /home/oracle/import_SALGRADE.par

USERID   = "sys/oracle as sysdba"
FILE     = /home/oracle/export_SALGRADE.par
TABLES   = (SCOTT.SALGRADE)

注意,需要用到/轉義‘ ( )
[oracle@snow ~]$ imp \'sys/oracle as sysdba\' file=/home/oracle/export_SALGRADE.dmp full=y ignore=y
或者
[oracle@snow ~]$ imp \'sys/oracle as sysdba\' file=/home/oracle/export_SALGRADE.dmp fromuser=scott touser=scott tables\(scott.salgrade\) ignore=y




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29047826/viewspace-1251305/,如需轉載,請註明出處,否則將追究法律責任。

相關文章