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
4mysql-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
6show variables like 'binlog_format';
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+row:行级模式(MySQL5.7默认)
- 记录执行的SQL语句,并且还要记录变化过程
- 优点:记录更加严谨。
- 缺点:不易读、占用磁盘空间大。
1
2
3
4
5
6show 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 许可协议。转载请注明来自 奥利奥の麦旋风!