驗證 mysqldump 備份是否損壞
我們有一個 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}
試一試 !!!
驗證備份的最佳方法是從中恢復數據庫。
這樣做的另一個原因是減少了恢復時間。