mysql 二进制日志详解_Mysql二进制日志详解
引言
注:圖片取自網絡
提一下比較重要的幾個:
重做日志(Redo Log):重做日志是實現mysql事務的持久性的原理之一,當新增數據時,Redo Log會備份新數據,在事務提交前,只要持久化Redo Log即可,而不需要持久化實際數據,如果這時候mysql系統崩潰,雖然數據還沒有持久化新增數據,但是Redo Log已經持久化了,系統可以根據Redo Log內容將數據恢復到最新的狀態。
回滾日志(Undo Log):回滾日志是實現mysql事務的原子性和一致性的原理之一,在操作任何數據之前,會先將數據備份到某個地方(這個存儲數據備份的地方稱為Undo Log),然后進行數據的修改,當修改發生錯誤或用戶執行了Rollback回滾操作,系統就會根據Undo Log恢復到事務執行之前的狀態。
二進制日志(binlog):MySQL的二進制日志是MySQL服務層的日志之一。其記錄了所有對MySQL數據庫的CRUD事件,包括增刪改查和對表的系列操作記錄,其記錄的日志都是經過comomit的操作,對于失敗、回滾或未提交的操作不會記錄。通過mysql的二進制日志增量,可以較好到的實現mysql的復制和備份。
慢查日志(slow_query_log):參考我的這篇文章https://blog.csdn.net/fanrenxiang/article/details/83687241
中繼日志(relay_log):這個日志暫時還沒怎么研究過,只知道在mysql主從復制時候用到了,從服務器上會將二進制日志寫入relay_log,然后從服務器再重放relay_log來實現mysql復制功能。
三種二進制日志格式
statement:基于SQL語句的形式,采用這種格式的話,你的二進制日志文件里記錄的就是你執行的SQL語句,例如你執行的是delete from table where id<100;那記錄的就是該條SQL,個人覺得記錄的比較"粗糙";
row:行格式記錄二進制日志,記錄的是SQL對應的每一行的操作,粒度比statement細,也是推薦的格式;
mixed:混合格式,由mysql自己決定什么時候用row,什么時候用statement;
mysql> show variables like '%log_bin%'; #查看二進制相關信息
+---------------------------------+---------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/data/mysql-bin |
| log_bin_index | /usr/local/mysql/data/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.01 sec)
mysql> show variables like '%binlog_format%'; #查看二進制日志格式
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+
1 row in set (0.00 sec)
二進制日志若未開啟,在 /etc/my.cnf 中的[mysqld]下面加上即可開啟
[mysqld]
log-bin=/logs/mysql-bin ##二進制日志存放位置
binlog_format=statement ##二進制日志格式
或者執行如下命令即可
mysql> set global binlog_format=MIXED;
如果你沒顯式的配置二進制日志的目錄位置,默認在${mysql安裝目錄}/data/下。
二進制日志格式對比
binlog_format=statement
日志記錄量較小,節約磁盤空間和網絡IO
非確定行函數復制可能失敗,主從復制存在不一致風險
binlog_format=row
避免主從復制不一致問題,復制效率高于statement
日志記錄量大于statement,自然就消耗多一些的磁盤和IO
binlog_format=mixed
根據sql語句由系統決定使用row還是statement格式
可以使用下面語句修改日志格式:
mysql>set global binlog_format=row;
當binlog_format=statement時數據庫進行批量操作時,如update tablename set column1=‘foo’ where id>2,則statement格式只記錄此條sql,而row格式則會記錄每一行的修改操作。
mysql 5.7版本開始,其二進制日志格式默認為row。其中,row格式中細化的binlog_row_image屬性又可設置為FULL、MINIMAL、NOBLOB 類型,這里推薦使用binlog_row_img=MINIMAL。
mysql> show variables like 'binlog_row_image'; //查詢row格式
mysql> set global binlog_row_image=minimal; //設置row格式
如何選擇mysql的二進制日志格式
推薦使用binlog_format=mixed,若復制操作走的是內網操作,則可以選擇row格式來確保主從復制一致性,同時選擇binlog_row_image=minial格式來減少磁盤占用和網絡IO。
binlog_format=statement還是binlog_format=row決定了復制方式是基于sql語句的復制還是基于行的復制,其優缺點大致參考這兩種日志格式對應的優缺點。
二進制日志的記錄時機
二進制日志文件的記錄可以是同步或者異步,寫入時機在mysql事務提交之后,主要由sync_binlog參數決定,當sync_binlog=1表示最高安全級別的寫入(最大程度的保證事務不丟失)
mysql> show variables like '%sync_binlog%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| sync_binlog | 1 |
+---------------+-------+
1 row in set (0.01 sec)
二進制日志的文件大小
單個二進制日志文件的大小限制,可以通過以下命令查看
mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name | Value |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.01 sec)
如果超過了這個限制,則會自動滾動清理,也就是由之前的mysql-bin.000001變為mysql-bin.000002。
通過show master logs;命令來查看當前二進制日志文件數。
二進制日志文件的滾動清理
上面說到,超過限制大小后會自動生成新的二進制日志文件,這里說的是這些日志文件的刪除
mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| expire_logs_days | 0 |
+------------------+-------+
1 row in set (0.01 sec)
如上是0,表示不過期,如果我設置為2,表示超過兩天的二進制日志會被自動刪除。
也可以手動 flush logs;來顯式的進行二進制日志文件的滾動清理。
引申文章:
Mysql主從復制-基于GTID復制(https://blog.csdn.net/fanrenxiang/article/details/70197004)
Mysql主從復制-基于日志點復制(https://blog.csdn.net/fanrenxiang/article/details/70194707)
總結
以上是生活随笔為你收集整理的mysql 二进制日志详解_Mysql二进制日志详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 5.7 循环语句_MySQL
- 下一篇: mysql unlix下载_系统(PHP