1. 程式人生 > 其它 >講真,你該做備份的有效性校驗了

講真,你該做備份的有效性校驗了

編輯手記:最近刷爆了朋友圈的GitLab刪庫事件驚醒了一大批運維人員,五重備份全部失效,這是真的嗎?嗯,經過無數次確認,的確所有備份都失效。而我同樣相信,存在類似隱患的企業不在少數,如果你的系統遭遇類似故障,你是否能倖免。

講真,年初好好地做一次備份的有效性校驗吧。今天分享一些常用的校驗有效性的方法。文章來自官方文件翻譯。

1、RMAN校驗

RMAN校驗的主要目的是檢驗壞塊和丟失的檔案,資料庫一般會阻止可能導致失效的備份檔案或者損壞的還原檔案的操作。

RMAN校驗主要會進行以下操作:

  • 在恢復或還原資料檔案的過程中阻止對其進行訪問
  • 針對一個數據檔案每次只允許一個還原操作
  • 確保增量備份的有序性
  • 將儲存資訊存放在備份檔案中以便可以檢查檔案損壞
  • 在每次讀寫塊的時候都做檢查,使得壞塊及時被發現

>關於校驗和與壞塊

所謂壞塊指的是塊中的資料改變了,跟Oracle預期想要查詢的資料不同,壞塊產生的原因包含但不侷限於以下幾種:

  • 磁碟和磁碟控制器故障
  • 記憶體故障
  • Oracle資料庫軟體的缺陷

DB_BLOCK_CHECKSUM是一個數據庫初始化引數,用於控制資料庫(而非備份)中的資料檔案和聯機重做日誌檔案中的塊的校驗和的寫入。 如果DB_BLOCK_CHECKSUM是Typical的,那麼資料庫在正常操作期間計算每個塊的校驗和,並在寫入磁碟之前將其儲存在塊頭中。 當資料庫稍後從磁碟讀取塊時,會重新計算校驗和並與儲存的值進行比較。 如果值不匹配,則塊已損壞。

預設情況下,BACKUP命令計算每個塊的校驗和,並將其儲存在備份中。 BACKUP命令忽略DB_BLOCK_CHECKSUM的值,因為此初始化引數適用於資料庫中的資料檔案,而不是備份。

>認識物理和邏輯壞塊

  • 在物理壞塊(介質損壞)中,資料庫根本無法識別該塊:校驗和無效,塊包含全零,或塊頭和塊尾不匹配。

預設情況下,BACKUP命令計算每個塊的校驗和,並將其儲存在備份中。 如果指定NOCHECKSUM選項,則建立備份時,RMAN不會執行塊的校驗和。

  • 在邏輯壞塊中,塊的內容在邏輯上不一致。 邏輯壞塊的示例包括行或索引條目的損壞。 如果RMAN檢測到邏輯損壞,則會將該塊記錄在告警日誌和伺服器會話跟蹤檔案中。

預設情況下,RMAN不檢查邏輯損壞。 但是,如果在BACKUP命令上指定CHECK LOGICAL,則RMAN會對資料和索引塊進行邏輯損壞(例如行片或索引條目的損壞)進行測試,並將其記錄在位於自動診斷資訊庫(ADR)中的告警日誌中, 如果在備份或恢復檔案時使用具有以下配置的RMAN,則它會檢測可能檢測到的所有型別的塊損壞:

  • 在資料庫的初始化引數檔案中,設定DB_BLOCK_CHECKSUM = typical,以便資料庫自動計算資料檔案校驗和(不用於備份,而是用於資料庫使用的資料檔案)
  • 不要在BACKUP命令之前使用SET MAXCORRUPT,因為RMAN不會容忍任何未標記的塊損壞。
  • 在BACKUP命令中,不要指定NO CHECKSUM選項,方便RMAN在寫入備份時計算校驗和
  • 在BACKUP和RESTORE命令中,指定CHECK LOGICAL選項,使得RMAN能夠檢查邏輯和物理損壞

>RMAN備份中的壞塊限制

可以通過SET MAXCORRUPT 命令限制在RMAN備份的一個檔案中的未標記的壞塊的總數。預設值為0,表示Oracle不允許備份檔案中存在任何未標記的塊損壞。

如果在備份期間RMAN遇到未標記的損壞塊時超過MAXCORRUPT限制,則RMAN終止備份。 否則,RMAN將新檢測到的損壞塊寫入備份,並使用特殊標頭指示該塊已標記為已損壞。 可以使用VALIDATE命令確定哪些塊被標記為已損壞,並找到任何未標記的已損壞塊。

缺陷:

因為RMAN允許在備份中標記損壞的塊,並且可以指示RMAN允許未標記的損壞塊在備份中被標記為損壞(當使用MAXCORRUPT時),可以恢復具有被標記為損壞的塊,因此 如果備份此恢復的資料檔案(假設沒有發生新的損壞),即使沒有設定MAXCORRUPT,備份也會成功。 這是因為先前標記的損壞不會阻止RMAN完成備份。

>壞塊的檢測

