10.MySQL日志管理
[toc]
MySQL日志简介

错误日志
- 作用: - 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志。 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15- [ERROR] Could not use /application/mysql/data/slow.log for logging 
 (error 2 - No such file or directory). Turning logging off for the
 server process. To turn it on again: fix the cause, then either
 restart the query logging by using "SET GLOBAL SLOW_QUERY_LOG=ON"
 or restart the MySQL server.
 # 服务没有启动
 ps -ef|grep mysql
 netstat -lntup
 # 启动并生成了socket但是位置不对
 [mysqld]
 socket=/xxx
 [mysql]
 socket=/xxx
 
- 默认位置: - 源码安装 二进制安装 - 1 - $DATADIR 
- yum安装 - 1 - /var/log/ 
 
- 文件名 - 源码安装 二进制安装 - 1 - $hostname.err 
- yum安装 - 1 - mysqld.log 
 
- 默认是否开启 - 开启
 
- 开启方式: - (MySQL安装完后默认开启) - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14- # 命令行启动: 
 mysqld --log-error=/tmp/a.log
 # 配置文件开启
 vim /etc/my.cnf
 [mysqld]
 log_error=/application/mysql/data/$hostname.err
 # 注意:只要不将放在带有setuid权限的目录下,那就需要先创建再授权,然后才能启动MySQL
 touch /opt/a.log
 chown mysql.mysql /opt/a.log
 # 查看方式
 show variables like 'log_error';
 
一般查询日志
- 作用 - 记录mysql所有执行成功的SQL语句信息,可以做审计用,因为会占用大量磁盘空间所以很少开启。
 
- 默认位置 - 源码安装 二进制安装 - 1 - $DATADIR 
- yum安装 - 1 - /var/log/mysql/ 
 
- 文件名 - 源码安装 二进制安装 yum安装 - 1 - $hostname.log 
 
- 默认是否开启 - 不开启
 
- 开启方式 - (MySQL安装完之后默认不开启) - 1 
 2
 3
 4
 5
 6
 7
 8- # 编辑配置文件开启 
 vim /etc/my.cnf
 [mysqld]
 general_log=on
 general_log_file=/application/mysql/data/$hostnamel.log
 # 查看方式
 show variables like '%gen%';
 
慢查询日志
慢查询日志解析
- 作用 - 是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件
- 通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的
 
- 默认位置 - 源码安装 二进制安装 yum安装 - 1 - $DATADIR 
 
- 文件名 - 源码安装 二进制安装 yum安装 - 1 - $hostname-slow.log 
 
- 默认是否开启 - 不开启
 
- 开启方式 - (MySQL安装完之后默认不开启) - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18- # 编辑配置文件开启 
 vim /etc/my.cnf
 [mysqld]
 slow_query_log=1
 long_query_time=0.05 # 设置SQL语句查询时间阈值
 log_queries_not_using_indexes
 # 配置文件解析
 ## 指定是否开启慢查询日志
 slow_query_log = 1
 ## 设定慢查询的阀值(默认10s)
 long_query_time=0.05
 ## 不使用索引的慢查询日志是否记录到索引
 log_queries_not_using_indexes
 ## 指定慢日志文件存放位置(默认在data)
 slow_query_log_file=/application/mysql/data/slow.log
 ## 查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
 min_examined_row_limit=100
 
慢查询日志查看工具
使用mysqldumpslow命令来分析慢查询日志
| 1 | # 输出记录次数最多的10条SQL语句 | 
使用percona公司提供的pt-query-digest工具分析慢查询日志

| 1 | # yum安装 | 
可以二次开发做成可视化界面
Anemometer基于pt-query-digest将MySQL慢查询可视化

二进制日志
二进制日志解析
- 作用 - 记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
- 记录所有DDL、DCL等语句
- 二进制日志会记录所有对数据库发生修改的操作
 
- binlog的作用 - 如果我拥有数据库搭建开始所有的二进制日志,那么我可以把数据恢复到任意时刻
- 数据的备份恢复
- 数据的复制
 
- 默认位置 - 源码安装 二进制安装 yum安装 - 1 - $DATADIR 
 
- 文件名 - 源码安装 二进制安装 yum安装 - 1 
 2
 3
 4- mysql-bin.000001 
 mysql-bin.000002
 mysql-bin.000003
 ...
 
- 默认是否开启 - 开启
 
- 开启方式 - mysql5.6 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10- # 编辑配置文件开启 
 vim /etc/my.cnf
 [mysqld]
 log-bin=/app/mysql/data/zls-bin
 ## 二进制日志存放位置
 binlog_format=row
 ## binglog的工作模式
 # 查看是否开启
 show master status;
 
