binlog是Mysql sever层维护的一种二进制日志,与innodb引擎中的redo/undo log是彻底不一样的日志;其主要是用来记录对mysql数据更新或潜在发生更新的SQL语句,记录了全部的DDL和DML(除了数据查询语句)语句,并以事务
的形式保存在磁盘中,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。html
通常来讲开启二进制日志大概会有1%的性能损耗(参见MySQL官方中文手册 5.1.24版)。mysql
做用主要有:sql
二进制日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录全部的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库全部的DDL和DML(除了数据查询语句)语句事件。数据库
修改配置文件 my.cnf
xcode
配置 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 文件的名称,这里咱们设置为master-bin.index
,能够不配置。session
binlog开启后,能够在配置文件中查看其位置信息,也能够在myslq命令行中查看:app
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)
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后,会在数据目录(默认)生产host-bin.n(具体binlog信息)文件及host-bin.index索引文件(记录binlog文件列表)。当binlog日志写满(binlog大小max_binlog_size,默认1G),或者数据库重启才会生产新文件,可是也可经过手工进行切换让其从新生成新的文件(flush logs);另外,若是正使用大的事务,因为一个事务不能横跨两个文件,所以也可能在binlog文件未满的状况下刷新文件。负载均衡
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)
显示正在写入的二进制文件,及当前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)
自此刻开始产生一个新编号的binlog日志文件
每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志;
mysql> reset master;
D:\Program Files\MySQL $ bin\mysqlbinlog data\mysql-bin.000002
在MySQL5.5如下版本使用mysqlbinlog命令时若是报错,就加上 “--no-defaults”选项
内容:
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
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;
内容:
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)
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.
注意要建立好D:\data\backup文件夹。
这里使用了-lF
,注意必须大写F,当备份工做刚开始时系统会刷新log日志,产生新的binlog日志来记录备份以后的数据库“增删改”操做。
查看一下:
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 是用来记录彻底备份命令时间以后对数据库的全部“增删改”操做。
Linux数据备份命令:
/usr/local/mysql/bin/mysqldump -uroot -p123456 -lF --log-error=/root/myDump.err -B zyyshop > /root/BAK.zyyshop.sql
通过一段时间,数据库出现问题,须要恢复
mysql> flush logs;
此时执行一次刷新日志索引操做,从新开始新的binlog日志记录文件,理论说 mysql-bin.000004 这个文件不会再有后续写入了(便于咱们分析缘由及查找pos点),之后全部数据库操做都会写入到下一个日志文件;
查看binlog日志:
mysql> show binlog events in 'mysql-bin.000004';
最后一段日志内容:
| 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)
经过分析,形成数据库破坏的pos点区间是介于4613--4736 之间,只要恢复到4613前就可。
先进行彻底备份恢复:
D:\Program Files\MySQL $ bin\mysql -h127.0.0.1 -p3306 -uroot -phongda$123456 -v <D:\data\backup\longhubang.dump
binlog日志恢复:
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.
增量数据恢复语法格式:
mysqlbinlog mysql-bin.0000xx | mysql -u用户名 -p密码 数据库名 经常使用选项: --start-position=953 起始pos点 --stop-position=1437 结束pos点 --start-datetime="2013-11-29 13:18:54" 起始时间点 --stop-datetime="2013-11-29 13:21:53" 结束时间点 --database=zyyshop 指定只恢复zyyshop数据库(一台主机上每每有多个数据库,只限本地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服务器上读取binlog日志
小结:实际是将读出的binlog日志内容,经过管道符传递给mysql命令。这些命令、文件尽可能写成绝对路径;
上面的binlog恢复语句也能够拆分:
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
所谓恢复,就是让mysql将保存在binlog日志中指定段落区间的sql语句逐个从新执行一次而已。
复制是mysql最重要的功能之一,mysql集群的高可用、负载均衡和读写分离都是基于复制来实现的;从5.6开始复制有两种实现方式,基于binlog和基于GTID(全局事务标示符);本文接下来将介绍基于binlog的一主一从复制;
其复制的基本过程以下: