mysql-bin_MySQL - binlog日志简介及设置
基本概念
binlog是Mysql sever層維護的一種二進制日志,與innodb引擎中的redo/undo log是完全不同的日志;其主要是用來記錄對mysql數(shù)據(jù)更新或潛在發(fā)生更新的SQL語句,記錄了所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句,并以事務(wù)的形式保存在磁盤中,還包含語句所執(zhí)行的消耗的時間,MySQL的二進制日志是事務(wù)安全型的。
一般來說開啟二進制日志大概會有1%的性能損耗(參見MySQL官方中文手冊 5.1.24版)。
作用主要有:
復(fù)制:MySQL Replication在Master端開啟binlog,Master把它的二進制日志傳遞給slaves并回放來達到master-slave數(shù)據(jù)一致的目的
數(shù)據(jù)恢復(fù):通過mysqlbinlog工具恢復(fù)數(shù)據(jù)
增量備份
二進制日志包括兩類文件:二進制日志索引文件(文件名后綴為.index)用于記錄所有的二進制文件,二進制日志文件(文件名后綴為.00000*)記錄數(shù)據(jù)庫所有的DDL和DML(除了數(shù)據(jù)查詢語句)語句事件。
日志管理
開啟binlog
修改配置文件 my.cnf
配置 log-bin 和 log-bin-index 的值,如果沒有則自行加上去。
log-bin=mysql-bin
log-bin-index=mysql-bin.index
這里的 log-bin 是指以后生成各 Binlog 文件的前綴,比如上述使用master-bin,那么文件就將會是master-bin.000001、master-bin.000002 等。
log-bin-index 則指 binlog index 文件的名稱,這里我們設(shè)置為master-bin.index,可以不配置。
命令查看配置
binlog開啟后,可以在配置文件中查看其位置信息,也可以在myslq命令行中查看:
mysql> show variables like '%log_bin%';
+---------------------------------+---------------------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------------------+
| log_bin | ON |
| log_bin_basename | D:\Program Files\MySQL\data\mysql-bin |
| log_bin_index | D:\Program Files\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.07 sec)
查看binlog文件列表
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 202 | No |
| mysql-bin.000002 | 2062 | No |
+------------------+-----------+-----------+
2 rows in set (0.07 sec)
binlog文件開啟binlog后,會在數(shù)據(jù)目錄(默認)生產(chǎn)host-bin.n(具體binlog信息)文件及host-bin.index索引文件(記錄binlog文件列表)。當(dāng)binlog日志寫滿(binlog大小max_binlog_size,默認1G),或者數(shù)據(jù)庫重啟才會生產(chǎn)新文件,但是也可通過手工進行切換讓其重新生成新的文件(flush logs);另外,如果正使用大的事務(wù),由于一個事務(wù)不能橫跨兩個文件,因此也可能在binlog文件未滿的情況下刷新文件。
查看日志狀態(tài)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 | 2062 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.08 sec)
顯示正在寫入的二進制文件,及當(dāng)前position
刷新日志
mysql> flush logs;
Query OK, 0 rows affected (0.12 sec)
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 202 | No |
| mysql-bin.000002 | 2109 | No |
| mysql-bin.000003 | 155 | No |
+------------------+-----------+-----------+
3 rows in set (0.07 sec)
自此刻開始產(chǎn)生一個新編號的binlog日志文件
每當(dāng)mysqld服務(wù)重啟時,會自動執(zhí)行此命令,刷新binlog日志;在mysqldump備份數(shù)據(jù)時加 -F 選項也會刷新binlog日志;
重置(清空)所有binlog日志
mysql> reset master;
常用命令
mysqlbinlog查看日志
D:\Program Files\MySQL
$ bin\mysqlbinlog data\mysql-bin.000002
在MySQL5.5以下版本使用mysqlbinlog命令時如果報錯,就加上 “--no-defaults”選項
mysqlbinlog是mysql官方提供的一個binlog查看工具,
也可使用–read-from-remote-server從遠程服務(wù)器讀取二進制日志,
還可使用--start-position --stop-position、--start-time= --stop-time精確解析binlog日志
內(nèi)容:
BINLOG '
K3L4XBMBAAAARQAAAHEGAAAAAJoCAAAAAAEACmxvbmdodWJhbmcABXRoZW1lAAUDDwUREQWWAAgA
AAABAQACASGhIgQL
K3L4XB4BAAAAPQAAAK4GAAAAAJoCAAAAAAEAAgAF/wA0AQAABGFhYWEAAAAAAMBYQFz4citc+HIr
sXjMIA==
'/*!*/;
# at 1710
#190606 9:53:47 server id 1 end_log_pos 1741 CRC32 0xddb08f33 Xid = 216
COMMIT/*!*/;
# at 1741
#190606 9:53:47 server id 1 end_log_pos 1820 CRC32 0x166b4128 Anonymous_GTID last_committed=5 sequence_number=6 rbr_only=yes original_committed_timestamp=1559786027387679 immediate_commit_timestamp=15597860273
transaction_length=321
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
# original_commit_timestamp=1559786027387679 (2019-06-06 09:53:47.387679 ?D1ú±ê×?ê±??)
# immediate_commit_timestamp=1559786027387679 (2019-06-06 09:53:47.387679 ?D1ú±ê×?ê±??)
/*!80001 SET @@session.original_commit_timestamp=1559786027387679*//*!*/;
/*!80014 SET @@session.original_server_version=80016*//*!*/;
/*!80014 SET @@session.immediate_server_version=80016*//*!*/;
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 1820
#190606 9:53:47 server id 1 end_log_pos 1901 CRC32 0x47def222 Query thread_id=10 exec_time=0 error_code=0
SET TIMESTAMP=1559786027/*!*/;
BEGIN
/*!*/;
# at 1901
#190606 9:53:47 server id 1 end_log_pos 1970 CRC32 0x5a235198 Table_map: `longhubang`.`theme` mapped to number 666
# at 1970
#190606 9:53:47 server id 1 end_log_pos 2031 CRC32 0x62dc1928 Write_rows: table id 666 flags: STMT_END_F
show binlog events查看binlog日志
A.查詢第一個(最早)的binlog日志:
mysql> show binlog events;
B.指定查詢 mysql-bin.000021 這個文件:
mysql> show binlog events in 'mysql-bin.000021';
C.指定查詢 mysql-bin.000021 這個文件,從pos點:8224開始查起:
mysql> show binlog events in 'mysql-bin.000021' from 8224;
D.指定查詢 mysql-bin.000021 這個文件,從pos點:8224開始查起,查詢10條
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10;
E.指定查詢 mysql-bin.000021 這個文件,從pos點:8224開始查起,偏移2行,查詢10條
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10;
內(nèi)容:
mysql> show binlog events in 'mysql-bin.000002' from 1710 limit 10;
+------------------+------+----------------+-----------+-------------+--------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+--------------------------------------+
| mysql-bin.000002 | 1710 | Xid | 1 | 1741 | COMMIT /* xid=216 */ |
| mysql-bin.000002 | 1741 | Anonymous_Gtid | 1 | 1820 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000002 | 1820 | Query | 1 | 1901 | BEGIN |
| mysql-bin.000002 | 1901 | Table_map | 1 | 1970 | table_id: 666 (longhubang.theme) |
| mysql-bin.000002 | 1970 | Write_rows | 1 | 2031 | table_id: 666 flags: STMT_END_F |
| mysql-bin.000002 | 2031 | Xid | 1 | 2062 | COMMIT /* xid=223 */ |
| mysql-bin.000002 | 2062 | Rotate | 1 | 2109 | mysql-bin.000003;pos=4 |
+------------------+------+----------------+-----------+-------------+--------------------------------------+
7 rows in set (0.14 sec)
數(shù)據(jù)恢復(fù)
完全備份
D:\Program Files\MySQL
$ bin\mysqldump -h127.0.0.1 -p3306 -uroot -phongda$123456 -lF -B longhubang >D:\data\backup\longhubang.dump
mysqldump: [Warning] Using a password on the command line interface can be insecure.
注意要創(chuàng)建好D:\data\backup文件夾。
這里使用了-lF,注意必須大寫F,當(dāng)備份工作剛開始時系統(tǒng)會刷新log日志,產(chǎn)生新的binlog日志來記錄備份之后的數(shù)據(jù)庫“增刪改”操作。
查看一下:
mysql> show binary logs;
+------------------+-----------+-----------+
| Log_name | File_size | Encrypted |
+------------------+-----------+-----------+
| mysql-bin.000001 | 202 | No |
| mysql-bin.000002 | 2109 | No |
| mysql-bin.000003 | 374 | No |
| mysql-bin.000004 | 155 | No |
+------------------+-----------+-----------+
4 rows in set (0.10 sec)
也就是說, mysql-bin.000004 是用來記錄完全備份命令時間之后對數(shù)據(jù)庫的所有“增刪改”操作。
Linux數(shù)據(jù)備份命令:
/usr/local/mysql/bin/mysqldump -uroot -p123456 -lF --log-error=/root/myDump.err -B zyyshop > /root/BAK.zyyshop.sql
數(shù)據(jù)恢復(fù)
經(jīng)過一段時間,數(shù)據(jù)庫出現(xiàn)問題,需要恢復(fù)
mysql> flush logs;
此時執(zhí)行一次刷新日志索引操作,重新開始新的binlog日志記錄文件,理論說 mysql-bin.000004 這個文件不會再有后續(xù)寫入了(便于我們分析原因及查找pos點),以后所有數(shù)據(jù)庫操作都會寫入到下一個日志文件;
查看binlog日志:
mysql> show binlog events in 'mysql-bin.000004';
最后一段日志內(nèi)容:
| mysql-bin.000004 | 3976 | Xid | 1 | 4007 | COMMIT /* xid=2375 */ |
| mysql-bin.000004 | 4007 | Anonymous_Gtid | 1 | 4086 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000004 | 4086 | Query | 1 | 4167 | BEGIN |
| mysql-bin.000004 | 4167 | Table_map | 1 | 4236 | table_id: 666 (longhubang.theme) |
| mysql-bin.000004 | 4236 | Delete_rows | 1 | 4505 | table_id: 666 flags: STMT_END_F |
| mysql-bin.000004 | 4505 | Xid | 1 | 4536 | COMMIT /* xid=2393 */ |
| mysql-bin.000004 | 4536 | Anonymous_Gtid | 1 | 4613 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000004 | 4613 | Query | 1 | 4736 | drop database longhubang /* xid=2411 */ |
| mysql-bin.000004 | 4736 | Rotate | 1 | 4783 | mysql-bin.000005;pos=4 |
+------------------+------+----------------+-----------+-------------+------------------------------------------+
70 rows in set (0.21 sec)
通過分析,造成數(shù)據(jù)庫破壞的pos點區(qū)間是介于4613--4736 之間,只要恢復(fù)到4613前就可。
先進行完全備份恢復(fù):
D:\Program Files\MySQL
$ bin\mysql -h127.0.0.1 -p3306 -uroot -phongda$123456 -v
binlog日志恢復(fù):
D:\Program Files\MySQL
$ bin\mysqlbinlog --stop-position=4613 data\mysql-bin.000004 | bin\mysql -h127.0.0.1 -p3306 -uroot -phongda$123456 longhubang
mysql: [Warning] Using a password on the command line interface can be insecure.
增量數(shù)據(jù)恢復(fù)語法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用戶名 -p密碼 數(shù)據(jù)庫名
常用選項:
? --start-position=953 起始pos點
? --stop-position=1437 結(jié)束pos點
? --start-datetime="2013-11-29 13:18:54" 起始時間點
? --stop-datetime="2013-11-29 13:21:53" 結(jié)束時間點
? --database=zyyshop 指定只恢復(fù)zyyshop數(shù)據(jù)庫(一臺主機上往往有多個數(shù)據(jù)庫,只限本地log日志)
?
不常用選項:
? -u --user=name Connect to the remote server as username.連接到遠程主機的用戶名
? -p --password[=name] Password to connect to remote server.連接到遠程主機的密碼
? -h --host=name Get the binlog from server.從遠程主機上獲取binlog日志
? --read-from-remote-server Read binary logs from a MySQL server.從某個MySQL服務(wù)器上讀取binlog日志
小結(jié):實際是將讀出的binlog日志內(nèi)容,通過管道符傳遞給mysql命令。這些命令、文件盡量寫成絕對路徑;
上面的binlog恢復(fù)語句也可以拆分:
D:\Program Files\MySQL
$ bin\mysqlbinlog --stop-position=4613 data\mysql-bin.000004 > D:\data\backup\004.sql
D:\Program Files\MySQL
$ bin\mysql -h127.0.0.1 -p3306 -uroot -phongda$123456 longhubang
mysql: [Warning] Using a password on the command line interface can be insecure.
.......
mysql> source D:\data\backup\004.sql
所謂恢復(fù),就是讓mysql將保存在binlog日志中指定段落區(qū)間的sql語句逐個重新執(zhí)行一次而已。
主從復(fù)制
復(fù)制是mysql最重要的功能之一,mysql集群的高可用、負載均衡和讀寫分離都是基于復(fù)制來實現(xiàn)的;從5.6開始復(fù)制有兩種實現(xiàn)方式,基于binlog和基于GTID(全局事務(wù)標(biāo)示符);本文接下來將介紹基于binlog的一主一從復(fù)制;
其復(fù)制的基本過程如下:
Master將數(shù)據(jù)改變記錄到二進制日志(binary log)中
Slave上面的IO進程連接上Master,并請求從指定日志文件的指定位置(或者從最開始的日志)之后的日志內(nèi)容
Master接收到來自Slave的IO進程的請求后,負責(zé)復(fù)制的IO進程會根據(jù)請求信息讀取日志指定位置之后的日志信息,返回給Slave的IO進程。返回信息中除了日志所包含的信息之外,還包括本次返回的信息已經(jīng)到Master端的bin-log文件的名稱以及bin-log的位置
Slave的IO進程接收到信息后,將接收到的日志內(nèi)容依次添加到Slave端的relay-log文件的最末端,并將讀取到的Master端的 bin-log的,文件名和位置記錄到master-info文件中,以便在下一次讀取的時候能夠清楚的告訴Master從某個bin-log的哪個位置開始往后的日志內(nèi)容
Slave的Sql進程檢測到relay-log中新增加了內(nèi)容后,會馬上解析relay-log的內(nèi)容成為在Master端真實執(zhí)行時候的那些可執(zhí)行的內(nèi)容,并在自身執(zhí)行
寫入機制
我們一起來看一下MySQL執(zhí)行事物的過程中 binlog 的落盤機制。MySQL是如何保證你使用的binlog是安全的!
binlog的高速緩存
首先為大家介紹一個概念:binlog的高速緩存
意思是:所有未commit的事物產(chǎn)生的binlog,都會被先記錄到binlog的高速緩存中。等該事物被commit時,再將緩存中的數(shù)據(jù)寫入binlog日志文件中。
高速緩存的大小可以由參數(shù)binlog_chache_size 默認大小為:32768 ,并且每個session都有自己的獨立的緩存。多個會話指間彼此不影響。
binlog_chache_size不能設(shè)置太大,否則大量事物打來后肯定會造成寶貴的內(nèi)存資源被浪費。但是也別太小,因為當(dāng)一個事物產(chǎn)生的日志足夠大超過該參數(shù)設(shè)置的值時,MySQL會將緩存中的binlog數(shù)據(jù)寫到臨時文件中去。
mysql> show variables like '%binlog_cache%';
+-----------------------+----------------------+
| Variable_name | Value |
+-----------------------+----------------------+
| binlog_cache_size | 32768 |
| max_binlog_cache_size | 18446744073709547520 |
+-----------------------+----------------------+
2 rows in set (0.00 sec)
刷盤機制
其實binlog寫入磁盤的機制由參數(shù)sync_binlog控制。
策略1:sync_binlog = 0
當(dāng)設(shè)置sync_binlog = 0時,表示innodb不會主動控制將binlog落盤,innodb僅僅會將binlog寫入到OS Cache中,至于什么時間將binlog刷入磁盤中完全依賴于操作系統(tǒng)。選這種策略,一旦操作系統(tǒng)宕機,OS Cache中的binlog就會丟失。
策略2:sync_binlog = 1
設(shè)置sync_binlog = 1時,表示事物commit時將binlog落盤!這樣哪怕機器宕機了,也能確保binlog會被寫入到磁盤中。
策略3:sync_binlog=N
這里的N不是0,也不是1。
當(dāng)N大于1時,表示開啟組提交,也就是group commit,如果你之前不層了解組提交的話,你可以這樣理解它:比如N=5,那MySQL就會等收集5個binlog后再將這5個binlog一口氣同步到磁盤上。好處很明顯,一次IO可以往磁盤上刷入N個binlog,IO效率會有所提升。壞處也很明顯,比如N=5,那當(dāng)MySQL收集了4個binlog時,服務(wù)器宕機,這4個binlog就會丟失。
官方推薦策略2方式
運維中查看binlog日志
mysql二進制日志有三種格式:statement、row、mixed
一般我們在主從復(fù)制過程中采用的格式都是mixed。這種格式兼具了基于行(row)和基于語句(statement)的優(yōu)點,速度和效率是最高的。
運維給出二進制的binlog文件
將其轉(zhuǎn)換成utf8文件:
mysqlbinlog mysql-bin.000345 > mysql-bin.000345.txt
輸出:
SET @@SESSION.GTID_NEXT= 'db939aab-1291-11ea-a147-6c92bf6083de:12067013'/*!*/;
# at 71904493
#201130 14:44:16 server id 3341167209 end_log_pos 71904556 CRC32 0x55bf687f Querythread_id=11827220exec_time=0error_code=0
SET TIMESTAMP=1606718656/*!*/;
BEGIN
/*!*/;
# at 71904556
#201130 14:44:16 server id 3341167209 end_log_pos 71904647 CRC32 0xccce734d Table_map: `invstone`.`t_sso_ticket_info` mapped to number 95
# at 71904647
#201130 14:44:16 server id 3341167209 end_log_pos 71904923 CRC32 0xc72e8724 Update_rows_v1: table id 95 flags: STMT_END_F
BINLOG '
wJTEXxNpKibHWwAAAIctSQQAAF8AAAAAAAEACGludnN0b25lABF0X3Nzb190aWNrZXRfaW5mbwAN
/gMPDwMDDxISAxIS/g7+YJYAlgCWAAAAAAD+YEwQTXPOzA==
wJTEXxhpKibHFAEAAJsuSQQAAF8AAAAAAAEADf8A4CA2YzZmZGQ3NGMyYzE0YTA3ODY4NTk3
MTBlOWNmZDk4YigAAAAABmZhbmdia/8CAAAAB2pzeS13ZWKZp/zrCZmn/POKAAAAAJmn/OsJ
maf86wogNjk2Mjg0ODFmY2ViNDk3NjhhNWZlMDdiNDI1OWM1YzkA4CA2YzZmZGQ3NGMyYzE0YTA3
ODY4NTk3MTBlOWNmZDk4YigAAAAABmZhbmdia/8DAAAAB2pzeS13ZWKZp/zrCZmn/PORAAAA
AJmn/OsJmaf86xAgNjk2Mjg0ODFmY2ViNDk3NjhhNWZlMDdiNDI1OWM1Yzkkhy7H
'/*!*/;
# at 71904923
#201130 14:44:16 server id 3341167209 end_log_pos 71904954 CRC32 0xa4f47fbd Xid = 103880476
COMMIT/*!*/;
# at 71904954
在使用mysqlbinlog查看混合模式的二進制文件時,基于行的部分默認是以base64編碼顯示
將其中的base64轉(zhuǎn)換成sql:
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000345 > mysql-bin.0003452.txt
輸出:
# at 81880980
#201130 15:16:15 server id 3341167209 end_log_pos 81881102 CRC32 0xbeafaa0c Table_map: `huishi-server`.`hs_capital_attachment_sync_info` mapped to number 55827
# at 81881102
#201130 15:16:15 server id 3341167209 end_log_pos 81889094 CRC32 0x35905375 Update_rows_v1: table id 55827
# at 81889094
#201130 15:16:15 server id 3341167209 end_log_pos 81897122 CRC32 0x7181fac7 Update_rows_v1: table id 55827 flags: STMT_END_F
### UPDATE `huishi-server`.`hs_capital_attachment_sync_info`
### WHERE
### @1=9669
### @2=1
### @3='AJXT'
### @4='AJXT20201130150240564'
### @5='BO194471256404393984'
### @6='qydafj-1000019989/qynz'
### @7='浼佷笟妗f闄勪歡-1000019989/鍐呰處'
### @8=211812
### @9='http://hs-statics.shitou.com/huishi_pro/archiveManager/20騫?鏈堜喚寮€紲╛1605617655326_gHL.jpeg'
### @10=0
### @11=1606719762
### @12='guosiying'
### @13=1606719762
### @14='guosiying'
### @15=0
### @16='qynz-30'
### @17=1
### @18=0
### SET
### @1=9669
### @2=1
### @3='AJXT'
### @4='AJXT20201130150240564'
### @5='BO194471256404393984'
### @6='qydafj-1000019989/qynz'
### @7='浼佷笟妗f闄勪歡-1000019989/鍐呰處'
### @8=211812
### @9='http://hs-statics.shitou.com/huishi_pro/archiveManager/20騫?鏈堜喚寮€紲╛1605617655326_gHL.jpeg'
### @10=1
### @11=1606719762
### @12='guosiying'
### @13=1606720575
### @14='guosiying'
### @15=0
### @16='qynz-30'
### @17=1
### @18=0
### UPDATE `huishi-server`.`hs_capital_attachment_sync_info`
### WHERE
### @1=9670
### @2=1
參考:
總結(jié)
以上是生活随笔為你收集整理的mysql-bin_MySQL - binlog日志简介及设置的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web学习2--理解MVC及快速入门
- 下一篇: 捷联惯导系统学习3.3(引力位函数)