MySQL二進制日志回放指的是將先前記錄在二進制日志中的SQL語句重新執行一遍,以達到更新數據的效果。既然是回放,那么肯定是需要將先前的SQL語句保存下來,這就需要MySQL的二進制日志功能。
MySQL二進制日志的使用可以分為兩件事情:開啟二進制日志和配置MySQL實例。二進制日志的開啟可以在MySQL的配置文件中進行配置,將log-bin選項設置為所需的值即可。該選項可以設置為任意字符串,是一個文件名的前綴,MySQL會在該前綴后添加一些其他信息來構成二進制日志的全名。
# 在MySQL的配置文件中添加如下內容 [mysqld] log_bin = /var/lib/mysql/bin-logs/mysql-bin
設置好二進制日志的路徑后,還需要對MySQL實例做一些配置。MySQL實例中的參數binlog_format可以指定二進制日志的格式,MySQL支持三種格式:
- STATEMENT:記錄SQL語句
- ROW:記錄行的變化
- MIXED:自動根據SQL語句的類型選擇使用STATEMENT或者ROW格式
選擇使用哪種格式需要根據具體的業務需求來確定,其中MIXED是最為常用的格式。
配置完畢后,MySQL就會將所有修改數據庫的SQL語句記錄在二進制日志中。接下來只需要將這些記錄下來的SQL語句回放一遍就可以實現數據的更新操作。回放可以使用MySQL提供的mysqlbinlog工具,通過指定二進制日志的路徑和時間點來實現,如下所示:
# 回放指定時間點之后的SQL語句 mysqlbinlog /var/lib/mysql/bin-logs/mysql-bin.000001 -d db_name -t tb_name --start-datetime="2022-09-01 00:00:00" # 回放指定時間點之前的SQL語句 mysqlbinlog /var/lib/mysql/bin-logs/mysql-bin.000001 -d db_name -t tb_name --stop-datetime="2022-09-01 00:00:00"
mysqlbinlog工具會將回放的SQL語句輸出到標準輸出中,可以通過管道符將其導入到mysql命令行中執行。
回放二進制日志的過程還需要注意一點:在回放過程中,MySQL會將原始的SQL語句和回放的SQL語句都記錄下來,這個過程叫做復制。在復制過程中,如果遇到相同的主鍵或者唯一鍵的數據,MySQL會選擇跳過該行數據,并在回放過程中將該行數據標記為警告。如果需要強制回放,則可以在mysqlbinlog命令中添加-f選項。