MySQL的binlog日志
一:MySQL的4种不同日志
- 1:error log,错误日志。
记录了系统启动,运行以及停止过程中遇到的一些问题
- 2:general log,普通日志
记录了MySQL执行的所有语句以及语句开始执行的时间等信息,用户可以选择打开它
- 3:slow log,慢日志
记录了MySQL所有慢查询相关的信息。一般用来查询慢sql。
- 4:binlog,二进制日志
二进制日志则以事件event的形式记录了MySQL的库表结构以及表数据的所有变更信息
二:简介
binlog是记录了所欲数据表结构变更(例如create、alter table..)以及数据表修改(insert、update、delete...)的二进制日志。 binlog不会记录select和show这样的操作,因为这类操作对数据本身并没有修改。
从宏观上看,binlog由一系列的binlog文件
和一个index文件
组成。数据库所有的变更都是以事件的形式记录在binlog文件中,index文件记录当前使用了那些binlog文件。binlog文件以一个4字节的常量作为开头(标识这是一个binlog文件),后面跟着一系列的binlog事件。对于不同的binlog格式,相同语句记录在binlog文件中的事件也有所不同。
2.1 binlog的作用
binlog主要有几种主要作用,恢复、复制、审计
- 恢复(recovery):某些数据的恢复需要二进制日志。通过mysqlbinlog工具来恢复数据。
- 复制(replication):其原理与恢复类似,通过复制和执行二进制日志使一台远程的MySQL(slave)与一台MySQL数据(master)进行实时同步。
- 审计(audit):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入攻击。
除了上面介绍的几个作用外,binlog对于事务存储引擎的崩溃恢复也有非常重要的作用。在开启binlog的情况下,为了保证binlog与redo的一致性,MySQL将采用事务的两阶段提交协议。当MySQL系统发生崩溃时,事务在存储引擎内部的状态可能为prepared和commit两种。对于prepared状态的事务,是进行提交操作还是进行回滚操作,这时需要参考binlog:如果事务在binlog中存在,那么将其提交;如果不在binlog中存在,那么将其回滚,这样就保证了数据在主库和从库之间的一致性
mysql安装在centos上
三:binlog的使用
3.1 开启binlog日志
找到mysql的配置文件my.cnf,用vi打开, vi my.cnf 在 [mysqld] 下面加上:
log-bin=mysql-bin
然后重启mysql使配置生效
/usr/local/mysql/bin/mysqld_safe --user=mysql &
3.2 查看binlog是否开启
登录mysql数据库,使用下面命令查看binlog是否开启:
show variables like "log_%";
mysql> show variables like "log_%";
+----------------------------------------+--------------------------------+
| Variable_name | Value |
+----------------------------------------+--------------------------------+
| log_bin | ON |
| log_bin_basename | /var/lib/mysql/mysql-bin |
| log_bin_index | /var/lib/mysql/mysql-bin.index |
| log_bin_trust_function_creators | ON |
| log_bin_use_v1_row_events | OFF |
| log_error | /var/lib/mysql/mysql_error.log |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_throttle_queries_not_using_indexes | 0 |
| log_warnings | 1 |
+----------------------------------------+--------------------------------+
log_bin 为 ON ,表示已经开启
3.2 常用binlog操作命令
命 令 |
---|
1、show master logs; 查看所有binlog日志列表 |
3、show master status; 查看master状态,即最后(最新)一个binlog日志的编号名称,及其最后一个操作事件pos结束点(Position)值 |
3、flush logs; 刷新log日志,自此刻开始产生一个新编号的binlog日志文件;注:每当mysqld服务重启时,会自动执行此命令,刷新binlog日志;在mysqldump备份数据时加 -F 选项也会刷新binlog日志; |
4、reset master; 重置(清空)所有binlog日志 |
四:查看binlog日志内容
4.1 使用mysqlbinlog自带查看命令
# /usr/local/mysql/bin/mysqlbinlog /usr/local/mysql/data/mysql-bin.000013
下面截取一个片段分析:
...............................................................................
# at 552
#131128 17:50:46 server id 1 end_log_pos 665 Query thread_id=11 exec_time=0 error_code=0 ---->执行时间:17:50:46;pos点:665
SET TIMESTAMP=1385632246/*!*/;
update zyyshop.stu set name='李四' where id=4 ---->执行的SQL
/*!*/;
# at 665
#131128 17:50:46 server id 1 end_log_pos 692 Xid = 1454 ---->执行时间:17:50:46;pos点:692
...............................................................................
注: server id 1 数据库主机的服务号;
end_log_pos 665 pos点
thread_id=11 线程号
4.2:上面这种办法读取出binlog日志的全文内容较多,不容易分辨查看pos点信息,这里介绍一种更为方便的查询命令:
mysql> show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
选项解析:
IN 'log_name' 指定要查询的binlog文件名(不指定就是第一个binlog文件)
FROM pos 指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
LIMIT [offset,] 偏移量(不指定就是0)
row_count 查询总条数(不指定就是所有行)
截取部分查询结果:
*************************** 20. row ***************************
Log_name: mysql-bin.000021 ----------------------------------------------> 查询的binlog日志文件名
Pos: 11197 ----------------------------------------------------------> pos起始点:
Event_type: Query ----------------------------------------------------------> 事件类型:Query
Server_id: 1 --------------------------------------------------------------> 标识是由哪台服务器执行的
End_log_pos: 11308 ----------------------------------------------------------> pos结束点:11308(即:下行的pos起始点)
Info: use `zyyshop`; INSERT INTO `team2` VALUES (0,345,'asdf8er5') ---> 执行的sql语句
*************************** 21. row ***************************
Log_name: mysql-bin.000021
Pos: 11308 ----------------------------------------------------------> pos起始点:11308(即:上行的pos结束点)
Event_type: Query
Server_id: 1
End_log_pos: 11417
Info: use `zyyshop`; /*!40000 ALTER TABLE `team2` ENABLE KEYS */
*************************** 22. row ***************************
Log_name: mysql-bin.000021
Pos: 11417
Event_type: Query
Server_id: 1
End_log_pos: 11510
Info: use `zyyshop`; DROP TABLE IF EXISTS `type`
这条语句可以将指定的binlog日志文件,分成有效事件行的方式返回,并可使用limit指定pos点的起始偏移,查询条数;
A.查询第一个(最早)的binlog日志:
mysql> show binlog events\G;
B.指定查询 mysql-bin.000021 这个文件:
mysql> show binlog events in 'mysql-bin.000021'\G;
C.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起:
mysql> show binlog events in 'mysql-bin.000021' from 8224\G;
D.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,查询10条
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 10\G;
E.指定查询 mysql-bin.000021 这个文件,从pos点:8224开始查起,偏移2行,查询10条
mysql> show binlog events in 'mysql-bin.000021' from 8224 limit 2,10\G;
参考: https://www.cnblogs.com/martinzhang/p/3454358.html 写的很好的一篇关于binlog文章