--時間: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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/1141.html
標籤:Oracle
