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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL二进制日志操作

發布時間:2025/3/15 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL二进制日志操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二進制日志

概念

  • 記錄對數據發生或潛在發生更改的SQL語句,并且是以二進制格式保存的日志

使用用途

  • 查看數據庫變更歷史

  • 數據庫增量備份

  • 數據庫災難恢復

  • MySQL復制(主從、主主復制)


二進制日志性能影響

  • 日志即影響MySQL性能又占用大量磁盤空間。因此,往往需要做采樣分析時才會打開

  • 即使做采樣分析,也最好僅在一臺測試機上開啟

  • 二進制日志由于用途廣泛,大多數情況下會開啟。需要制定合理的備份計劃和管理策略


開啟二進制日志

方法一:不重啟修改二進制日志配置

  • SET @@global.log_bin=1;

  • SET @@global.binlog_szie=37268;(單位:bytes)

  • 其他參數可以通過以下命令查閱:

    SHOW VARIABLES LIKE '%bin%';

mysql>?show?variables?like?'%bin%'; +-----------------------------------------+------------------------------------------+ |?Variable_name???????????????????????????|?Value????????????????????????????????????| +-----------------------------------------+------------------------------------------+ |?bind_address????????????????????????????|?*????????????????????????????????????????| |?binlog_cache_size???????????????????????|?32768????????????????????????????????????| |?binlog_checksum?????????????????????????|?CRC32????????????????????????????????????| |?binlog_direct_non_transactional_updates?|?OFF??????????????????????????????????????| |?binlog_error_action?????????????????????|?IGNORE_ERROR?????????????????????????????| |?binlog_format???????????????????????????|?STATEMENT????????????????????????????????| |?binlog_gtid_simple_recovery?????????????|?OFF??????????????????????????????????????| |?binlog_max_flush_queue_time?????????????|?0????????????????????????????????????????| |?binlog_order_commits????????????????????|?ON???????????????????????????????????????| |?binlog_row_p_w_picpath????????????????????????|?FULL?????????????????????????????????????| |?binlog_rows_query_log_events????????????|?OFF??????????????????????????????????????| |?binlog_stmt_cache_size??????????????????|?32768????????????????????????????????????| |?binlogging_impossible_mode??????????????|?IGNORE_ERROR?????????????????????????????| |?innodb_api_enable_binlog????????????????|?OFF??????????????????????????????????????| |?innodb_locks_unsafe_for_binlog??????????|?OFF??????????????????????????????????????| |?log_bin?????????????????????????????????|?ON???????????????????????????????????????| |?log_bin_basename????????????????????????|?/data/3306/mysql-bin/mysql-bin???????| |?log_bin_index???????????????????????????|?/data/3306/mysql-bin/mysql-bin.index?| |?log_bin_trust_function_creators?????????|?OFF??????????????????????????????????????| |?log_bin_use_v1_row_events???????????????|?OFF??????????????????????????????????????| |?max_binlog_cache_size???????????????????|?18446744073709547520?????????????????????| |?max_binlog_size?????????????????????????|?1073741824???????????????????????????????| |?max_binlog_stmt_cache_size??????????????|?18446744073709547520?????????????????????| |?simplified_binlog_gtid_recovery?????????|?OFF??????????????????????????????????????| |?sql_log_bin?????????????????????????????|?ON???????????????????????????????????????| |?sync_binlog?????????????????????????????|?0????????????????????????????????????????| +-----------------------------------------+------------------------------------------+ 26?rows?in?set?(0.00?sec)


常用二進制日志相關配置參數

  • log-bin=

#開啟并指定二進制日志保存路勁及文件名,不設置則使用默認值。默認存放位置為數據庫文件所目錄下,名稱為hostname-bin.xxxxx

  • max-binlog-size=500m

#設置單個二進制日志文件的最大值,默認1G,最大1G


  • binlog-do-db與binlog-ignore-db

#指定二進制日志文件記錄哪些數據庫操作


  • binlog-cache-size=100m

#設置二進制日志緩存大小


  • sync-binlog=N

#每隔N秒將緩存中的二進制日志記錄寫回硬盤。默認為0。不過,你經常會陷入group commit函數與I/O之間二選一的矛盾。如果在replication環境中,由于考慮到耐久性和一致性,則需要設置為1。同時,還需要設置innodb_flush_log_at_trx_commit=1以及innodb-support-ax=1(默認已開啟)


暫停二進制日志

  • SET sql_log_bin={0|1};


查看二進制日志

  • mysqlbinlog host2-bin.000001


