ORACLE備份和恢復有三種方式:html
(1)數據泵(expdp/impdp)linux
(2)冷備份正則表達式
(3)RMAN備份sql
就分類而言,(1)和(2)統有稱爲「冷」備份,(3)稱爲「熱」備份。數據庫
數據泵和冷備份只能將數據庫還原到某個時間點上(就是備份的時間點),而RMAN備份在歸檔模式下,可以實時備份,實時還原,幾乎能夠作到數據無丟失,但對於數據倉庫而言,開歸檔是很可怕的事情,由於歸檔日誌很大,固然若是有必要也是能夠開啓的,須要作好ARCHIVELOG的備份和清理工做。安全
本文只介紹冷備份,RMAN備份暫不介紹,若有須要,可GOOGLE搜索三思筆記《一步一步學RMAN》備份文檔。bash
網址:http://www.itpub.net/thread-810100-1-1.html服務器
數據泵備份方式是採用ORACLE自帶的EXPDP和IMPDP備份的方式。網絡
LINUX和WINDOWS系統:oracle
可經過「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
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 oracle@192.168.56.88:/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階段找不到相應的數據文件,在數據庫啓動過程當中就會報錯,數據庫沒法啓動。
手工建立控制文件內容能夠從咱們以前備份的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;