日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志

發(fā)布時(shí)間:2023/12/20 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

mysql日志的種類

二進(jìn)制日志(binary log):記錄數(shù)據(jù)更新的操作,mysqlbinlog 可查看二進(jìn)制日志文件

錯(cuò)誤日志(error log):記錄mysql服務(wù)進(jìn)程mysqld的啟動(dòng)、關(guān)閉和運(yùn)行時(shí)的錯(cuò)誤信息

慢查詢?nèi)罩?#xff08;slow query log):記錄執(zhí)行時(shí)間超過指定時(shí)間(long_query_time)的查詢操作

通用查詢?nèi)罩?#xff08;general query log):記錄客戶端連接和執(zhí)行的sql查詢操作(一般不開啟)

日志一般存放在安裝目錄下的data目錄下

?

刷新binlog操作:[root@oldboy data]# mysqladmin -uroot -poldboy flush-logs

?

binlog日志的三種模式statement、row、mixed

mysql> show variables like '%binlog_for%'; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+

1.statement level模式

每一條修改數(shù)據(jù)的sql都會(huì)記錄到master的bin-log中,slave在復(fù)制的時(shí)候sql進(jìn)程會(huì)解析成和原來master端執(zhí)行過的相同的sql來再次執(zhí)行

優(yōu)點(diǎn):解決了row level下的缺點(diǎn),不需要記錄每一條數(shù)據(jù)的變化,減少bin-log的日志量,節(jié)約IO,提高性能

缺點(diǎn):必須記錄每條語句在執(zhí)行時(shí)的一些上下文信息,以保證所有語句在slave端執(zhí)行時(shí)能得到和在master端執(zhí)行時(shí)相同的結(jié)果;涉及到復(fù)雜內(nèi)容的時(shí)候,可能會(huì)出現(xiàn)bug,造成復(fù)制出現(xiàn)問題,主要是修改數(shù)據(jù)的時(shí)候使用某些特定函數(shù)或者功能,例如sleep( )函數(shù)、last_insert_id( )函數(shù)

2.row level模式

日志記錄成每一行數(shù)據(jù)被修改的形式,然后在slave端在對(duì)相同的數(shù)據(jù)進(jìn)行修改

優(yōu)點(diǎn):不需記錄執(zhí)行sql語句的上下文信息,只需記錄哪一條數(shù)據(jù)被修改了;不會(huì)出現(xiàn)某些特定情況下的存儲(chǔ)過程、函數(shù)、觸發(fā)器的調(diào)用和觸發(fā)無法被正確復(fù)制的問題

缺點(diǎn):binlog日志量很大(例如update test set name=‘Jane’,test表有幾行就會(huì)記錄幾行)

3.mixed模式

statement模式和row模式的混合,mysql會(huì)根據(jù)執(zhí)行的每一條具體的sql語句來確定記錄的形式,即在statemente和row之間選擇一種。新版本對(duì)row level模式做了優(yōu)化,不是所有的修改都以row level來記錄,如表結(jié)構(gòu)的變更會(huì)以statement模式記錄,如果是update或者delete還是會(huì)記錄所有行的變更

mysql5.5默認(rèn)的binlog是statement模式,臨時(shí)修改為行模式mysql>set global? binlog_format ='ROW';(永久生效需改配置文件)

執(zhí)行update oldboy.test set name=’Jane’ where id>3

查看行模式下的binlog? [root@oldboy data]# mysqlbinlog --base64-output='decode-rows' -v mysql-bin.000053

BEGIN

/*!*/;

# at 725

# at 774

#180717 20:20:55 server id 1? end_log_pos 774?? Table_map: `oldboy`.`test2` mapped to number 38

#180717 20:20:55 server id 1? end_log_pos 884?? Update_rows: table id 38 flags: STMT_END_F

### UPDATE `oldboy`.`test2`

### WHERE

###?? @1=4

###?? @2='Jane'

### SET

###?? @1=4

###?? @2='Jack'

### UPDATE `oldboy`.`test2`

### WHERE

###?? @1=5

###?? @2='Jane'

### SET

###?? @1=5

###?? @2='Jack'

### UPDATE `oldboy`.`test2`

### WHERE

###?? @1=6

###?? @2='Jane'

### SET

###?? @1=6

###?? @2='Jack'

### UPDATE `oldboy`.`test2`

### WHERE

###?? @1=7

###?? @2='Jane'

### SET

###?? @1=7

###?? @2='Jack'

# at 884

?

?

mysqlbinlog用來解析mysql的binlog日志,在mysql/data目錄下,如mysql-bin.000006(6位)

binlog用來記錄mysql內(nèi)部所有增、刪、改等對(duì)數(shù)據(jù)庫內(nèi)容有更新的記錄,包含所有數(shù)據(jù)庫及所有表,無法分開記

1.指定庫導(dǎo)出,加-d 庫名,可將指定庫的更新語句截取出來

mysqlbinlog -d oldboy mysql-bin.000011? >? all.sql

日志內(nèi)容部分如下

#181201 21:43:41 server id 1 end_log_pos 177 Query thread_id=26 exec_time=0 error_code=0 SET TIMESTAMP=1543671821/*!*/; SET @@session.pseudo_thread_id=26/*!*/; SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/; SET @@session.sql_mode=0/*!*/; SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/; /*!\C utf8 *//*!*/; SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/; SET @@session.lc_time_names=0/*!*/; SET @@session.collation_database=DEFAULT/*!*/; BEGIN /*!*/; # at 177 #181201 21:43:41 server id 1 end_log_pos 287 Query thread_id=26 exec_time=0 error_code=0 use `oldboy`/*!*/; SET TIMESTAMP=1543671821/*!*/; insert into test values(8,'Alice'),(9,'Alan') /*!*/; # at 287 #181201 21:43:41 server id 1 end_log_pos 314 Xid = 531 COMMIT/*!*/; DELIMITER ; # End of log file ROLLBACK /* added by mysqlbinlog */; /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

2.指定位置恢復(fù),--start-position和--stop-position

Insert into test values(4,’錢六’);查看前后兩個(gè)at的位置分別為570、670,指定更新語句所在的位置

mysqlbinlog mysql-bin.000011 --start-position=570 --stop-position=670 -r /opt/position.sql將結(jié)果重定向到/opt/ position.sql文件中(-r相當(dāng)于重定向>)

3.指定時(shí)間恢復(fù), --start-datetime和--stop-datetime(指定時(shí)間恢復(fù)可能不準(zhǔn)確,mysql不會(huì)恢復(fù)截止時(shí)間恰好等于指定時(shí)間的sql語句,但是會(huì)恢復(fù)開始時(shí)間恰好等于指定時(shí)間的sql語句)

Insert into test values(4,’錢六’);前后時(shí)間都為22:41:20,指定時(shí)間時(shí)可稍微將時(shí)間向兩個(gè)邊界擴(kuò)展一點(diǎn)

mysqlbinlog mysql-bin.000011 --start-datetime='2018-06-22 22:41:10' --stop-datetime='2018-06-22 22:41:21'? -r /opt/datetime.sql

以上指定位置和指定時(shí)間,如果不指定結(jié)束點(diǎn),表示從指定點(diǎn)到文件結(jié)尾,如果不指定開始點(diǎn),表示從文件開頭到指定點(diǎn)

?

轉(zhuǎn)載于:https://www.cnblogs.com/Forever77/p/10049948.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的mysql日志种类、二进制日志模式、mysqlbinlog解析二进制日志的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。