創建一個數據庫并做相應修改,并查看二進制日志的變化

mysql> create database t1;

mysql> create table tt1(id int,name varchar(20),birthday date);

mysql> insert into tt1(id,name,birthday) values('1','demi','1991-10-12');

mysql> insert into tt1(id,name,birthday) values('2','hoai','1992-02-20');

mysql>?select?*?from?tt1; +------+------+------------+ |?id???|?name?|?birthday???| +------+------+------------+ |????1?|?demi?|?1991-10-12?| |????2?|?hoai?|?1992-02-20?| |????3?|?wiss?|?1991-07-14?| |????4?|?kime?|?1993-06-18?| +------+------+------------+ 4?rows?in?set?(0.00?sec)

mysql> update tt1 set birthday='1991-06-28' where id=4;

mysql>?select?*?from?tt1; +------+------+------------+ |?id???|?name?|?birthday???| +------+------+------------+ |????1?|?demi?|?1991-10-12?| |????2?|?hoai?|?1992-02-20?| |????3?|?wiss?|?1991-07-14?| |????4?|?kime?|?1991-06-28?| +------+------+------------+ 4?rows?in?set?(0.00?sec)


使用mysqlbinlog命令查看二進制日志的變化

[root@slave1?~]#?mysqlbinlog?/data/3306/mysql-bin/mysql-bin.000011 /*!50530?SET?@@SESSION.PSEUDO_SLAVE_MODE=1*/; /*!40019?SET?@@session.max_insert_delayed_threads=0*/; /*!50003?SET?@OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/; DELIMITER?/*!*/; #?at?4 #160314?18:34:51?server?id?3??end_log_pos?120?CRC32?0xfd6a32fe? Start:?binlog?v?4,?server?v?5.6.27-log?created?160314?18:34:51?at?startup #?Warning:?this?binlog?is?either?in?use?or?was?not?closed?properly. ROLLBACK/*!*/; BINLOG?' y5PmVg8DAAAAdAAAAHgAAAABAAQANS42LjI3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAADLk+ZWEzgNAAgAEgAEBAQEEgAAXAAEGggAAAAICAgCAAAACgoKGRkAAf4y av0= '/*!*/; #?at?120 #160314?21:03:56?server?id?3??end_log_pos?208?CRC32?0x12f2847a? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457960636/*!*/; SET?@@session.pseudo_thread_id=4/*!*/; SET?@@session.foreign_key_checks=1,?@@session.sql_auto_is_null=0,?@@session.unique_checks=1,?@@session.autocommit=1/*!*/; SET?@@session.sql_mode=1075838976/*!*/; 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/*!*/; create?database?t1 /*!*/; #?at?208 #160314?21:08:36?server?id?3??end_log_pos?333?CRC32?0x806b0266? Query thread_id=4 exec_time=0 error_code=0 use?`t1`/*!*/; SET?TIMESTAMP=1457960916/*!*/; create?table?tt1(id?int,name?varchar(20),birthday?date) /*!*/; #?at?333 #160314?21:10:05?server?id?3??end_log_pos?408?CRC32?0xc4950130? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457961005/*!*/; BEGIN /*!*/; #?at?408 #160314?21:10:05?server?id?3??end_log_pos?543?CRC32?0xab0bc88f? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457961005/*!*/; insert?into?tt1(id,name,birthday)?values('1','demi','1991-10-12') /*!*/; #?at?543 #160314?21:10:05?server?id?3??end_log_pos?574?CRC32?0xacd9a973? Xid?=?27 COMMIT/*!*/; #?at?574 #160314?21:10:40?server?id?3??end_log_pos?649?CRC32?0xb6e8ef83? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457961040/*!*/; BEGIN /*!*/; #?at?649 #160314?21:10:40?server?id?3??end_log_pos?784?CRC32?0xef33bae2? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457961040/*!*/; insert?into?tt1(id,name,birthday)?values('2','hoai','1992-02-20') /*!*/; #?at?784 #160314?21:10:40?server?id?3??end_log_pos?815?CRC32?0xc1ec540f? Xid?=?29 COMMIT/*!*/; #?at?815 #160314?21:11:00?server?id?3??end_log_pos?890?CRC32?0xb4e3c45e? Query thread_id=4 exec_time=0 error_code=0 SET?TIMESTAMP=1457961060/*!*/; BEGIN /*!*/; #?at?890 #160314?21:11:00?server?id?3??end_log_pos?1025?CRC32?0xf8584b1d? Query thread_id=4 exec_time=0????error_code=0 SET?TIMESTAMP=1457961060/*!*/; insert?into?tt1(id,name,birthday)?values('3','wiss','1991-07-14') /*!*/; #?at?1025 #160314?21:11:00?server?id?3??end_log_pos?1056?CRC32?0xe75877f8? Xid?=?30 COMMIT/*!*/; #?at?1056 #160314?21:11:33?server?id?3??end_log_pos?1131?CRC32?0x12b7b345? Query thread_id=4 exec_time=0????error_code=0 SET?TIMESTAMP=1457961093/*!*/; BEGIN /*!*/; #?at?1131 #160314?21:11:33?server?id?3??end_log_pos?1266?CRC32?0xab6f89cc? Query thread_id=4 exec_time=0????error_code=0 SET?TIMESTAMP=1457961093/*!*/; insert?into?tt1(id,name,birthday)?values('4','kime','1993-06-18') /*!*/; #?at?1266 #160314?21:11:33?server?id?3??end_log_pos?1297?CRC32?0x2e4dbdb4? Xid?=?31 COMMIT/*!*/; #?at?1297 #160314?21:14:04?server?id?3??end_log_pos?1372?CRC32?0x571a3dda? Query thread_id=4 exec_time=0????error_code=0 SET?TIMESTAMP=1457961244/*!*/; BEGIN /*!*/; #?at?1372 #160314?21:14:04?server?id?3??end_log_pos?1489?CRC32?0xaee0efb9? Query thread_id=4 exec_time=0????error_code=0 SET?TIMESTAMP=1457961244/*!*/; update?tt1?set?birthday='1991-06-28'?where?id=4 /*!*/; #?at?1489 #160314?21:14:04?server?id?3??end_log_pos?1520?CRC32?0xa7faed24? Xid?=?33 COMMIT/*!*/; DELIMITER?; #?End?of?log?file ROLLBACK?/*?added?by?mysqlbinlog?*/; /*!50003?SET?COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530?SET?@@SESSION.PSEUDO_SLAVE_MODE=0*/;



