--時間:2020年9月2日
--作者:飛翔的小胖豬
1 備份
1.1 備份說明
rman可進行熱備和冷備,一般情況下都是進行熱備即不數據庫備份。執行的熱備需要數據庫處於歸檔模式下。
1.2 設置歸檔模式
歸檔模式開啟過后,當一個在線重做日志寫滿了過后,會切換到下一個在線重做日志中進行日志寫入。之前的在線重做日志會形成歸檔日志存放於歸檔日志目錄中。如果歸檔日志目錄空間使用率100%,那么整個數據庫會無法寫入新數據而導致數據庫GG,所以在開啟設置數據庫為歸檔模式后需要定時的檢查歸檔日志目錄剩余空間大小,及時清理過期的數據或擴容目錄空間。
設置歸檔日志路徑
SQL> alter system set log_archive_dest_1='location=/u01/arch' #設置為本地目錄作為歸檔日志目錄,紅色字體根據自己定義的目錄填寫 SQL> alter system set log_archive_dest_1='location=+DATA/RACDB/ARCH' scope=spfile sid='*'; #使用ASM的環境下使用此命令
SQL> show parameter log_archive_dest_1; #查看確認設置的歸檔日志路徑
開啟歸檔
歸檔模式的切換必須處於mount狀態下,其他狀態下不行喲。
SQL> shutdown immediate; #先正常關閉在用數據庫,如果你的數據庫正在運行 SQL> startup mount; #啟動數據庫到mount階段 SQL> alter database archivelog; #設置數據庫為歸檔模式 SQL> alter database open; #啟動數據庫到open狀態 SQL> archive log list; #查看數據庫當前是否處於歸檔模式下
SQL> alter system switch logfile; #嘗試切換一下在線重做日志文件,此時可以到之前設置的歸檔日志目錄中查看是否有新文件,如果有新文件則表示歸檔正常。
關閉歸檔模式
關閉歸檔模式和開啟的操作一樣,只能在mount狀態下執行。
SQL> shutdown immediate; #先正常關閉在用數據庫,如果你的數據庫正在運行 SQL> startup mount; #啟動數據庫到mount階段 SQL> alter database noarchivelog; #設置數據庫為歸檔模式 SQL> alter database open; #啟動數據庫到open狀態 SQL> archive log list; #查看數據庫當前是否處於歸檔模式下
1.3 備份腳本
腳本中的ORACLE_SID、ORACLE_BASE、ORACLE_HOME、PATH這幾個環境變量請根據自己的實際情況填寫。
1 #!/bin/bash 2 export ORACLE_SID=orcl 3 export ORACLE_BASE=/app/oracle 4 export ORACLE_HOME=/app/oracle/product/11.2.0/dbhome_1 5 export PATH=$DB_HOME/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/oracle/bin 6 export NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' 7 echo '------------------------------------' >> /tmp/rman_PRD04_full.log 8 echo "Start FULL Backup at `date +%Y-%m-%d:%H:%M:%S` " >> /tmp/rman_PRD04_full.log 9 echo '------------------------------------' >> /tmp/rman_PRD04_full.log 10 11 rman target / log /tmp/rman_PRD04_full.log append <<EOF 12 run{ 13 allocate channel c1 type disk; 14 allocate channel c2 type disk; 15 allocate channel c3 type disk; 16 backup database format '/app/archive_backup/full_%d_%T_%s_%p.bak'; 17 SQL 'alter system archive log current'; 18 SQL 'alter system archive log current'; 19 backup archivelog all format '/app/archive_backup/arch_%d_%T_%s_%p.bak'; 20 backup current controlfile format '/app/archive_backup/ct1_%d_%T_%s_%p.ctl.bak'; 21 backup spfile format '/app/archive_backup/%d_%T_%s_%p.spfile.bak'; 22 } 23 EOF
釋義:
13-15行:打開了三個通道介質都為disk,rman備份建議最多使用4個通道。
16行:定義備份過后的數據文件路徑及命名格式。
17-18行:切換數據庫在線重做日志文件。
19行:定義備份的歸檔日志文件路徑及命名格式。(順序必須在備份數據文件之后),備份的是數據庫數據文件備份期間產生的歸檔日志。
20行:定義備份的控制文件路徑及命令格式。
21行:定義備份的spfile文件路徑及命令格式。
1.4 RMAN基礎操作
$rman target / #以數據庫的sysdba用戶進入到rman中,當設置了ORACLE_SID同時對應實例的數據庫處於nomount以上的狀態時,該命令會自動連接到該實例中。 不然需要使用set dbid 'xxxxxx';設置連接到哪一個實例中 RMAN> show all; #查看所有配置 釋義: ①configure retention policy to redundancy 1: 是用來決定那些備份不再需要了,它一共有三種可選項,分別是 復制代碼 代碼如下: CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS; CONFIGURE RETENTION POLICY TO REDUNDANCY 5; CONFIGURE RETENTION POLICY TO NONE; 第一種recover window是保持所有足夠的備份,可以將數據庫系統恢復到最近七天內的任意時刻。任何超過最近七天的數據庫備份將被標記為obsolete。 第二種redundancy是為了保持可以恢復的最新的5份數據庫備份,任何超過最新5份的備份都將被標記為redundancy。它的默認值是1份。 第三種不需要保持策略,clear將恢復回默認的保持策略。 一般最安全的方法是采用第二種保持策略。 ②CONFIGURE BACKUP OPTIMIZATION OFF 默認值為關閉,如果打開,rman將對備份的數據文件及歸檔等文件進行一種優化的算法。 ③Configure default device type to disk: 是指定所有I/O操作的設備類型是硬盤或者磁帶,默認值是硬盤 磁帶的設置是CONFIGURE DEFAULT DEVICE TYPE TO SBT; ④CONFIGURE CONTROLFILE AUTOBACKUP OFF 強制數據庫在備份文件或者執行改變數據庫結構的命令之后將控制文件自動備份,默認值為關閉。這樣可以避免控制文件和catalog丟失后,控制文件仍然可以恢復。 ⑤CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F' 是配置控制文件的備份路徑和備份格式 ⑥CONFIGURE DEVICE TYPE DISK PARALLELISM 1; 是配置數據庫設備類型的並行度,並行的數目決定了開啟通道的個數。 ⑦CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1 是否啟動復合備份,向指定的i/o設備中指定的位置生成指定的份數。缺省為1.這個配置僅用於數據文件和歸檔文件,並且,只有在自動分配通道時才會生效! ⑧CONFIGURE SNAPSHOT CONTROLFILE NAME TO 'C:ORACLE…SNCFTEST.ORA' 是配置控制文件的快照文件的存放路徑和文件名,這個快照文件是在備份期間產生的,用於控制文件的讀一致性。 ⑨CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT 'C:...%d_DB_%u_%s_%p'; 是配置備份文件的備份路徑和備份格式 ⑩CONFIGURE EXCLUDE FOR TABLESPACE <tablespace> [CLEAR]; 此命令用於將指定的表空間不備份到備份集中, 此命令對只讀表空間是非常有用的。
校驗備份數據
校驗的目的是檢測當前以存在rman備份數據是否有效等功能。
檢驗操作不會對以備份數據造成影響。可以放心大膽的使用。
RMAN> crosscheck backup; #校驗所有備份數據信息
RMAN> crosscheck backup of database; #校驗數據庫備份數據信息
RMAN> crosscheck backup of tablespacesystem; #校驗數據庫表空間備份數據信息
RMAN> crosscheck backup of controlfile; #校驗控制文件備份信息
RMAN> crosscheck backup of spfile; #檢驗數據庫配置文件備份信息
RMAN> crosscheck archivelog all; #檢驗歸檔日志文件數據信息
RMAN> crosscheck backup of archivelog all; #檢驗歸檔日志文件備份信息
查看備份數據
查看rman中備份文件信息,為保證數據的准確性,在執行查看前請先使用crosscheck命令對備份數據進行一次檢驗。
查看命令是無害的隨意用,不會修改任何東西。
RMAN> list backup; #查看所有備份數據 RMAN> list backup of database; #查看數據庫備份數據 RMAN> list backup of tablespacetable_name; #查看表空間備份數據 RMAN> list backup of controlfile; #查看控制文件備份數據 RMAN> list backup of spfile; #查看數據庫配置文件備份數據 RMAN> list backupset id; #這里ID指的是備份集的ID號 比如2、3.
RMAN> list archivelog all; #查看所有的歸檔日志文件
RMAN> list archivelog all COMPLETED BEFORE 'SYSDATE-7'; #查看7天前的數據歸檔日志文件
RMAN> list ARCHIVELOG FROM TIME 'SYSDATE-7'; #查看7天內的歸檔日志文件
刪除歸檔及備份文件
為了避免備份文件過多導致存儲壓力可以制定計划定時清理備份數據,在rman中刪除數據時請先使用crosscheck命令對備份數據進行一次檢驗。
刪除命令威力還是很大的,一定要按照生產規范執行數據保留策略。在進行清理操作時請多次確認。在執行刪除操作時請小心!小心!小心!不要誤操作了。
刪除歸檔日志 RMAN> delete expired archivelog all; #刪除過期的歸檔日志 RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7'; #刪除7天前的歸檔日志 RMAN> DELETE ARCHIVELOG FROM TIME 'SYSDATE-7'; #刪除七天內的歸檔 RMAN> report obsolete; #報告陳舊備份 RMAN> delete obsolete; #刪除陳舊備份 RMAN> delete expired backup; #刪除過期的數據,和rman的保留策略設置有關 RMAN> delete expired copy ; #刪除EXPIRED副本 RMAN> delete backupset 9; #刪除備份集編號9的 RMAN> delete backuppiece ¨F:\backup\DEMO_9.bak¨; #刪除特定備份片 RMAN> delete backup; #刪除所有備份 RMAN> RMAN> delete copy; #刪除映象副本 RMAN> delete datafilecopy ¨F:\backup\DEMO_9.bak¨ #刪除特定映象副本
2 RMAN恢復數據
2.1 恢復說明
數據庫啟動需要經過: close 階段 ----> nomount階段 -----> mount階段 ----> open階段
close階段:
狀態:數據庫程序未運行。
恢復內容:可以進行物理文件的移動拷貝。創建啟動前必要的文件夾、物理拷貝spfile文件到正確目錄。
nomount階段:
狀態:oracle程序數據庫中必要的文件夾存及特定文件存在,該階段不會去檢測控制文件和數據庫數據文件是否存在。但是如spfile文件丟失是無法啟動到nomount狀態。
恢復內容:可以進行控制文件的恢復,如從備份位置恢復控制文件或使用命令重建控制文件等操作。
mount階段:
狀態:階段需要有控制文件。能夠正常讀取讀取控制文件中的數據庫信息如數據文件路徑,當前scn號等信息。
恢復內容:該階段組要可以對具體的數據文件進行恢復及redo 日志文件丟失重建等操作
open:
狀態:數據庫的最終狀態。控制文件中的所有文件及scn號一致的情況下可以啟動成功,如果scn號不一致可能需要進行實例恢復。
2.2 恢復控制文件(有備份)
思路:
強制關閉數據庫,手動啟動數據庫到mount階段,恢復丟失的控制文件,然后在mount階段恢復同步一下數據庫最后打開數據庫。
步驟:
1.強制關閉數據庫
2.啟動數據庫到nomount狀態
3.使用rman連接數據庫
4.使用備份文件恢復control文件
5.在rman管理器中啟動數據庫到mount階段
6.執行恢復數據庫
7.打開數據庫
#強制關閉數據庫 SQL> shutdown abort;
#啟動到nomount階段 SQL> startup nomount;
#新開一個終端,進入到rman管理器中 $ rman target / RMAN> set dbid='xxxxxxxxxxx'; #dbid可以在數據庫正常時,通過select dbid from v$database;命令查看 RMAN> restore controlfile from '實際備份的文件路徑'; RMAN> alter database mount; RMAN> recover database; #如果報數據文件相關的錯誤,需進行數據文件恢復,則執行如下三條命令。 如果有datafile文件錯誤。 RMAN> list failure; RMAN> advise failure; #運行自動修復功能,會生成一個文本,使用cat查看按照文本操作 RMAN> repair failure; #運行自動修復,成功的話會自動打開庫
RMAN> alter database open; #執行啟動數據庫到open狀態,如果該命令成功則不用執行下一條命令 RMAN> alter database open resetlogs;
2.3 重建控制文件(沒有備份)
在異常斷電可能導致控制文件丟失或GG了,又沒有備份那么只有嘗試重建控制文件。
控制文件丟失數據庫是無法啟動到mount狀態的。在rac環境中需要設置cluster_database為False,show parameter cluster_database
思路:
備份現有數據庫配置文件,通過配置文件找到數據庫名和具體的數據存放路徑,在nomount階段下獲取字符集,使用獲取到的數據填充命令重建數據庫控制文件。
步驟:
1.強制關閉數據庫
2.啟動數據庫到nomount狀態
3.備份spfile文件
4.獲取數據文件列表、數據庫實例名、字符集等信息
5.完善控制文件重建命令
6.打開數據庫
備份spfile文件
備份spfile文件,如果spfile不小心被你玩崩了那么你可以使用 startup pfile='pfile路徑'指定之前備份的。
使用服務器參數文件spfile創建文本參數文件pfile:
SQL> show parameter spfile; #查看spfile文件存放路徑 (以下的spfile備份命令選擇一種即可) SQL> create pfile from spfile='/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl.ora';#復制的pfile在同目錄下 SQL> create pfile from spfile; #復制當前的spfile文件為pfile文件,同目錄。 SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora" from spfile="/app/oracle/product/11.2.0/dbhome_1/dbs/spfileorcl.ora"; SQL> create pfile="/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora" from spfile;
spfile丟失過后可以直接復制,也可以使用如下命令恢復spfile文件。
SQL> create spfile from pfile='/app/oracle/product/11.2.0/dbhome_1/dbs/bakpfile.ora';
獲取數據庫名,在spfile文件中
在文件中查看 db_name= 行內容並記錄下來。
[oracle@localhost dbs]$ cat spfileorcl.ora| more b_cache_size=637534208 orcl.__java_pool_size=16777216 orcl.__large_pool_size=33554432 orcl.__oracle_base='/app/oracle'#ORACLE_BASE set from environment orcl.__pga_aggregate_target=637534208 orcl.__sga_target=922746880 orcl.__shared_io_pool_size=0 orcl.__shared_pool_size=218103808 orcl.__streams_pool_size=0 *.audit_file_dest='/app/oracle/admin/orcl/adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='/app/oracle/oradata/orcl/control01.ctl','/app/oracle/fast_recC *.db_block_size=8192 *.db_domain='' *.db_name='orcl' *.db_recovery_file_dest='/app/oracle/fast_recovery_area' *.db_recovery_file_dest_size=4385144832 *.diagnostic_dest='/app/oracle' *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)' *.log_archive_dest_1='location=/app/archive_data' *.memory_target=1547698176 *.open_cursors=300 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.undo_tablespace='UNDOTBS1'
獲取字符集,很重要(在nomount狀態)
SQL> select userenv('language') from dual;
獲取數據文件列表
一般在$ORACLE_BASE/oradata/實例名/下ASM除外。記錄下所有的文件依次填寫在命令中。
$ ll $ORACLE_BASE/oradata/orcl/ -rw-r----- 1 oracle oinstall 9.3M Sep 1 11:58 control01.ctl.bak -rw-r----- 1 oracle oinstall 331M Sep 1 11:57 example01.dbf drwxr-x--- 3 oracle oinstall 4.0K Aug 20 06:25 ORCL -rw-r----- 1 oracle oinstall 501M Sep 1 11:54 redo01.log -rw-r----- 1 oracle oinstall 501M Sep 1 11:57 redo02.log -rw-r----- 1 oracle oinstall 501M Sep 1 11:54 redo03.log-rw-r----- 1 oracle oinstall 541M Sep 1 11:57 sysaux01.dbf -rw-r----- 1 oracle oinstall 751M Sep 1 11:57 system01.dbf -rw-r----- 1 oracle oinstall 21M Sep 1 11:54 temp01.dbf -rw-r----- 1 oracle oinstall 101M Sep 1 11:57 undotbs01.dbf -rw-r----- 1 oracle oinstall 5.1M Sep 1 11:57 users01.dbf
生成控制文件
在nomount中執行命令,按照之前查看到的文件填寫。控制文件生成過后會自動啟動到mount狀態。
#紅色字體部分請按照自己實際環境填寫。
SQL> CREATE CONTROLFILE REUSE DATABASE 'orcl' NORESETLOGS ARCHIVELOG MAXLOGFILES 5 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 1 MAXLOGHISTORY 226 LOGFILE GROUP 1 '/app/oracle/oradata/orcl/redo01.log' SIZE 500M, GROUP 2 '/app/oracle/oradata/orcl/redo02.log' SIZE 500M, GROUP 3 '/app/oracle/oradata/orcl/redo03.log' SIZE 500M DATAFILE '/app/oracle/oradata/orcl/system01.dbf', '/app/oracle/oradata/orcl/sysaux01.dbf', '/app/oracle/oradata/orcl/undotbs01.dbf', '/app/oracle/oradata/orcl/users01.dbf', '/app/oracle/oradata/orcl/example01.dbf', '/app/oracle/oradata/orcl/temp01.dbf' CHARACTER SET US7ASCII ; 注:提示ORA-01110: data file : '/app/oracle/oradata/orcl/temp01.dbf\' 則刪除temp01.dbf這一行,再執行。 SQL> CREATE CONTROLFILE REUSE DATABASE 'orcl' NORESETLOGS ARCHIVELOG MAXLOGFILES 5 MAXLOGMEMBERS 3 MAXDATAFILES 100 MAXINSTANCES 1 MAXLOGHISTORY 226 LOGFILE GROUP 1 '/app/oracle/oradata/orcl/redo01.log' SIZE 500M, GROUP 2 '/app/oracle/oradata/orcl/redo02.log' SIZE 500M, GROUP 3 '/app/oracle/oradata/orcl/redo03.log' SIZE 500M DATAFILE '/app/oracle/oradata/orcl/system01.dbf', '/app/oracle/oradata/orcl/sysaux01.dbf', '/app/oracle/oradata/orcl/undotbs01.dbf', '/app/oracle/oradata/orcl/users01.dbf', '/app/oracle/oradata/orcl/example01.dbf' CHARACTER SET US7ASCII ;
打開數據庫
在成功執行了控制文件重建操作后,數據庫會自動啟動到mount狀態。此時可以嘗試open數據庫。如果無法直接open嘗試recover一下再open。
SQL> alter database open;
如果此處失敗,則先進行實例恢復。recover database; 然后再執行alter database open; ERROR at line 1: ORA-01113: file 1 needs media recovery ORA-01110: data file 1: '/app/oracle/oradata/orcl/system01.dbf'
2.4 恢復丟失的數據文件
如果沒有備份至故障期間的歸檔重做日志,那么只能恢復到備份的時候,不能進行完全恢復。
思路:
強制關閉數據庫,在rman中啟動數據庫到nomount狀態,恢復控制文件(可選),啟動數據庫到mount階段,恢復相關數據文件,recover一下數據,最后打開數據庫。
步驟:
1.強制關閉數據庫
2.啟動數據庫到nomount狀態
3.恢復控制文件(可選)
4.切換數據庫到mount模式,restore數據文件
5.recover數據文件
6.打開數據庫
SQL> shutdown abort; #強制關閉數據庫用oracle賬戶 SQL> startup nomount; #啟動數據庫到nomount狀態,如果有控制文件、pfile或者當前控制文件、spfile不正確,則需要先進行配置文件恢復。
$ rman target / RMAN> restore controlfile from '實際備份的文件路徑'; RMAN> alter database mount; RMAN> list failure; #查看系統中缺失的文件信息,必須先執行該命令后才能使用如下的advise命令 RMAN> advise failure; #運行自動修復功能,會生成一個文本,使用cat查看按照文本操作 RMAN> repair failure; #運行自動修復,成功的話會自動打開庫
2.5 恢復丟失的某個數據文件
思路:
離線丟失的數據文件,在rman中恢復丟失的數據文件,recover一下恢復的數據文件,最后上線數據文件。
步驟:
1.離線丟失數據文件
2.使用備份數據恢復丟失文件
3.recover剛才恢復的文件
4.上線數據文件
關閉數據庫
啟動到mount狀態,也可以嘗試啟動到open狀態(一般啟動open的過程中會提示文件offline) offline指定的數據庫文件 SQL> alter database datafile '/app/oracle/oradata/orcl/example01.dbf' offline; SQL> alter database open;
從rman中恢復數據文件
RMAN> restore datafile '/app/oracle/oradata/orcl/example01.dbf';
獲取實際的數據文件路徑
SQL> set linesize 200; SQL> col file_name for a40; SQL> select file_name,file_id,tablespace_name,status,online_status from dba_data_files
查看到offline的文件實際路徑,為了保證scn號一致還需要獲取到文件路徑在rman中執行恢復。
RMAN> recover datafile '/app/oracle/oradata/orcl/example01.dbf';
online數據文件,重啟數據庫
SQL> alter database datafile '/app/oracle/oradata/orcl/example01.dbf' online; SQL> shutdown immediate SQL> startup