一、備份方式分類
邏輯備份提取數據庫的數據內容,而不是備份數據塊;物理備份是拷貝整個的數據文件。
二、備份策略
三、邏輯備份與恢復
1、三種模式
a、用戶模式:導出用戶所有對象以及對象中的數據
b、表模式:導出用戶所有表或指定的表
c、整個數據庫:導出數據庫的所有對象
2、exp/imp和expdp/impdp的區別
a、imp只適用於exp導出的文件,不適用於expdp導出的文件;impdp只是用與expdp導出的文件,不適用於exp導出的文件。
b、exp和imp工具是傳統的導出和導入,在10g之前使用;10g后提供數據泵expdp和impdp工具
c、exp和imp是客戶端工具程序,既可以在客戶端也可以在服務器端使用(即電腦上有數據庫的服務器端,或者擁有遠程服務器的TNSNAME),效率低;expdp和impdp是服務端的工具程序,只能在服務端使用(電腦上要有數據庫的服務器端),效率高。
3、exp
查看相關參數講解
exp help=y
a、常用相關參數項
USERID --用戶名/口令 FULL --導出整個文件 BUFFER --數據緩沖區的大小 OWNER --導出指定的所有者用戶名列表 FILE --輸出文件 TABLE --導出指定的表名列表 GRANTS --導出權限 ROWS --導出數據行
LOG --屏幕輸出的日志文件
INDEXES --導出索引
INCTYPE --增量導入導出類型,有complete(默認,完全增量導出,全備)、cumulative(累積型增量導出,導出自上次完全增量導出后變化的數據)、incremental(增量型增量導出,導出上一次備份后變化的結果)三種
COMPRESS --是否壓縮導出的文件
FEEDBACK --顯示每x行的進度 TABLESPACES --導出指定的表空間列表
b、查詢可以導出的數據庫
select account_status,username from dba_users order by 1; --查看用戶狀態
--狀態是OPEN的用戶可以導出
這樣顯示不簡潔,可以通過SQL語句進行調整。
set linesize 300; --修改顯示列數,set這三個英文字符占了3列 set pagesize 100; --修改顯示行數
col col_name for a50;
--col_name列占50列,這里col_name=account_status或username,其中for相當於format
c、創建目錄
①首先在主機某目錄下創建一個實體文件夾(D盤下的expTest文件夾),用管理員身份登錄數據庫,創建邏輯目錄。
create directory expTest as 'D:\expTest';
--邏輯目錄是expTest,導出的文件存儲在D盤下的expTest目錄下
--如果沒有在主機下創建一個實體文件夾,會出現"exp-00028無法打開文件進行寫入"的警告,而且導出的文件也不知道在哪找
②查看管理員目錄
select * from dba_directories;
d、導出
(導入導出數據語句執行是在系統層面,而不是在數據庫層面)
①完全模式(整個數據庫)
EXP CMH/123456 FILE=D:\expTest\all.dmp log=D:\expTest\all.log FULL=Y; --EXP USERID FILE=LOCATION.DMP LOG=LOCATION.LOG FULL=Y --USERID=CMH/123456,CMH是用戶名,123456是密碼 --LOCATION.DMP=D:\expTest\all.dmp,LOCATION.LOG=D:\expTest\all.log,備份文件和日志保存在D盤expTest文件夾 --FULL=Y將整個數據庫全部導出,如果沒有full=y則將模式CMH下的所有數據庫對象
--(用戶與模式一一對應,用戶是用連接數據庫和訪問數據庫對象的,模式是管理對象的)
出現EXP-00091問題,導出成功終止,但出現警告。查詢相關解答之后發現是“字符集不匹配”的原因。
select * from nls_database_parameters; --查詢數據庫的字符集
--NLS_LANGUAGE指定服務器消息的語言,影響提示信息是中文還是英文
--NLS_TERRITORY指定服務器的日期和數字格式
--NLS_CHARACTERSET指定服務器的字符集 --也可用select * from v$nls_parameters;
查看主機環境變量的NLS_LANG。cmd輸入regedit,在HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\KEY_OraDb11g_home1
在命令窗口設置nls_lang與服務器保持一致,后導出成功且沒有警告
set nls_lang=american_america.al32utf8
--方法二:statistics=none顯示的不進行統計量導出;
--方法三:直接使用Data Pump工具
全導出出現EXP-00107錯誤原因:VirTual columns是ORACLE Database 11g開始支持的feature,傳統的exp和imp工具不支持
②用戶模式
EXP CMH/123456 FILE=D:\expTest\USER.DMP log=D:\expTest\user.log OWNER=(CMH,scott); --EXP USERID FILE=LOCATION.DMP LOG=LOCATION.LOG OWNER=(USER); --USERID=CMH/123456,CMH是用戶名,123456是密碼 --LOCATION.DMP=D:\expTest\USER.DMP,備份到D盤expTest文件夾下的USER.DMP文件 --OWNER=(CMH,scott);表示備份某用戶下的所有表
③表模式
EXP CMH/123456 FILE=D:\expTest\TABLES.DMP LOG=D:\expTest\table.log TABLES=(ACCU,ATEST); --EXP USERID FILE=LOCATION.DMP OWNER=(TABLE1,TABLE2); --USERID=CMH/123456,CMH是用戶名,123456是密碼 --LOCATION.DMP=D:\expTest\TABLES.DMP,備份到D盤expTest文件夾下的TABLES.DMP文件 --TABLES=(ACCU,ATEST);表示備份指定的ACCU\ATEST表
4、imp
查看相關參數項
imp help=y
a、常用相關參數項
USERID --用戶名/口令 FULL --導入整個文件 BUFFER --數據緩沖區大小 FILE --輸入文件
FROMUSER --導入某用戶下的數據
TOUSER --將FROMUSER用戶下的數據導到TOUSER用戶下 TABLES --需要導入的表名列表 COMMIT --提交數組插入 ROWS --導入數據行 LOG --屏幕輸出的日志文件
b、導入
imp cmh/123456 file=D:\expTest\all.dmp log=D:\expTest\imp-all.log full=y;
執行之后會出現錯誤IMP-00015:由於對象已存在,下列語句失敗
這是因為庫里面已經有該用戶和該表,導入不會覆蓋原來的對象,可以將用戶刪除之后再導入,但是full=y是全導入,刪除所有用戶很難實現,可以刪除某用戶之后再導入該用戶
drop user cmh cascade; --刪除用戶cmh create user cmh identified by 123456; --創建用戶cmh grant create session to cmh; --給用戶cmh授權create session權限
imp cmh/123456 file=D:\expTest\all.dmp log=D:\expTest\imp-all.log fromuser=cmh
--如果后面是用戶名就不要加上 ; 分號,否則會出現IMP-00034:警告:在導出文件中未找到 FromUser "CMH;"
導入特定用戶之后會出現IMP-00013: 只有 DBA 才能導入由其他 DBA 導出的文件
解決方法是grant dba to cmh
參考連接:完全備份、差異備份以及增量備份1