博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL的binlog日志
阅读量:4570 次
发布时间:2019-06-08

本文共 5224 字,大约阅读时间需要 17 分钟。

一: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文章,所以我直接拿来了

转载于:https://www.cnblogs.com/jiujuan/p/10397362.html

你可能感兴趣的文章
实用工具【SqlPrompt】 【Subline】 【XMind】 【PhotoShop】 【TakeColor】 【Q+】本次只讨论SqlPrompt...
查看>>
java——推断日期是否在今天之前
查看>>
微信oauth获取用户的信息页面授权
查看>>
hdu 2067 兔子板
查看>>
允许Ubuntu14.04"保存"屏幕亮度值
查看>>
关机相关(shutdown,reboot)
查看>>
JSP中Session的使用
查看>>
解决SecureCRT中文显示乱码
查看>>
Android Studio升级后projectBuild failed.
查看>>
Web之真假分页
查看>>
javascript继承
查看>>
linux高性能服务器编程--初见
查看>>
获取图片的大小(KB)
查看>>
[WCF REST] 一个简单的REST服务实例
查看>>
浅析Sql Server参数化查询
查看>>
crontab 的使用
查看>>
DB门面,orm基础及blade(laravel)
查看>>
Python之路,Day6 - 面向对象学习
查看>>
无论如何也要看的书
查看>>
二叉树的最大深度
查看>>