ORACLE備份和恢複有三種方式:
(1)資料泵(expdp/impdp)
(2)冷備份
(3)RMAN備份
就分類而言,(1)和(2)統有稱為“冷”備份,(3)稱為“熱”備份。
資料泵和冷備份隻能将資料庫還原到某個時間點上(就是備份的時間點),而RMAN備份在歸檔模式下,能夠實時備份,實時還原,幾乎可以做到資料無丢失,但對于資料倉庫而言,開歸檔是很可怕的事情,因為歸檔日志很大,當然如果有必要也是可以開啟的,需要做好ARCHIVELOG的備份和清理工作。
本文隻介紹冷備份,RMAN備份暫不介紹,如有需要,可GOOGLE搜尋三思筆記《一步一步學RMAN》備份文檔。
網址:http://www.itpub.net/thread-810100-1-1.html
資料泵備份方式是采用ORACLE自帶的EXPDP和IMPDP備份的方式。
LINUX和WINDOWS系統:
可通過“expdp -help”指令來檢視expdp指令選項
資料泵備份和還原的先決條件
(1)備份和還原路徑
(2)擁有EXPORT FULL DATABASE 和IMPORT FULL DATABASE權限
系統權限和角色:
SELECT * FROM Dba_Sys_Privs a WHERE a.Privilege LIKE '%EXP%' OR a.Privilege LIKE '%IMP%'; FROM Dba_Role_Privs a WHERE a.Granted_Role LIKE '%IMP%' OR a.Granted_Role LIKE '%EXP%';
1)檢查路徑是否存在 SELECT * FROM Dba_Directories; 2)建立備份和還原路徑 CREATE OR REPLACE DIRECTORY directory_name AS '具體絕對路徑'; 例如:CREATE OR REPLACE Directory BACKUP_PATH AS '/home/oracle/dbbackup'; --建立備份路徑 GRANT READ,WRITE ON DIRECTORY directory_name TO &user_name; 例如: Grant READ, WRITE ON Directory BACKUP_PATH TO Test; --将讀寫路徑的權限給某個使用者
授以某個使用者的備份和還原的權限: GRANT EXPORT FULL DATABASE,IMPORT FULL DATABASE TO test;
資料泵備份EXPDP指令,資料庫還原IMPDP指令,以下均采用并行的方式,PARALLEL參數取決于CPU與CPU的線程數,但這個值不建議太大。 <b>注意備份腳本應該放到同一行去執行,腳本中間不能有換行。</b>
注意需要補充tns_name參數,當然也可以使用system使用者。 另外,使用PARALLEL參數後,建議dumpfile使用%u選項,将一個dumpfile拆分成多個,否則,PARALLEL參數效果不明顯。
<b>(1</b><b>)對應備份腳本:</b> EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_FULL_20140526_%u.DMP SCHEMAS=TEST PARALLEL=8 LOGFILE=EXPDP_TEST_FULL_20140526.LOG
<b></b><b>(</b><b>2</b><b>)對應還原腳本:</b> IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_FULL_20140526_%u.DMP SCHEMAS=TEST PARALLEL=8 LOGFILE=IMPDP_TEST_FULL_20140526.LOG
1.3.2隻備份TEST使用者中繼資料 (1)對應備份腳本 EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_METADATA_ONLY_20140526.DMP CONTEXT=METADATA_ONLY PARALLEL=8 LOGFILE=EXPDP_TEST_METADATA_ONLY_20140526.LOG (2)對應還原腳本 IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_METADATA_ONLY_20140526.DMP CONTEXT=METADATA_ONLY PARALLEL=8 LOGFILE=IMPDP_TEST_METADATA_ONLY_20140526.LOG (3)備份SHELL腳本: #!/bin/sh expdp_date=`date +"%Y%m%d"`
expdp test/oracle directory=backup_path dumpfile=expdp_metadata_only_${expdp_date}.dmp schemas=test content=METADATA_ONLY logfile=expdp_metadata_only_${expdp_date}.log
1.3.3隻備份TEST使用者資料 EXPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_DATA_ONLY_20140526_%u.DMP CONTEXT=DATA_ONLY PARALLEL=8 LOGFILE=EXPDP_TEST_DATA_ONLY_20140526.LOG IMPDP test/oracle@tns_name DIRECTORY=BACKUP_PATH DUMPFILE=EXPDP_TEST_DATA_ONLY_20140526_%u.DMP CONTEXT=DATA_ONLY PARALLEL=8 LOGFILE=IMPDP_TEST_DATA_ONLY_20140526.LOG (3)備份SHELL腳本 expdp test/oracle directory=backup_path dumpfile=expdp_DATA_ONLY_${expdp_date}_%u.dmp schemas=test content=DATA_ONLY logfile=expdp_DATA_ONLY_${expdp_date}.log
用expdp/impdp備份和還原表資料,可使用tables或者是include指令選項。 UNIX下EXPDP備份是,單引号以及括号需要轉義,可以使用PARFILE選項。将指令寫在參數檔案系統裡。 如expdp_parfile.txt userid=test/oracle@tns_name directory=backup_path dumpfile=test_send_tables_20140526_%u.dmp parallel=8 tables =('TEST_DATA_1,'TEST_DATA_2','TEST_DATA_3'...) logfile=test_send_tables_20140526.log 調用方式: expdp parfile=expdp_parfile.txt
冷備份發生在資料庫已經正常關閉的情況下,當正常關閉時會提供給我們一個完整的資料庫。冷備份是将關鍵性檔案拷貝到另外的位置,可以根據重要性檔案克隆一份資料庫。
冷備份還原注意事項:
兩台資料庫伺服器的作業系統必須是同構的(即:aix->aix或者linux->linux),不能是異構的(linux->aix),否則是沒有用的。如果是異構的,那麼隻能采用資料泵的方式。
<b>冷備份的優點:</b>
(1)冷備模式下概念易于了解,即将需要備份的檔案複制到安全的位置
(2)容易恢複到某個時間點上(隻需将檔案再拷貝回去)
(3)能與歸檔方法相結合,做資料庫“最佳狀态”的恢複。
(4)低度維護,高度安全。
<b>冷備份的缺點:</b>
(1)單獨使用時,隻能提供到“某一時間點上”的恢複。
(2)再實施備份的全過程中,資料庫必須處于一緻性關閉狀态。
(3)若磁盤空間有限,隻能拷貝到錄音帶等其他外部儲存設備上,速度會很慢。另外備份的速度與網絡帶寬有關。
(4)不能按表或按使用者恢複。
冷備份中必須拷貝的檔案包括:
(1)所有資料檔案
(2)所有控制檔案
(3)所有聯機REDO LOG檔案
(4)Init.ora檔案(可選)
(5).profile或者.bash_profile(可選)
注意:冷備份必須在資料庫關閉的情況下進行,當資料庫處于打開狀态時,執行資料庫檔案系統備份是無效的。
冷備份要關閉資料庫,在關閉資料庫之前,先要備份控制檔案,接着記錄資料檔案、redo日志檔案和控制檔案的位置。
(1)備份控制檔案:
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/tmp/control.txt'
以上操作是将控制檔案的内容備份到/tmp/control.txt文本裡。目的在于重建控制檔案或者RENAME FILE使用。
(2)資料檔案位置
SELECT a.File_Name, a.Tablespace_Name, a.Bytes, a.Autoextensible,a.Online_Status
FROM Dba_Data_Files a
UNION
SELECT b.FILE_NAME,b.Tablespace_Name, b.Bytes, b.Autoextensible,b.STATUS
FROM Dba_Temp_Files b;
(3)redo日志檔案
SELECT * from v$logfile;
(4)控制檔案
SELECT * from v$controlfile;
(1)停監聽
1)ps -ef |grep pmon
2)lsnrctl stop
(2)關閉資料庫
SQL>shutdown immediate
LINUX上SCP指令:
usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i i dentity_file][-l limit] [-o ssh_option] [-P port] [-S program][[user@]host1:]file1 ... [[user@]host2:]file2
例如:将一台機器上expdp_20140521.log傳輸到另外一台機器的/home/oracle/backup目錄下,指令如下:
scp expdp_20140521.log [email protected]:/home/oracle/backup
SCP指令還可以複制檔案夾,-r選項,辨別遞歸的複制子檔案夾。
SCP指令支援正規表達式,如:*等模糊查詢操作。具體參考:man scp 幫助
SCP複制的速度與網絡帶寬有關,可以說絕大程度上取決于網絡帶寬。
建議:
在複制之前最好統計一下資料檔案和redo檔案的個數,并與資料庫中的資料進行比較。
腳本:
(1) ls *.dbf |wc –l
與dba_data_files和dba_temp_files比較
(2) ls *.log |wc –l
與v$logfile比較
(3) ls *.ctl |wc-l
與v$controlfile比較
如果目标庫與源庫的資料庫安裝路徑都相同的話,相對來說就簡單一些,可省略rename file操作,否則,可能需要rename file操作。 當然,如果你手工建立控制檔案的話,就不需要rename file操作。因為controlfile裡記錄了資料檔案和redo日志檔案的位置。
此操作的前提條件是:
(1)資料檔案路徑一緻
(2)資料庫的執行個體名稱一緻
(3)控制檔案的位置一緻
<b>操作步驟:</b>
(1)複制完成後,即可拉啟資料庫
SQL>STARTUP MOUNT;
SQL>ALTER DATABASE OPEN RESETLOGS;
如果以上操作順利結束,表明資料庫還原沒有問題,可以啟動資料庫監聽,連接配接資料庫即可。
啟動監聽:
1)ps -ef |grep pmon
2)lsnrctl start
如果資料檔案位置不一緻,那麼就需要手工建立controlfile檔案和rename資料檔案。
<b>原因:</b>
原控制檔案裡記錄的資料檔案的位置與目标庫資料檔案的位置不同,資料庫在mount階段開始讀controlfile裡的内容。mount階段找不到相應的資料檔案,在資料庫啟動過程中就會報錯,資料庫無法啟動。
手工建立控制檔案内容可以從我們之前備份的control.txt裡檢視具體資訊,手工建立控制檔案隻需要初始化資料庫執行個體名,redo日終和資料檔案以及資料庫的字元集即可。具體可參考以下樣例腳本。
控制檔案的主要内容(來自control.txt)大體如下:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "testdb" NORESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 54288
LOGFILE
GROUP 1 '/home/oracle/app/oradata/testdb/redo01.log' SIZE 128M BLOCKSIZE 512,
GROUP 2 '/home/oracle/app/oradata/testdb/redo02.log' SIZE 128M BLOCKSIZE 512,
GROUP 3 '/home/oracle/app/oradata/testdb/redo03.log' SIZE 128M BLOCKSIZE 512,
GROUP 4 '/home/oracle/app/oradata/testdb/redo04.log' SIZE 128M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
'/home/oracle/app/oradata/testdb/system01.dbf',
'/home/oracle/app/oradata/testdb/sysaux01.dbf',
'/home/oracle/app/oradata/testdb/undotbs01.dbf',
'/home/oracle/app/oradata/testdb/users01.dbf',
'/home/oracle/app/oradata/testdb/testdb01.dbf',
'/home/oracle/app/oradata/testdb/testdb02.dbf',
'/home/oracle/app/oradata/testdb/testdb03.dbf',
'/home/oracle/app/oradata/testdb/testdbindex.dbf',
'/home/oracle/app/oradata/testdb/undotbs02.dbf',
'/home/oracle/app/oradata/testdb/testdb04.dbf',
'/home/oracle/app/oradata/testdb/testdb05.dbf',
'/home/oracle/app/oradata/testdb/testdb06.dbf',
'/home/oracle/app/oradata/testdb/testdb07.dbf',
'/home/oracle/app/oradata/testdb/testdb08.dbf',
'/home/oracle/app/oradata/testdb/testdb09.dbf',
'/home/oracle/app/oradata/testdb/testdb10.dbf',
'/home/oracle/app/oradata/testdb/testdb11.dbf',
'/home/oracle/app/oradata/testdb/testdb12.dbf',
'/home/oracle/app/oradata/testdb/testdb13.dbf',
'/home/oracle/app/oradata/testdb/testdb14.dbf',
'/home/oracle/app/oradata/testdb/testdb15.dbf'
CHARACTER SET AL32UTF8;
注意手工建立控制檔案常見問題就是檔案格式問題。
(1)去掉-- STANDBY LOGFILE
(2)DATAFILE與LOGFILE之間不要有空行
(3)另外,控制檔案裡是不包含臨時表空間的資料檔案的。
rename file操作是為了在資料庫MOUNT時能夠找到具體資料檔案。rename操作是資料庫處于mount狀态時的操作指令。
SQL>ALTER DATABASE MOUNT;
SQL>@renamefile.sql
執行renamefile.sql腳本,腳本内容參考如下:
ALTER DATABASE RENAME FILE '/home/oracle/app/oradata/testdb/test01.dbf' TO '/u01/app/oradata/test01.dbf';
将原資料庫test01.dbf檔案指定到目标資料庫的新的位置上。可以将源資料庫controlfile裡的資料檔案,形成一個rename腳本,然後排程執行即可。
如果重建控制檔案成功并且renamefile操作也沒有問題,那麼就可以拉啟資料庫了。
SQL>ALTER DATABASE RESETLOGS;
如果資料庫正常啟動,表明資料庫還原沒有問題,接下來啟動監聽即可。
1)ps -ef|grep pmon
2)lsnrctl start
控制檔案裡是不包含臨時表空間的,是以,在資料庫啟動之後,有可能需要重新重建一下臨時表空間。
create temporary tablespace TESTTEMP tempfile '/home/oracle/app/oradata/test/testtemp.dbf' size 20G autoextend off;