Binlog(二進位日誌)記錄所有對資料發生或潛在發生更改的 SQL 語句,以二進位形式儲存於磁碟。預設位於資料目錄,檔名格式為 hostname-bin.xxxxxx,每次重啟 MySQL 會生成新檔案。
編輯 my.cnf:
[mysqld] log_bin = mysql-bin server_id = 1
重啟後驗證:
mysql> SHOW VARIABLES LIKE '%log_bin%';
| 格式 | 說明 | 優點 | 缺點 |
|---|---|---|---|
| Statement (SBR) | 記錄每條修改資料的 SQL 語句 | 日誌量小、IO 少、效能較好 | 需記錄執行上下文;特定函數(UUID、USER、SYSDATE 等)導致主從不一致;INSERT...SELECT 產生更多行鎖 |
| Row (RBR) | 僅記錄哪一行被修改成什麼樣 | 日誌內容清晰、無存儲過程/函數/觸發器複制問題、主從一致性最強 | 大量修改(如 UPDATE 全表、ALTER TABLE)會產生海量日誌、IO 壓力大 |
| Mixed | 一般語句用 Statement,無法複制的場景自動切換 Row | 折衷方案,MySQL 自動判斷 | 仍可能因 Row 格式導致日誌暴增 |
無法被 Statement 格式複制的函數: LOAD_FILE()、UUID()、USER()、FOUND_ROWS()、SYSDATE()(除非啟用 --sysdate-is-now)。
DB 主機硬體故障宕機,重啟失敗導致資料損壞,mysqldump 備份也失敗。所幸之前已啟用 Binlog,可從 Binlog 提取資料。
mysqlbinlog 解析並導入:/app/mysql/bin/mysqlbinlog bin-log.xxx | /app/mysql/bin/mysql
Row 格式下,mysqlbinlog 輸出的 SQL 為 Base64 編碼,需加參數解碼:
/opt/mysql/bin/mysqlbinlog \ --base64-output=decode-rows -v \ --start-date='2014-09-16 14:00:00' \ --stop-date='2014-09-16 14:20:00' \ /opt/mysql/log/mysql-bin.000017 \ > /opt/mysql_bak/mysqlbinlogsql_restore_2014091614.sql
--base64-output=decode-rows:解碼 Row 格式的 Base64 內容。-v:詳細模式,重構 SQL 語句。--start-date / --stop-date:按時間範圍過濾。--start-position / --stop-position:按位置點過濾(更精確)。--database:僅解析指定資料庫的事件。expire_logs_days 避免磁碟撐爆。log_slave_updates=ON),便於級聯恢復。