1. 什么是 binlog?
mysql-binlog是MySQL数据库的二进制日志,用于记录用户对数据库操作的SQL语句((除了数据查询语句)信息。
可以使用mysqlbin命令查看二进制日志的内容。
MySQL分为两大部分。上层是MySQL-Server
,下层是可插拔的存储引擎
。
image.png
2. binlog使用说明
2.1 查看binlog位置
binlog
存放的位置由datadir
参数控制
执行下面的查询语句即可:
mysql> show variables like '%datadir%';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| datadir | /usr/local/mysql/data/ |
+---------------+------------------------+
1 row in set (0.00 sec)
目录下有两种文件:binlog.0000XX
和 binlog.index
image.png
-
binlog.0000XX
: 保存着对MySQL更改的逻辑 -
binlog.index
: 就是位置索引,后续备份恢复使用
image.png
2.2 查看binlog是否已开启
mysql> show variables like 'log_%';
+----------------------------------------+----------------------------------------+
| Variable_name | Value |
+----------------------------------------+----------------------------------------+
| log_bin | ON |
| log_bin_basename | /usr/local/mysql/data/binlog |
| log_bin_index | /usr/local/mysql/data/binlog.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_error | ./error.log |
| log_error_services | log_filter_internal; log_sink_internal |
| log_error_verbosity | 2 |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | ON |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_statements_unsafe_for_binlog | ON |
| log_syslog | ON |
| log_syslog_facility | daemon |
| log_syslog_include_pid | ON |
| log_syslog_tag | |
| log_throttle_queries_not_using_indexes | 0 |
| log_timestamps | UTC |
+----------------------------------------+----------------------------------------+
20 rows in set (0.01 sec)
mysql>
2.3 查看binlog日志内容
mysql> show binlog events; #只查看第一个binlog文件的内容
mysql> show binlog events in 'binlog.000002'; #查看指定binlog文件的内容
mysql> show binary logs; #获取binlog文件列表
mysql> show master status; #查看当前正在写入的binlog文件
binlog相关配置(仅供参考)
一般关于binlog的配置都写在MySQL的配置文件中: my.cnf , 以方便启动mysql时直接让这些配置生效
[mysqld]
# binlog相关配置
# 指定binlog日志存储的位置
datadir = /home/mysql/mysql/var
# 规范binlog的命名为 mysql-bin.0000XX
# 【开启binlog】加这行配置,binlog文件名为主机名
log-bin = mysql-bin
# 索引当前所有的binlog
log-bin-index = mysql-bin.index
# 最大的大小
max_binlog_size = 1G
# binlog的sync时机
sync-binlog = 1
# binlog的格式
binlog-format = ROW
# 保留七天的binlog
expire_logs_days = 7
binlog 有啥用?
- binlog中记录的是偏向逻辑层面的记录:如:对xxx表中的id=yyy的行做做了什么修改,更改后的值是什么。
- binlog不会记录你的 select 、show这类的操作。
- 你可以在query log中找到曾经执行过的诸如select、show这种仅查询的SQL。
常见的binlog有如下的作用
- delete没加where条件?不慌!binlog可以帮你恢复数据
- 搭建一套一主两从的MySQL集群,binlog帮你完成主从的数据同步。
- 审计,通过分析binlog可以排查是否存在SQL注入攻击。
常见的binlog操作指令
# 是否启用binlog日志
show variables like 'log_bin';
# 查看详细的日志配置信息
show global variables like '%log%';
# mysql数据存储目录
show variables like '%dir%';
# 查看binlog的目录
show global variables like "%log_bin%";
# 查看当前服务器使用的biglog文件及大小
show binary logs;
# 查看主服务器使用的biglog文件及大小
# 查看最新一个binlog日志文件名称和Position
show master status;
# 事件查询命令
# IN 'log_name' :指定要查询的binlog文件名(不指定就是第一个binlog文件)
# FROM pos :指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
# LIMIT [offset,] :偏移量(不指定就是0)
# row_count :查询总条数(不指定就是所有行)
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
# 查看 binlog 内容
show binlog events;
# 查看具体一个binlog文件的内容 (in 后面为binlog的文件名)
show binlog events in 'master.000003';
# 设置binlog文件保存事件,过期删除,单位天
set global expire_log_days=3;
# 删除当前的binlog文件
reset master;
# 删除slave的中继日志
reset slave;
# 删除指定日期前的日志索引中binlog日志文件
purge master logs before '2019-03-09 14:00:00';
# 删除指定日志文件
purge master logs to 'master.000003';