程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORACLE冷備份與恢復

ORACLE冷備份與恢復

編輯: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.1 數據泵備份和還原的先決條件

數據泵備份和還原的先決條件

(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.2 實施步驟

1.2.1 創建路徑

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;

--將讀寫路徑的權限給某個用戶

1.2.2 授權

授以某個用戶的備份和還原的權限:

GRANT EXPORT FULL DATABASE,IMPORT FULL DATABASE TO test;

1.3 執行備份和還原腳本

數據泵備份EXPDP命令,數據庫還原IMPDP命令,以下均采用並行的方式,PARALLEL參數取決於CPU與CPU的線程數,但這個值不建議太大。

注意備份腳本應該放到同一行去執行,腳本中間不能有換行。

1.3.1備份TEST用戶整庫

注意需要補充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

1.3.4 只備份TEST表

用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)不能按表或按用戶恢復。

2.1 實施步驟

冷備份中必須拷貝的文件包括:

(1)所有數據文件

(2)所有控制文件

(3)所有聯機REDO LOG文件

(4)Init.ora文件(可選)

(5).profile或者.bash_profile(可選)

注意:冷備份必須在數據庫關閉的情況下進行,當數據庫處於打開狀態時,執行數據庫文件系統備份是無效的。

2.1.1備份控制文件

冷備份要關閉數據庫,在關閉數據庫之前,先要備份控制文件,接著記錄數據文件、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;

2.1.2 關閉數據庫

(1)停監聽

1)ps -ef |grep pmon

2)lsnrctl stop

(2)關閉數據庫

SQL>shutdown immediate

2.1.3 復制文件

將控制文件、數據文件、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日志文件的位置。

3.1 數據庫安裝路徑一致

此操作的前提條件是:

(1)數據文件路徑一致

(2)數據庫的實例名稱一致

(3)控制文件的位置一致

操作步驟:

(1)復制完成後,即可拉啟數據庫

SQL>STARTUP MOUNT;

SQL>ALTER DATABASE OPEN RESETLOGS;

如果以上操作順利結束,表明數據庫還原沒有問題,可以啟動數據庫監聽,連接數據庫即可。

啟動監聽:

1)ps -ef |grep pmon

2)lsnrctl start

3.2 數據文件位置不一致

如果數據文件位置不一致,那麼就需要手工創建controlfile文件和rename數據文件。

原因:

原控制文件裡記錄的數據文件的位置與目標庫數據文件的位置不同,數據庫在mount階段開始讀controlfile裡的內容。mount階段找不到相應的數據文件,在數據庫啟動過程中就會報錯,數據庫無法啟動。

3.2.1 解決方法

3.2.1.1將數據庫開啟到nomount狀態

SQL>STARTUP NOMOUNT

3.2.1.2重建控制文件

重建控制文件,相對來說比較簡單。主要問題在於控制文件的格式不要出錯就可以。

手工創建控制文件內容可以從我們之前備份的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)另外,控制文件裡是不包含臨時表空間的數據文件的。

3.2.1.3 rename file操作

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腳本,然後調度執行即可。

3.2.1.4打開數據庫

如果重建控制文件成功並且renamefile操作也沒有問題,那麼就可以拉啟數據庫了。

SQL>ALTER DATABASE RESETLOGS;

如果數據庫正常啟動,表明數據庫還原沒有問題,接下來啟動監聽即可。

1)ps -ef|grep pmon

2)lsnrctl start

3.2.1.5 初始化臨時表空間

原因:

控制文件裡是不包含臨時表空間的,因此,在數據庫啟動之後,有可能需要重新重建一下臨時表空間。

create temporary tablespace TESTTEMP tempfile '/home/oracle/app/oradata/test/testtemp.dbf' size 20G autoextend off;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved