天天看點

ORACLE冷備份與恢複

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-&gt;aix或者linux-&gt;linux),不能是異構的(linux-&gt;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&gt;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&gt;STARTUP MOUNT;

          SQL&gt;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&gt;ALTER DATABASE MOUNT;

SQL&gt;@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&gt;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;