使用者管理的備份是指使用OS 命令(UNIX: cp,Windows:copy )備份資料庫物理檔案的過程。
4.1 備份資料庫
備份DB 是指備份DB 的所有資料檔案和控制檔案,另外還應該備份參數檔案和口令檔案。注意,當備份資料庫時,不要備份重做日誌,備份重做日誌“有弊無利”。
4.1.1 資料庫一致性備份
資料庫一致性備份是指在關閉了DB 之後備份所有資料檔案和控制檔案的方法。當使用SHUTDOWN 命令關閉了資料庫之後,所有資料檔案的當前SCN 值完全一致,所以關閉後的Database Backup被稱為資料庫一致性備份或冷備份。此備份既適用於ARCHIVELOG 模式,也適用於NOARCHIVELOG 模式。
具體步驟如下:
(1) 列出要備份的資料檔案和控制檔案。
SQL> select name from v$controlfile union select name from v$datafile;
NAME
--------------------------------------------------------------------------------
C:\DEMO\CONTROL02.CTL
D:\DEMO\CONTROL01.CTL
D:\DEMO\SYSAUX01.DBF
D:\DEMO\SYSTEM01.DBF
D:\DEMO\UNDOTBS01.DBF
D:\DEMO\USERS01.DBF
已選擇6行。
(2) 關閉資料庫(不要使用 SHUTDOWN ABORT)。
SQL> shutdown immediate
資料庫已經關閉。
已經卸載資料庫。
ORACLE 常式已經關閉。
(3) 複製所有資料檔案和控制檔案到備份目錄。
SQL> host copy c:\demo\control02.ctl d:\backup
SQL> host copy d:\demo\control01.ctl d:\backup
SQL> host copy d:\demo\sysaux01.dbf d:\backup
SQL> host copy d:\demo\system01.dbf d:\backup
SQL> host copy d:\demo\undotbs01.dbf d:\backup
SQL> host copy d:\demo\users01.dbf d:\backup
(4) 啟動常式並開啟資料庫。
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 71304548 bytes
Database Buffers 92274688 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
資料庫已經開啟。
4.1.2 資料庫非一致性備份
資料庫非一致性備份是指在OPEN 狀態下備份資料所有資料檔案和控制檔案的方法。因為在OPEN 狀態下資料庫內容隨時都會改變,從而導致不同資料檔案的當前SCN 值不同,所以開啟時的Database Backup被稱為資料庫非一致性備份。
一致性備份會中斷業務操作,非一致性備份不會影響業務操作。非一致性備份只適用於ARCHIVELOG 模式,不適用於NOARCHIVELOG 模式。
具體步驟如下:
(1) 列出要備份的資料檔案。
SQL> select name from v$datafile;
NAME
----------------------------------------------------------------------
D:\DEMO\SYSTEM01.DBF
D:\DEMO\UNDOTBS01.DBF
D:\DEMO\SYSAUX01.DBF
D:\DEMO\USERS01.DBF
(2) 開始Database Backup。在列出要備份的資料檔案之後,將資料庫設定為備份模式。當將資料庫設定為備份模式之後,會在資料庫上發出全域檢查點,並且會在所有資料檔案頭塊上加鎖,以確保備份期間資料檔案的頭塊內容不會改變。
SQL> alter database begin backup;
資料庫已更改。
(3) 備份所有資料檔案和控制檔案(資料檔案用COPY 命令,控制檔案用ALTER DATABASE BACKUP CONTROLFILE 命令)。
SQL> host copy d:\demo\system01.dbf d:\backup
SQL> host copy d:\demo\undotbs01.dbf d:\backup
SQL> host copy d:\demo\sysaux01.dbf d:\backup
SQL> host copy d:\demo\users01.dbf d:\backup
SQL> alter database backup controlfile to 'd:\backup\demo.ctl';
資料庫已更改。
(4) 結束Database Backup。為了確保資料檔案備份的同步性,應該歸檔當前日誌組。
SQL> alter database end backup;
資料庫已更改。
SQL> alter system archive log current;
系統已更改。
4.2 備份資料表空間
備份資料表空間是指在資料庫處於OPEN 狀態時備份其資料檔案的方法。注意,資料表空間備份只適用於ARCHIVELOG 模式,而不適用於NOARCHIVELOG 模式。另外,當備份資料表空間時,既可以備份資料表空間的所有資料檔案,也可以備份資料表空間的某個資料檔案。
4.2.1 離線備份
離線備份是指當資料表空間處於OFFLINE 狀態時,備份資料表空間所有資料檔案或單個資料檔案的過程。與聯機備份相比,這種備份方法的優點是會產生較少的重做資訊,但選缺點是會影響資料表空間上的業務操作。因為SYSTEM 資料表空間和正在使用的UNDO 資料表空間不能被離線,所以這種備份方法不適用於SYSTEM 資料表空間和正在使用的UNDO 資料表空間。
以備份USERS 資料表空間為例,說明執行離線備份的具體方法。步驟如下:
(1) 確定資料表空間所包含的資料檔案。
SQL> select file_name from dba_data_files where tablespace_name='USERS';
FILE_NAME
--------------------------------------------------------------------------------
D:\DEMO\USERS01.DBF
(2) 設定資料表空間為離線狀態。
SQL> alter tablespace users offline;
資料表空間已更改。
(3) 複製資料檔案(如果備份資料表空間,則複製其所有的資料檔案;如果備份資料檔案,則只需複製相應的資料檔案)。
SQL> host copy d:\demo\users01.dbf d:\backup
(4) 設定資料表空間為聯機狀態。
SQL> alter tablespace users online;
資料表空間已更改。
4.2.2 聯機備份
聯機備份是指當資料表空間處於ONLINE 狀態時,備份資料表空間所有資料檔案或單個資料檔案的過程,使用這種方法可以備份資料庫的所有資料表空間和資料檔案。聯機備份的優點是不影響在資料表空間上的業務操作,但缺點是會產生更多的重做資訊和歸檔資訊。
以備份USERS 資料表空間為例,說明執行聯機備份的具體方法。步驟如下:
(1) 確定資料表空間所包含的資料檔案。
SQL> select file_name from dba_data_files where tablespace_name='USERS';
FILE_NAME
--------------------------------------------------------------------------------
D:\DEMO\USERS01.DBF
(2) 設定資料表空間為備份模式。在將資料表空間設定為備份模式之後,會在資料檔案頭塊上加鎖,使得資料檔案頭塊不會發生改變,並且頭塊會記載將來進行恢複時的記錄序號、SCN等資訊。
SQL> alter tablespace users begin backup;
資料表空間已更改。
(3) 複製資料檔案。如果要備份資料表空間,則複製其所有資料檔案;如果要備份資料檔案,則只需複製相應的資料檔案。
SQL> host copy d:\demo\users01.dbf d:\backup
(4) 設定資料表空間為正常模式。
SQL> alter tablespace users end backup;
資料表空間已更改。
4.2.3 處理聯機備份失敗
當執行聯機備份時,如果出現了常式失敗,那麼當執行STARTUP 啟動資料庫時,會顯示如下錯誤資訊:
SQL> startup
ORACLE 常式已經啟動。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 71304548 bytes
Database Buffers 92274688 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
ORA-01113: 檔案 4 需要介質恢複
ORA-01110: 資料檔案 4: 'D:\DEMO\USERS01.DBF'
為了開啟資料庫,必須要結束這些資料檔案的聯機備份狀態。具體步驟如下:
(1) 裝載資料庫。
SQL> startup force mount
ORACLE 常式已經啟動。
Total System Global Area 167772160 bytes
Fixed Size 1247900 bytes
Variable Size 71304548 bytes
Database Buffers 92274688 bytes
Redo Buffers 2945024 bytes
資料庫裝載完畢。
(2) 確定處於聯機狀態的所有資料檔案。
SQL> select file# from v$backup where status='ACTIVE';
FILE#
----------
4
(3) 結束聯機備份狀態。有三種方法結束資料檔案的聯機備份狀態。
A. 如果存在多個資料檔案處於聯機備份狀態,那麼可以使用ALTER DATABASE END BACKUP 命令結束聯機備份狀態。
SQL> alter database end backup;
資料庫已更改。
B. 如果只有某個資料檔案處於聯機備份狀態,那麼可以使用ALTER DATABASE DATAFILE ... END BACKUP 命令結束聯機備份狀態。
SQL> alter database datafile 'd:\demo\users01.dbf' end backup;
資料庫已更改。
C. 通過使用RECOVER 命令結束資料檔案的聯機備份狀態。
SQL> recover datafile 4;
完成介質恢複。
(4) 開啟資料庫。
SQL> alter database open;
資料庫已更改。
4.2.4 備份唯讀資料表空間
因為唯讀有空間的資料檔案不會發生任何變化,所以只需要備份一次。具體步驟如下:
(1) 確定處於READ ONLY 狀態的資料表空間。
SQL> select tablespace_name from dba_tablespaces where status='READ ONLY';
TABLESPACE_NAME
------------------------------
QUERY
(2) 確定唯讀資料表空間包含的資料檔案。
SQL> select file_name from dba_data_files where tablespace_name='QUERY';
FILE_NAME
--------------------------------------------------------------------------------
D:\DEMO\QUERY.DBF
(3) 複製唯讀資料表空間的資料檔案。
SQL> host copy d:\demo\query.dbf d:\backup
4.3 備份控制檔案
控制檔案用於記錄和維護資料庫。當恢複資料庫時,伺服器處理序和後台進程需要從控制檔案中讀取各種與備份相關的資訊。如果控制檔案損壞,則會導致這麼備份資訊的丟失。儘管通過多元化控制檔案可以防止控制檔案損壞,但因為控制檔案的重要性,所以應該定期備份控制檔案。當資料庫配置發生改變時,一定要備份控制檔案。涉及到資料庫配置改變的命令如下:
- ALTER DATABASE [ADD|DROP] LOGFILE
- ALTER DATABASE [ADD|DROP] LOGFILE MEMBER
- ALTER DATABASE [ADD|DROP] LOGFILE GROUP
- ALTER DATABASE [NOARCHIVELOG|ARCHIVELOG]
- ALTER DATABASE RENAME FILE
- CREATE TABLESPACE
- ALTER TABLESPACE [ADD|RERNAME] DATAFILE
- ALTER TABLESPACE [READ WRITE|READ ONLY]
- DROP TABLESPACE
當執行資料庫一致性備份時,可以備份控制檔案。當資料庫處於OPEN 狀態時,DBA 可以使用ALTER DATABASE 命令備份控制檔案,使用該命令既可以建立控制檔案副本,也可以將控制檔案資訊備份到追蹤檔案。
4.3.1 建立控制檔案副本
當使用ALTER DATABASE 命令建立控制檔案副本時,ORACLE 會將當前控制檔案的資訊全部存放到控制檔案副本中。通過使用控制檔案副本,一方面可以執行基於控制檔案的不完全恢複,另一方面可以產生控制檔案的檔案追蹤檔案。注意,當資料處於OPEN 狀態時,控制檔案副本只能用ALTER DATABASE 命令產生,而不能用OS 命令直接複製。
SQL> alter database backup controlfile to 'd:\backup\demo.ctl';
alter database backup controlfile to 'd:\backup\demo.ctl'
*
第 1 行出現錯誤:
ORA-01580: 建立控製備份檔案 d:\backup\demo.ctl 時出錯
ORA-27038: 所建立的檔案已存在
OSD-04010: 指定了 <create> 選項, 但檔案已經存在
當建立控制檔案副本時,如果控制檔案副本已經存在,則會顯示錯誤資訊。通過使用REUSE 選項,可以覆蓋原有控制檔案副本。
SQL> alter database backup controlfile to 'd:\backup\demo.ctl' reuse;
資料庫已更改。
4.3.2 備份到追蹤檔案
假定資料庫所有資料檔案、重做日誌都處於一致完好狀態,而只有控制檔案被意外刪除或損壞,那麼通過重建立立控制檔案就可以恢複控制檔案。建立控制檔案是使用CREATE CONTROLFILE 命令來完成的,但是執行該命令要求DBA 必須清楚資料庫所包含的資料檔案、重做日誌的詳細清單。為了避免手工建立控制檔案所帶來的麻煩,DBA 可以使用ALTER DATABASE BACKUP CONTROLFILE TO TRACE 命令將控制檔案所記載的物理資訊備份到追蹤檔案,然後使用該追蹤檔案建立控制檔案。
SQL> alter database backup controlfile to trace;
資料庫已更改。
(1) 確定追蹤檔案位置。追蹤檔案被存放在初始化參數user_dump_dest 所對應的目錄中。
SQL> show parameter user_dump_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest string D:\ORACLE\PRODUCT\10.2.0\ADMIN\DEMO\UDUMP
(2) 確定追蹤檔案名稱。追蹤檔案名稱的格式為<SID>_ora_<SPID>.trc, 其中SID 為常式標識符,亦即環境變數ORACLE_SID的值;而SPID 是伺服器處理序所對應的作業系統進程號。
SQL> select a.spid from v$process a, v$session b where a.addr=b.paddr and b.username='SYS';
SPID
------------
1240
(3) 查看追蹤檔案內容。
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "DEMO" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'D:\DEMO\REDO01.LOG',
'C:\DEMO\REDO01_2.LOG'
) SIZE 50M,
GROUP 2 (
'D:\DEMO\REDO02.LOG',
'C:\DEMO\REDO02_2.LOG'
) SIZE 50M,
GROUP 3 (
'D:\DEMO\REDO03.LOG',
'C:\DEMO\REDO03_2.LOG'
) SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:\DEMO\SYSTEM01.DBF',
'D:\DEMO\UNDOTBS01.DBF',
'D:\DEMO\SYSAUX01.DBF',
'D:\DEMO\USERS01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
ALTER DATABASE RENAME FILE 'MISSING00005'
TO 'D:\DEMO\QUERY.DBF';
ALTER TABLESPACE "QUERY" ONLINE;
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\DEMO\TEMP01.DBF'
SIZE 22020096 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "DEMO" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 (
'D:\DEMO\REDO01.LOG',
'C:\DEMO\REDO01_2.LOG'
) SIZE 50M,
GROUP 2 (
'D:\DEMO\REDO02.LOG',
'C:\DEMO\REDO02_2.LOG'
) SIZE 50M,
GROUP 3 (
'D:\DEMO\REDO03.LOG',
'C:\DEMO\REDO03_2.LOG'
) SIZE 50M
-- STANDBY LOGFILE
DATAFILE
'D:\DEMO\SYSTEM01.DBF',
'D:\DEMO\UNDOTBS01.DBF',
'D:\DEMO\SYSAUX01.DBF',
'D:\DEMO\USERS01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE USING BACKUP CONTROLFILE
ALTER DATABASE OPEN RESETLOGS;
ALTER DATABASE RENAME FILE 'MISSING00005'
TO 'D:\DEMO\QUERY.DBF';
ALTER TABLESPACE "QUERY" ONLINE;
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\DEMO\TEMP01.DBF'
SIZE 22020096 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
當將控制檔案的說明資訊、注釋資訊等無關資訊去掉之後,剩餘部分就是用於重建立立控制檔案的全部內容。當控制檔案出現介質損壞時,通過執行以上語句可以恢損壞的控制檔案。
4.4 備份其他檔案
在制定備份和恢複計劃時,不僅需要制定資料檔案和控制檔案的備份恢複計劃,還需要制定歸檔日誌、參數檔案和口令檔案的備份和恢複計劃。
1. 備份歸檔日誌
當備份歸檔日誌時,首先要確定要備份的歸檔日誌,然後使用OS 命令直接複製歸檔記錄檔到備份目錄。
SQL> select name from v$archived_log where dest_id=1 and first_time>=sysdate-1;
NAME
--------------------------------------------------------------------------------
C:\DEMO\ARCHIVE\4_1_664374623.LOG
C:\DEMO\ARCHIVE\5_1_664374623.LOG
C:\DEMO\ARCHIVE\6_1_664374623.LOG
C:\DEMO\ARCHIVE\7_1_664374623.LOG
C:\DEMO\ARCHIVE\8_1_664374623.LOG
C:\DEMO\ARCHIVE\9_1_664374623.LOG
已選擇6行。
SQL> host copy c:\demo\archive\4_1_664374623.LOG d:\backup
SQL> host copy C:\DEMO\ARCHIVE\5_1_664374623.LOG d:\backup
SQL> host copy C:\DEMO\ARCHIVE\6_1_664374623.LOG d:\backup
SQL> host copy C:\DEMO\ARCHIVE\7_1_664374623.LOG d:\backup
SQL> host copy C:\DEMO\ARCHIVE\8_1_664374623.LOG d:\backup
SQL> host copy C:\DEMO\ARCHIVE\9_1_664374623.LOG d:\backup
2. 備份參數檔案
如果在啟動常式時不能定位到參數檔案,則會顯示如下錯誤資訊:
SQL> startup
ORA-01078: 處理系統參數失敗
LRM-00109: 無法開啟參數檔案'D:\ORACLE\PRODUCT\10.2.0\DB_1\DATABASE\INITDEMO.ORA'
如果常式使用檔案參數檔案(PFILE),那麼直接使用OS 命令複製其檔案參數檔案;如果常式使用伺服器參數檔案(SPFILE),那麼使用CREATE PFILE 命令進行備份。
SQL> create pfile='d:\backup\demo.par' from spfile='%oracle_home%\dbs\spfiledemo.ora';
檔案已建立。
3. 備份口令檔案
SQL> conn sys/demo@democlient as sysdba
ERROR:
ORA-01031: 許可權不足
口令檔案可以使用OS 命令直接備份。
SQL> host copy %oracle_home%\database\pwddemo.ora d:\backup