修改二進制日志記錄配置為ROW方式(ROW記錄的二進制信息最為完整)

mysql> set @@global.binlog_format=ROW;

mysql> set binlog_format=ROW;


mysql>?show?variables?like?'binlog_format'; +---------------+-------+ |?Variable_name?|?Value?| +---------------+-------+ |?binlog_format?|?ROW???| +---------------+-------+ 1?row?in?set?(0.00?sec)


修改mysql數據

mysql>?update?tt1?set?birthday='1992-12-20'?where?id=1; Query?OK,?1?row?affected?(0.00?sec) Rows?matched:?1??Changed:?1??Warnings:?0mysql>?select?*?from?tt1; +------+------+------------+ |?id???|?name?|?birthday???| +------+------+------------+ |????1?|?demi?|?1992-12-20?| |????2?|?hoai?|?1992-02-20?| |????3?|?wiss?|?1991-07-14?| |????4?|?kime?|?1991-06-28?| +------+------+------------+ 4?rows?in?set?(0.00?sec)


查看二進制日志的變化

[root@slave1 ~]# mysqlbinlog /data/3306/mysql-bin/mysql-bin.000011

BINLOG?' 07zmVhMDAAAAMAAAAGYGAAAAAEcAAAAAAAEAAnQxAAN0dDEAAwMPCgI8AAe2N8/Z 07zmVh8DAAAAPgAAAKQGAAAAAEcAAAAAAAEAAgAD///4AQAAAARkZW1pTI8P+AEAAAAEZGVtaZSR D3vrjpU= '/*!*/; #?at?1700 #160314?21:29:55?server?id?3??end_log_pos?1731?CRC32?0xff29a00b? Xid?=?41 COMMIT/*!*/; DELIMITER?; #?End?of?log?file ROLLBACK?/*?added?by?mysqlbinlog?*/; /*!50003?SET?COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530?SET?@@SESSION.PSEUDO_SLAVE_MODE=0*/;



[root@slave1 ~]# mysqlbinlog /data/3306/mysql-bin/mysql-bin.000011 -v

#加-v解析二進制日志


