必知必會:Binlog 詳解

Binlog 介紹

binlog 是記錄所有數據庫表結構變更(例如CREATE、ALTER TABLE…)以及表數據修改(INSERT、UPDATE、DELETE…)的二進制日誌。

binlog 不會記錄 SELECT 和 SHOW 這類操作,因爲這類操作對數據本身並沒有修改,但你可以通過查詢通用日誌來查看MySQL 執行過的所有語句。

二進制日誌包括兩類文件:二進制日誌索引文件(文件名後綴爲.index)用於記錄所有的二進制文件,二進制日誌文件(文件名後綴爲.00000*)記錄數據庫所有的DDL和DML(除了數據查詢語句)語句事件。

Binlog 模式

binlog有三種模式:ROW(行模式), Statement(語句模式), Mixed(混合模式)

行模式:ROW

記錄那條數據修改了,注意:記錄的是這條記錄的全部數據,即使只更新了一個字段,binlog裏也會記錄所有字段的數據

優缺點 介紹
優點 不記錄 sql 語句的上下文信息,日誌內容會非常清楚的記錄每條數據詳細的變更細節, 即使只更新了一個字段,binlog 裏也會記錄所有字段的數據
缺點 binlog 日誌會非常大,mysql 主從同步時,會產生大量磁盤 IO

語句模式:Statement

每一條會修改數據的sql都會記錄在binlog中

優缺點 介紹
優點 不需要記錄每一行的變化,減少了 binlog 日誌量,節約了 IO,提高性能
缺點 由於記錄的只是執行語句,爲了這些語句能在 slave 上正確運行,因此還必須記錄每條語句 在執行的時候的一些相關信息,以保證所有語句能在 slave 得到和在 master 端執行時候相同 的結果。另外 mysql 的複製,像一些特定函數功能,slave 可與 master 上要保持一致會有很多相關問題

混合模式:Mixed

在Mixed模式下,一般的語句修改使用statment格式保存binlog,如一些函數,statement無法完成主從複製的操作,則採用row格式保存binlog,MySQL會根據執行的每一條具體的sql語句來區分對待記錄的日誌形式,也就是在Statement和Row之間選擇一種

查看、開啓

查看 mysql 是否開啓 binlog

# ON爲開啓、OFF爲關閉,默認是關閉
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin       | ON    |
+---------------+-------+
1 row in set (0.00 sec)

查看 mysql 的 binlog 模式

# 三種模式,MySQL5.7中默認爲:Statement
mysql> show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.00 sec)

通過配置文件開啓 binlog

[root@Fp-01 ~]# vim /etc/my.cnf 
[mysqld]
server-id=1		# 主從參數
log-bin=mysql-bin	# 開啓 binlog
binlog-format=ROW	# 指定 binlog 模式

MySQL 中 binlog 相關命令

# 獲取 binlog 文件日誌列表
mysql> show binary logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       106 |
+------------------+-----------+
1 row in set (0.00 sec)


# 查看當前正在寫入的 binlog 文件
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      106 |              |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

# 查看 master 的 binlog 文件
mysql> show master logs;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 |       106 |
+------------------+-----------+
1 row in set (0.00 sec)


# 查看第一個 binlog 文件內容
mysql> show binlog events;
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
| mysql-bin.000001 |   4 | Format_desc |         1 |         106 | Server ver: 5.1.73-log, Binlog ver: 4 |
+------------------+-----+-------------+-----------+-------------+---------------------------------------+
1 row in set (0.00 sec)

MySQL 擴展

創建一個新的數據庫會在目錄中生成什麼

# 創建一個新數據庫
mysql> create database aaa;
Query OK, 1 row affected (0.00 sec)

# 退出
mysql> \q
Bye

# 生成一個 aaa 的目錄
[root@Fp-01 ~]# ls /var/lib/mysql
aaa  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.sock  test

# 進入目錄,生成文件,存放的數據庫的默認字符集
[root@Fp-01 ~]# ls /var/lib/mysql/aa
db.opt

總結

只有注入思想的博客纔是好的博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章