文章目錄
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
總結
只有注入思想的博客纔是好的博客