mysql binlog 基礎 & 實戰
摘抄自: https://juejin.cn/post/6892397821152985102?utm_source=gold_browser_extension#heading-8
1. binlog簡介
binlog在mysql 3.23.14
被首次引入,是 mysql server 例項產生的二進位制日誌
,記錄的是mysql所有更新資料及可能更新資料(例如一個未命中任何行的delete語句)的語句,binlog與mysql使用的儲存引擎無關,無論使用innodb還是myisam,都會產生相同的binlog。
binlog還包括其他的一些元資料,例如:
- 重新生成語句的mysql server 的狀態資訊
- Error code
- 維護bin log所需要的元資料,例如 rotate events
binlog是mysql在一系列操作中維護的mysql server的全域性狀態的變更鏈路。更通俗一點的說,bin log描述了用於重現mysql server上曾經發生過的所有全域性狀態變更事件。
型別
有三種binlog型別,分別是基於sql語句的日誌(statement base)、基於行的日誌(row base)、混合日誌(mixed base)
- statement base
日誌中包含了引起資料變更的sql,例如insert、update、delete等。
缺點:只保留了sql變更,強依賴各個sql的上下文關係,強依賴主從間的完全一致,例如主從複製時可能會有函式表現不一致(例如sleep,current_timestamp)。
- row base(since mysql 5.1)
日誌中包含了有效的行變更
缺點:保留了資料變更,會產生大量的資料檔案,例如一條update語句產生的binlog可能都會是巨量的。
- mixed base
預設會使用statement日誌,在必要的情況下會切換到row日誌。
用途
主從同步
mysql支援高併發的關鍵,主從同步一般也都會和讀寫分離進行繫結,主庫用於寫入,從庫們進行讀取,這樣可以用從庫分擔大量的讀請求,提升mysql整體的效能。binlog記錄了mysql master節點的資料變更。slave節點通過訂閱的方式,定期同步master的bin log記錄,slave節點將未執行的binlog記錄到relay log 中,relay log和bin log的格式相同。slave節點通過對relay log進行解析、執行,來重現在mysql master節點上發生的變更。
Mysql 主從同步流程
開啟log-bin選項
要保證開啟log-bin
選項,mysql才會寫入binlog,如下
mysql> show variables like '%log_bin%';
+---------------------------------+--------------------------------+
| Variable_name | Value |
+---------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+--------------------------------+
6 rows in set (0.00 sec)
如果發現log_bin為OFF狀態,在/etc/mysql/mysql.conf.d/mysqld.cnf 中 寫入
複製程式碼
log-bin=on
資料備份/恢復
複製程式碼
部分的資料恢復。在mysql用備份檔案進行還原後,將會重新執行在備份檔案後記錄的bin log,這些bin log 保證了mysql 資料不會丟,資料備份。
2. 實戰主從同步 & 資料恢復
以下示例使用 docker for mac,後續可以出一期docker的基本使用