Oracle資料庫支援對資料庫壞塊的監控、檢測和修復。該技術取決於損壞是塊間損壞還是塊內損壞。 在塊內損壞中,損壞發生在塊本身內。 這種損壞可以是物理的或邏輯的。 而塊間損壞只能是邏輯的。

例如,V$DATABASE_BLOCK_CORRUPTION檢視記錄intrablock損壞,而自動診斷資訊庫(ADR)跟蹤所有型別的損壞。 下表總結了資料庫如何處理不同型別的資料塊損壞。

2、使用VALIDATE命令檢查壞塊

可以使用VALIDATE命令手動檢查資料庫檔案中的物理和邏輯損壞。 此命令執行與BACKUP VALIDATE相同型別的檢查,但VALIDATE可檢查更大的物件選擇。 例如:

  • 可以使用VALIDATE DATAFILE ... BLOCK命令驗證單個塊
  • 如果指定要驗證的備份片段的副本號,請執行VALIDATE FROM COPY NUMBER命令。
  • 當驗證整個檔案時,RMAN檢查每個輸入檔案塊。 如果備份驗證發現先前未標記的損壞塊,則RMAN將使用描述損壞的行更新V$ DATABASE_BLOCK_CORRUPTION檢視。

若懷疑備份集中的一個或多個備份塊丟失或已損壞時,可以使用VALIDATE BACKUPSET。 此命令檢查備份集中的每個塊,以確保備份可以還原。 如果RMAN發現塊損壞,則它發出錯誤並終止驗證。 使用命令VALIDATE BACKUPSET可以選擇要檢查的備份,而RESTORE命令的VALIDATE選項允許RMAN選擇。

>使用VALIDATE命令進行有效性校驗的案例

1、開啟RMAN並連線到目標資料庫

2、根據需求執行不同的VALIDATE命令

例如:如果要校驗所有的資料檔案和控制檔案(如果有使用引數檔案的話也包含),則在RMAN中執行以下命令:

RMAN> VALIDATE DATABASE;

也可以校驗制定的備份集,使用如下命令:

RMAN> VALIDATE BACKUPSET 22;

Starting validate at 17-AUG-13
using channel ORA_DISK_1
allocated channel: ORA_SBT_TAPE_1
channel ORA_SBT_TAPE_1: SID=89 device type=SBT_TAPE
channel ORA_SBT_TAPE_1: Oracle Secure Backup
channel ORA_DISK_1: starting validation of datafile backup set
channel ORA_DISK_1: reading from backup piece
/disk1/oracle/work/orcva/RDBMS/backupset/2013_08_16/o1_mf_nnndf_
TAG20130816T153034_2g774bt2_.bkp
channel ORA_DISK_1: piece
handle=/disk1/oracle/work/orcva/RDBMS/backupset/2013_08_16/o1_mf_nnndf_
TAG20130816T153034_2g774bt2_.bkp tag=TAG20130816T153034
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
Finished validate at 17-AUG-13

以下示例說明如何檢查資料檔案中的各個資料塊是否損壞。

RMAN> VALIDATE DATAFILE 1 BLOCK 10;
 
Starting validate at 17-AUG-13
using channel ORA_DISK_1
channel ORA_DISK_1: starting validation of datafile
channel ORA_DISK_1: specifying datafile(s) for validation
input datafile file number=00001 name=/disk1/oracle/dbs/tbs_01.f
channel ORA_DISK_1: validation complete, elapsed time: 00:00:01
List of Datafiles
=================
File Status Marked Corrupt Empty Blocks Blocks Examined High SCN
---- ------ -------------- ------------ --------------- ----------
1    OK     0              2            127             481907
  File Name: /disk1/oracle/dbs/tbs_01.f
  Block Type Blocks Failing Blocks Processed
  ---------- -------------- ----------------
  Data       0              36
  Index      0              31
  Other      0              58

Finished validate at 17-AUG-13

>並行的資料檔案校驗

如果驗證大資料檔案,RMAN可以通過將檔案劃分為多個部分並行處理每個部分。 如果配置或分配多個通道,並且希望通道進行並行驗證,則指定VALIDATE命令的SECTION SIZE引數。

如果指定的段大小大於檔案的大小,則RMAN不會建立檔案段。 如果指定的小段大小將產生超過256個段,則RMAN將段大小增加到導致正好256個段的值。

並行校驗的實現過程如下:

1、開啟RMAN並連線到目標資料庫,目標資料庫必須是mount或者open狀態 。

2、執行包含section size引數的VALIDATE命令:以下命令設定了兩個Channel校驗一個大資料檔案,分割槽大小設定為1200MB。

RUN
{
  ALLOCATE CHANNEL c1 DEVICE TYPE DISK;
  ALLOCATE CHANNEL c2 DEVICE TYPE DISK;
  VALIDATE DATAFILE 1 SECTION SIZE 1200M;
}

3、使用BACKUP VALIDATE 校驗資料檔案

可以使用BACKUP VALIDATE命令執行以下操作:

  • 檢查資料檔案的物理或者邏輯壞塊
  • 確保所有的資料庫檔案都存在並且存放在正確的位置