- mysql5.7 - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12- # 编辑配置文件开启 
 vim /etc/my.cnf
 [mysqld]
 log-bin=mysql-bin
 ## 二进制日志存放位置
 binlog_format=row
 ## binglog的工作模式
 server_id=1
 ## 注意:在mysql5.7中开启binlog必须要加上server-id。
 # 查看是否开启
 show master status;
 
binlog的工作模式
- statement:语句模式(MySQL5.6默认) - 只记录执行的SQL语句
- 优点:通俗易懂、占用磁盘空间小。
- 缺点:记录不够严谨。
 - 1 
 2
 3
 4
 5
 6- show variables like 'binlog_format'; 
 +---------------+-----------+
 | Variable_name | Value |
 +---------------+-----------+
 | binlog_format | STATEMENT |
 +---------------+-----------+
- row:行级模式(MySQL5.7默认) - 记录执行的SQL语句,并且还要记录变化过程
- 优点:记录更加严谨。
- 缺点:不易读、占用磁盘空间大。
 - 1 
 2
 3
 4
 5
 6- show variables like 'binlog_format'; 
 +---------------+-------+
 | Variable_name | Value |
 +---------------+-------+
 | binlog_format | ROW |
 +---------------+-------+
- mixed:混合模式 
二进制日志的操作
| 1 | # 查看二进制日志的工具 | 
事件介绍
- 在binlog中最小的记录单元为event
- 一个事务会被拆分成多个事件(event)
事件特性
| 1 | # mysql5.6 | 
row模式下二进制日志分析及数据恢复
准备数据误删环境
| 1 | # 刷新二进制日志 | 
恢复数据步骤
| 1 | # 1.查看binlog内容 | 
binlog存在问题
- 恢复成本很高 - 数据库或表被误删除的是很久之前创建的(一年前) 
- 解决方案:结合mysqldump全备恢复数据,binlog对于我们来说,只能 
 当增量数据数据备份- 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46- # 查找binlog中的内容两种方式 
 ## statement
 mysqlbinlog /var/lib/mysql/xxx.000001
 ## row
 mysqlbinlog --base64-output=decode-rows -vvv /var/lib/mysql/xxx.000001
 ## 进入数据库查看binlog事件
 mysql> show binlog events in 'mysql-bin.000002';
 # 多个库的二进制日志穿插示例
 mysql> insert into db2.tb2 values(6);
 mysql> insert into db2.tb2 values(7);
 mysql> commit;
 mysql> insert into db2.tb2 values(8);
 mysql> commit;
 mysql> insert into db1.tb1 values(5);
 mysql> insert into db1.tb1 values(6);
 mysql> commit;
 mysql> select * from db1.tb1;
 +------+
 | id |
 +------+
 | 1 |
 | 2 |
 | 3 |
 | 4 |
 | 5 |
 | 6 |
 +------+
 mysql> select * from db2.tb2;
 +------+
 | id |
 +------+
 | 1 |
 | 2 |
 | 3 |
 | 4 |
 | 5 |
 | 6 |
 | 7 |
 | 8 |
 +------+
 起始位置点:2437
 结束位置点:3289
 
- 如果只想恢复某一个库的数据 - 过滤数据,不能使用’grep’ - 1 
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11- # 指定查看某个库相关的二进制日志 
 -d '库名'
 mysqlbinlog --start-position=154 --stop-position=1779 -d 'db1' /var/lib/mysql/mysql-bin.000003 >/tmp/db1.sql
 起始位置点:154
 结束位置点:1779
 # 恢复数据
 mysql> set sql_log_bin=0;
 mysql> source /tmp/db1.sql
 mysql> set sql_log_bin=1;
 
binlog刷新机制
- 自动刷新- 重启MySQL之后会刷新
- 当binlog大小达到1G的时候,会自动刷新
 
- 手动刷新- mysqladmin -uroot -p123@qqdianCOM flush-log
- mysql> flush logs;
- 做备份时,可以加刷新binlog的参数- mysqldump -F
- 此参数在备份时使用,会刷新出基于当前库数量的二进制日志文件
 
 
删除binlog
| 1 | # 1.根据时间删除 | 
模拟生产环境误删除库并恢复数据
操作流程
| 1 | # 模拟用户写入数据 | 
注意:因为binlog存在问题,结合mysqldump全备恢复数据,binlog对于我们来说,只能
当增量数据
解决方案:MySQL全备 + binlog增量备份
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 奥利奥の麦旋风!




