為 MySQL/MariaDB 開啟 Binlog 功能
介紹
說到 Binlog 就不得不提一下 SQL/">MySQL Server 的四種類型的日誌:Error Log、General Query Log、Slow Query Log 和 Binary Log 。
Error Log即 錯誤日誌,記錄 mysqld 發生的一些錯誤。
General Query Log即 一般查詢日誌,記錄 mysqld 正在做的事情,如客戶端的連線和斷開、來自客戶端每條 Sql Statement 記錄資訊;如果你想準確知道客戶端究竟傳了什麼內容給服務端,這個日誌就非常管用了,當然了這貨非常影響效能。
Slow Query Log即 慢查詢日誌,記錄一些查詢執行較慢的 SQL 語句,這個日誌非常常用,主要是給開發者調優用的。
Binary Log簡稱 Binlog 即 二進位制日誌檔案,這個檔案記錄了mysql所有的 DML 操作。通過 Binlog 日誌我們可以做資料恢復,做主主複製和主從複製等等。對於開發者可能對 Binlog 並不怎麼關注,但是對於運維或者架構人員來講是非常重要的。
簡而言之,Binlog 兩個重要的用途——複製和恢復,很多十分好用的 MySQL 體驗比如說增量備份,回滾至指定時間以及上面提到的主主和主從等等都依賴於 Binlog。
Binlog 有三種模式:
- STATEMENT:顧名思義,STATEMENT 格式的 Binlog 記錄的是資料庫上執行的原生SQL語句
- ROW:這種格式的 Binlog 記錄的是資料表的行是怎樣被修改的。
- MIXED:混合模式,如果設定了這種格式,MariaDB / MySQL 會在一些特定的情況下自動從 STATEMENT 格式切換到 ROW 格式。例如,包含 UUID 等不確定性函式的語句,引用了系統變數的語句等等。
開啟 Binlog
像一些公有云上的雲資料庫一般都是預設開始 Binlog 的,不需要人為干涉,如果是自建的 MySQL 一般是不開啟的。
檢查是否開啟
登入 MySQL ,執行 SQL :
show global variables like 'log_bin';
會返回一個如下的結果:
+---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin| OFF| +---------------+-------+ 1 row in set (0.001 sec)
如果返回的是log_bin| OFF
那麼就是沒有開啟,ON
則是已經開啟
設定開啟
修改my.cnf
檔案,一般來說都位於/etc/my.cnf
這邊,部分像 MariaDB 可能是修改/etc/my.cnf.d/server.cnf
檔案。
在[mysqld]
下寫入如下內容:
log_bin=/var/lib/mysql/bin-log log_bin_index=/var/lib/mysql/mysql-bin.index expire_logs_days= 7 server_id= 0002 binlog_format= ROW
解釋一下:
log_bin = /var/lib/mysql/bin-log
, 開啟 Binlog 並寫明存放日誌的位置
log_bin_index = /var/lib/mysql/mysql-bin.index
, 指定索引檔案的位置。
expire_logs_days = 7
,刪除超出這個變數保留期之前的全部日誌被刪除
server_id = 0002
, 指定一個叢集內的 MySQL 伺服器 ID,如果做資料庫叢集那麼必須全域性唯一,一般來說不推薦 指定server_id
等於 1。
binlog_format = ROW
,設定方面提到過的三種 Binlog 的日誌模式。
更多選項:
max_binlog_size
,binary log 最大的大小
binlog_cache_size
,當前的多少事務cache在記憶體中
binlog_cache_disk_use
,當前有多少事務暫存在磁碟上的,如果這個值有數值的話,就應該要注意調優了。
max_binlog_cache_size
,最大能有多少事務cache在記憶體中
binlog_do_db
和binlog_ingore_db
,是一對控制對哪些資料庫進行收集的選項。
sync_binlog
,這個值控制cache的資料commit多少次才刷到磁碟上。預設是0,也就是讓資料庫自己決定同步的頻率。如設定成1的話,則每commit一次就會將cache的資料同步到磁碟上,這樣做最安全,但是效能最差。
最後就是重啟一下資料庫:
service mysql restart
或者
service mysqld restart
繼續檢查一下是否開啟
登入 MySQL ,執行 SQL :
show global variables like 'log_bin';
這下應該就是返回ON
了
MariaDB [(none)]>show global variables like 'log_bin'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | log_bin| ON| +---------------+-------+ 1 row in set (0.001 sec)
來自我的部落格:ofollow,noindex" target="_blank">https://www.mf8.biz/enable-binlog/