Mysql

驗證 mysqldump 備份是否損壞

  • September 19, 2017

我們有一個 cron 任務使用備份我們的數據庫mysqldump- 我主要擔心的是損壞,每次手動導入和檢查備份的不足是什麼是檢查/驗證備份無損壞的最佳方法?

**背景:*我們正在執行 mysql 5.5. 和 InnoDB。我們mysqldump直接從伺服器執行。我們目前沒有使用主/從或主/主,但如果有幫助可以更改。數據庫目前小於 1mb,在可預見的將來會小於 50mb,因此在這種情況下確實需要考慮規模。

您需要考慮兩件事

備份過程

確實沒有什麼可以替代還原。這只是 mysqldump 的重播。如果您需要執行PITR,您可能需要針對適用的二進制日誌執行mysqlbinlog並將事件播放到所需的日期和時間。

您應該定期執行此操作,以防 mysqldump 所在的磁碟壞了,或者 mysqldump 在 BLOB 中包含一系列字元而無法恢復。

備份完整性

您應該能夠毫無問題地啟動 mysqld。執行 mysqld 後,您需要測試每個表的可用性。您可以通過執行以下查詢來做到這一點:

SELECT CONCAT('CHECK TABLE ',dbtb,';') FROM
(SELECT CONCAT(table_schema,'.',table_name) dbtb FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

這將為每個 MyISAM、InnoDB、ARCHIVE 和 CSV 表創建一個CHECK TABLE命令來檢查它們的完整性。您可以將其輸出到腳本並執行該腳本。CHECK TABLE 命令還可以讓您將所有表作為單個命令進行檢查。您可以更改查詢以將表名收集為逗號分隔的列表並添加:

SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
(SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
information_schema.tables WHERE table_schema NOT IN
('information_schema','performance_schema','mysql')) A;

**警告:**該GROUP_CONCAT()函式的預設限制為 1024 個字元。如果您的表數量適中,則不會列出所有表,並且列出的最後一個表將被截斷,從而導致錯誤。您可以在命令前加上SET SESSION group_concat_max_len = 10000;以增加返回的長度。

這是我筆記型電腦上 MySQL 5.6.16 (Windows) 的範例:

mysql> SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM
   -> (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM
   -> information_schema.tables WHERE table_schema NOT IN
   -> ('information_schema','performance_schema','mysql')) A;
+----------------------------------------------------------------------------+
| CONCAT('CHECK TABLE ',dbtblist,';')                                        |
+----------------------------------------------------------------------------+
| CHECK TABLE ayman.articles,ayman.topics,test.nuoji,test.prod,test.prodcat; |
+----------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql>

然後,將該輸出儲存到一個變數並從命令行執行。請注意,我們group_concat_max_len在執行命令之前暫時增加了。

MYSQL_USER=root
MYSQL_PASS=rootpass
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SET SESSION group_concat_max_len = 1048576;"
SQL="${SQL} SELECT CONCAT('CHECK TABLE ',dbtblist,';') FROM"
SQL="${SQL} (SELECT GROUP_CONCAT(table_schema,'.',table_name) dbtblist FROM"
SQL="${SQL} information_schema.tables WHERE table_schema NOT IN"
SQL="${SQL} ('information_schema','performance_schema','mysql')) A"
mysql ${MYSQL_CONN} -ANe"${SQL}" | mysql ${MYSQL_CONN}

試一試 !!!

驗證備份的最佳方法是從中恢復數據庫。

這樣做的另一個原因是減少了恢復時間。

引用自:https://dba.stackexchange.com/questions/60755