BINLOG?' 07zmVhMDAAAAMAAAAGYGAAAAAEcAAAAAAAEAAnQxAAN0dDEAAwMPCgI8AAe2N8/Z 07zmVh8DAAAAPgAAAKQGAAAAAEcAAAAAAAEAAgAD///4AQAAAARkZW1pTI8P+AEAAAAEZGVtaZSR D3vrjpU= '/*!*/; ###?UPDATE?`t1`.`tt1` ###?WHERE ###???@1=1 ###???@2='demi' ###???@3='1991:10:12' ###?SET ###???@1=1 ###???@2='demi' ###???@3='1992:12:20' #?at?1700 #160314?21:29:55?server?id?3??end_log_pos?1731?CRC32?0xff29a00b? Xid?=?41 COMMIT/*!*/; DELIMITER?; #?End?of?log?file ROLLBACK?/*?added?by?mysqlbinlog?*/; /*!50003?SET?COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/; /*!50530?SET?@@SESSION.PSEUDO_SLAVE_MODE=0*/;



mysqlbinlog命令參數

  • --start-datetime=name

  • --stop-datetime=name

  • -j, --start-position=#

  • --stop-position=#(指定范圍查看二進制日志和--start-position一起使用)



使用二進制日志恢復數據

#mysqlbinlog host-bin.000001 | mysql

#mysqlbinlog host-bin.000001 > backup.sql

#mysqlbinlog host-bin.000002 >> backup.sql

#mysql dbname < backup.sql


刪除二進制日志

  • 二進制日志會不斷的增長,并產生多個文件。因此,需要制定備份計劃和管理策略。無用的二進制日志要記得及時刪除。

  • 刪除二進制日志的方法:

????????1、操作系統命令直接刪除

????????2、RESET MASTER

????????3、PURGE

?????????????格式:

????????????PURGE {MASTER|BINARY} LOGS TO 'log_name'

????????????PURGE {MASTER|BINARY} LOGS BEFORE 'date'



1、使用RESET MASTER命令刪除二進制文件

  • 查看二進制文件

[root@slave1 ~]# ls /data/3306/mysql-bin/

mysql-bin.000001 ?mysql-bin.000003 ?mysql-bin.000005 ?mysql-bin.000007 ?mysql-bin.000009 ?mysql-bin.000011

mysql-bin.000002 ?mysql-bin.000004 ?mysql-bin.000006 ?mysql-bin.000008 ?mysql-bin.000010 ?mysql-bin.index

  • 執行reset master命令刪除二進制日志文件

mysql>?reset?master; Query?OK,?0?rows?affected?(0.01?sec)
  • 查看結果

[root@slave1 ~]# ls /data/3306/mysql-bin/

mysql-bin.000001 ?mysql-bin.index



2、使用PURGE命令指定刪除某個二進制文件之前的二進制文件

[root@slave2 ~]# ls /data/3306/mysql-bin/

mysql-bin.000001 ?mysql-bin.000003 ?mysql-bin.000005 ?mysql-bin.000007 ?mysql-bin.000009

mysql-bin.000002 ?mysql-bin.000004 ?mysql-bin.000006 ?mysql-bin.000008 ?mysql-bin.index


mysql>?purge?master?logs?to?'mysql-bin.000005'; Query?OK,?0?rows?affected?(0.00?sec)


[root@slave2 ~]# ls /data/3306/mysql-bin/

mysql-bin.000005 ?mysql-bin.000006 ?mysql-bin.000007 ?mysql-bin.000008 ?mysql-bin.000009 ?mysql-bin.index


3、使用PURGE命令刪除指定日期之前的二進制文件

[root@slave2 ~]# date "+%F %T"

2016-03-14 22:12:41


刪除5天前的全部二進制日志

mysql>?purge?master?logs?before?'2016-03-10?00:00:00'; Query?OK,?0?rows?affected?(0.02?sec)

查看結果

[root@slave2 ~]# ls /data/3306/mysql-bin/

mysql-bin.000007 ?mysql-bin.000008 ?mysql-bin.000009 ?mysql-bin.index


刪除2016-03-14之前的全部二進制日志

mysql>?purge?master?logs?before?'2016-03-14?00:00:00'; Query?OK,?0?rows?affected?(0.00?sec)

查看結果

[root@slave2 ~]# ls /data/3306/mysql-bin/

mysql-bin.000008 ?mysql-bin.000009 ?mysql-bin.index


查看binlog日志

mysql> show binary logs;

刪除10天前的二進制日志文件

mysql> purge master logs before date_sub(current_date,interval 10 day);


設置自動清理二進制日志方法

  • 設置binlog的過期時間為5天

    mysql> set global expire_logs_days=5;

  • 刷新設置

    mysql> flush logs;

  • 修改my.cnf配置,增加二進制日志過期參數(使重啟后仍然生效)

    expire_logs_days = 5






轉載于:https://blog.51cto.com/7424593/1751071

總結

以上是生活随笔為你收集整理的MySQL二进制日志操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。