當執行BACKUP VALIDATE時,RMAN讀取要完整備份的檔案,與在實際備份過程中一樣。 但是,RMAN實際上不會生成任何備份集或映像副本。

注意

不能將BACKUPSET,MAXCORRUPT或PROXY引數與BACKUP VALIDATE一起使用。 要驗證特定的備份集,需要執行VALIDATE命令

以下是使用BACKUP VALIDATE命令校驗的示例:

1、開啟RMAN並連線到目標資料庫和恢復的catalog資料庫(如果有的話)

2、執行BACKUP VALIDATE命令

例如:校驗所有資料庫檔案和歸檔日誌檔案能夠被正常備份的語句如下,該語句僅用於校驗物理壞塊。

BACKUP VALIDATE 
  DATABASE 
  ARCHIVELOG ALL;

如果要校驗邏輯壞塊,則使用上述命令的以下變體:

BACKUP VALIDATE 
  CHECK LOGICAL 
  DATABASE 
  ARCHIVELOG ALL;

在前面的示例中,RMAN客戶端顯示的輸出與真正備份檔案時的輸出相同。 如果RMAN無法備份一個或多個檔案,那麼它會發出錯誤訊息。 例如,RMAN可能會顯示類似以下內容的輸出:

RMAN-00571: ========================================
RMAN-00569: ====== ERROR MESSAGE STACK FOLLOWS =====
RMAN-00571: ========================================
RMAN-03002: failure of backup command at 08/29/2013 14:33:47
ORA-19625: error identifying file /oracle/oradata/trgt/arch/archive1_6.dbf
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3

4、還原備份之前校驗其有效性

可以執行RESTORE ... VALIDATE來測試RMAN是否可以從備份恢復特定檔案或一組檔案。 RMAN選擇要使用的備份。

使用 該命令資料庫必須mount或者open。 在驗證資料檔案的還原時,不必使資料檔案離線,因為資料檔案的備份驗證僅讀取備份,並且不會影響生產資料檔案。

在驗證磁碟或磁帶上的檔案時,RMAN讀取備份片段或映像副本中的所有塊。 RMAN還驗證異地備份, 驗證與真正的恢復操作相同,除了RMAN不寫入輸出檔案。

RMAN還允許指定要驗證的備份片段的副本號。

示例如下:

1、執行具有VALIDATE引數的RESTORE命令。以下語句校驗所有資料庫檔案包含歸檔日誌的還原

RESTORE DATABASE VALIDATE;
RESTORE ARCHIVELOG ALL VALIDATE;

如果沒有看到RMAN錯誤棧,則跳過後續步驟。 缺少錯誤訊息意味著RMAN已經確認它可以在真正的恢復和恢復期間成功使用這些備份。

如果在輸出和RMAN-06026訊息中看到錯誤,請查詢問題的原因。 如果可能,阻止RMAN驗證備份並重試驗證的問題。

以下錯誤表示RMAN無法從可用備份還原一個或多個指定的檔案:

RMAN-06026: some targets not found - aborting restore

以下示例輸出顯示RMAN在讀取指定備份時遇到問題:

RMAN-03009: failure of restore command on c1 channel at 12-DEC-12 23:22:30
ORA-19505: failed to identify file "oracle/dbs/1fafv9gl_1_1"
ORA-27037: unable to obtain file status
SVR4 Error: 2: No such file or directory
Additional information: 3

5、CDB和PDB的校驗

RMAN能夠驗證多租戶下CDB和PDB, 可以選擇為要為CDB和PDB驗證的備份片段指定副本號。

本章中的所有過程都適用於CDB,其差異在以下部分中描述:

>檢查整個CDB

驗證CDB的步驟與用於驗證非CDB的步驟類似。 唯一的區別是,您必須以通用SYSBACKUP或SYSDBA許可權作為公共使用者連線到根。 然後,使用VALIDATE DATABASE和RESTORE DATABASE VALIDATE命令。

以下命令在連線到根時驗證整個CDB:

VALIDATE DATABASE;

The following command validates the root:

VALIDATE DATABASE ROOT;

>校驗PDB

使用以下方式可以校驗PDB的有效性

連線到根目錄並使用VALIDATE PLUGGABLE DATABASE或RESTORE PLUGGABLE DATABASE VALIDATE命令, 能夠驗證一個或多個PDB。

以下命令在連線到根時驗證PDB hr_pdb和sales_pdb。

VALIDATE PLUGGABLE DATABASE hr_pdb, sales_pdb;

連線到PDB並使用VALIDATE DATABASE和RESTORE DATABASE VALIDATE命令僅驗證一個PDB。 此處使用的命令與您將用於非CDB的命令相同。

以下命令在連線到PDB時驗證資料庫的還原。

RESTORE DATABASE VALIDATE;

以上就是今天要分享的關於備份的有效性檢查。更多內容請訪問官方文件。如有疑問歡迎加入雲和恩墨大講堂與專家交流探討。

2017,一起進步。