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%';
SELECT *
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的線程數,但這個值不建議太大。
注意備份腳本應該放到同一行去執行,腳本中間不能有換行。
注意需要補充tns_name參數,當然也可以使用system用戶。
另外,使用PARALLEL參數後,建議dumpfile使用%u選項,將一個dumpfile拆分成多個,否則,PARALLEL參數效果不明顯。
(1)對應備份腳本:
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
(2)對應還原腳本:
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用戶數據
(1)對應備份腳本
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
(2)對應還原腳本
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腳本
#!/bin/sh
expdp_date=`date +"%Y%m%d"`
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),否則是沒有用的。如果是異構的,那麼只能采用數據泵的方式。
冷備份的優點:
(1)冷備模式下概念易於理解,即將需要備份的文件復制到安全的位置
(2)容易恢復到某個時間點上(只需將文件再拷貝回去)
(3)能與歸檔方法相結合,做數據庫“最佳狀態”的恢復。
(4)低度維護,高度安全。
冷備份的缺點:
(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
將控制文件、數據文件、redo日志文件復制到另一塊存儲上。可以使用SCP命令進行復制。使用SCP命令需要安裝SSH軟件包,一般來說,LINUX系統默認是安裝的;AiX需要安裝SSH軟件包。如果沒有SSH軟件包,可以到網上搜索進行下載安裝。
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)控制文件的位置一致
操作步驟:
(1)復制完成後,即可拉啟數據庫
SQL>STARTUP MOUNT;
SQL>ALTER DATABASE OPEN RESETLOGS;
如果以上操作順利結束,表明數據庫還原沒有問題,可以啟動數據庫監聽,連接數據庫即可。
啟動監聽:
1)ps -ef |grep pmon
2)lsnrctl start
如果數據文件位置不一致,那麼就需要手工創建controlfile文件和rename數據文件。
原因:
原控制文件裡記錄的數據文件的位置與目標庫數據文件的位置不同,數據庫在mount階段開始讀controlfile裡的內容。mount階段找不到相應的數據文件,在數據庫啟動過程中就會報錯,數據庫無法啟動。
SQL>STARTUP NOMOUNT
重建控制文件,相對來說比較簡單。主要問題在於控制文件的格式不要出錯就可以。
手工創建控制文件內容可以從我們之前備份的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;