MySQL日志管理

Posted Y753

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL日志管理相关的知识,希望对你有一定的参考价值。

mysql日志简介

MySQL日志管理_log日志

错误日志

默认是否开启:开启

默认路径及文件名 

  • 源码和二进制安装:datadir/$hostname.err
  • yum安装:/var/log/mysql.log 

是否可以修改:可以

作用:查看 MySQL启动时的 报错找[error]

如何修改

[root@db03 data]# vim /etc/my.cnf
[mysqld]
log_error=/tmp/yjt.txt

show variables like log_error;
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| log_error | stderr |
+---------------+--------+

常规日志

默认是否开启:否

默认路径及文件名:datadir/$hostname.log

是否可以修改:可以

作用:记录MySQL的常规操作

如何修改

show variables like general_log;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | OFF |
+---------------+-------+

# 默认状态关闭
general_log OFF
general_log_file /application/mysql/data/db02.log

### 常规日志开启(在企业中是不会开启该日志的,因为会记录所有的SQL,会很快把磁盘塞满)
[root@db03 data]# vim /etc/my.cnf
[mysqld]
general_log=1
general_log_file=/tmp/yjt.log


MySQL日志管理_慢查询_02

二进制日志(binlog)

默认是否开启:否定

show variables like log_bin;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+

默认路径及文件名:datadir/xxx.000001

是否可以修改:可以

作用

MySQL日志管理_慢查询_03

如何修改

  • statment:语句模式(MySQL5.6默认的工作模式)
show variables like binlog_format;
+---------------+-----------+
| Variable_name | Value |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+

将所有的语句,记录在binlog中
优点:通俗易懂,占用磁盘少
缺点:不严谨
  • row:行级模式(MySQL5.7的默认工作模式)
show variables like binlog_format;
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW |
+---------------+-------+

将所有的语句及变化过程,记录在binlog中
优点:严谨
缺点:不易懂、占用磁盘空间大
  • mixed:混合模式
语句模式和行级模式的混合模式
自己会判断,什么时候只记录语句,什么时候记录语句和变化过程

没人用

工作模式如何修改

[root@db03 data]# vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin
binlog_format=row

如何查看二进制日志

# 命令
mysqlbinlong

## 查看默认语句模式
[root@db03 data]# mysqlbinlog mysql-bin.000001
命令+文件
命令+选项+文件

## 查看行级模式
[root@db03 data]# mysqlbinlog -vvv --base64-output=decode-row mysql-bin.000001
可以查看被加密的部分日志

## 库内查看当前有几个binlog日志及大小
show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 2479 |
+------------------+-----------+

## 库内查看binlog日志的事件
show binlog events in mysql-bin.000001;
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+----------------------------------------------------------+
| mysql-bin.000001 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.30-log, Binlog ver: 4 |
| mysql-bin.000001 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000001 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= ANONYMOUS |
| mysql-bin.000001 | 219 | Query | 1 | 319 | create database binlog |
+------------------+-----+-------------+-----------+-------------+-------------------------------------------+

事件介绍

MySQL日志管理_mysql_04

## mysql5.6
在MySQL5.6中,一个新的binlog起始位置点是120,120是系统信息预留的空间
其实120就是该文件的大小
143是空binlog,里面没有任何SQL语句执行

## MySQL5.7
在MySQL5.7中,一个新的binlog起始位置点是154,154是系统信息预留空间
其实154,就是该文件的大小
177是空binlog,里面没有任何SQL语句执行

二进制日志数据故障恢复

#查看binlog信息
mysql> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 154 |
+------------------+----------+

# 创建binlog数据库
mysql[(none)]> create database binlog;

# 查看位置点
mysql> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 319 |
+------------------+----------+

# 创建一张表
mysql[(none)]> use binlog
mysql[binlog]> create table tb1(id int);

# 查看位置点
mysql[binlog]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 486 |
+------------------+----------+

# 插入数据
mysql[binlog]> insert into tb1 values(1),(2),(3);

mysql[binlog]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 486 |
+------------------+----------+

mysql[binlog]> commit;


mysql[binlog]> select * from tb1;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
+------+


mysql[binlog]> update tb1 set id=10 where id=1;

mysql[binlog]> commit;

mysql[binlog]> select * from tb1;
+------+
| id |
+------+
| 10 |
| 2 |
| 3 |
+------+


mysql[binlog]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 1018 |
+------------------+----------+

mysql[binlog]> delete from tb1 where id=2;

mysql[binlog]> commit;

mysql[binlog]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 1276 |
+------------------+----------+

mysql[binlog]> select * from tb1;
+------+
| id |
+------+
| 10 |
| 3 |
+------+

## 删除表
mysql[binlog]> drop table tb1;

mysql[binlog]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 1461 |
+------------------+----------+

## 删除库
mysql[binlog]> drop database binlog;

mysql[(none)]> show master status;
+------------------+----------+
| File | Position |
+------------------+----------+
| mysql-bin.000004 | 1615 |
+------------------+----------+

如何恢复

# 1.查看binlog,找到起始位置点和结束位置点
[root@db04 data]# mysqlbinlog -vvv --base64-output=decode-row mysql-bin.000004
起始位置点:219
+------+
| id |
+------+
| 10 |
| 2 |
| 3 |
+------+
结束位置点:1018

# 2.截取binlog
mysqlbinlog --start-position=219 --stop-position=1018 mysql-bin.000004 > /tmp/1.sql

# 3.导入截取出来的数据
[root@db04 data]# mysql </tmp/1.sql

# 4.查询数据
mysql[(none)]> use binlog
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql[binlog]> show tables;
+------------------+
| Tables_in_binlog |
+------------------+
| tb1 |
+------------------+
1 row in set (0.00 sec)

mysql[binlog]> select * from tb1;
+------+
| id |
+------+
| 10 |
| 2 |
| 3 |
+------+

存在问题

MySQL日志管理_慢查询_05

解决方案:
只需要过滤出,被删除的数据库相关binlog中的sql语句
使用-d指定数据库截取binlog
[root@db04 data]# mysqlbinlog -d tb1 -vvv --base64-output=decode-row mysql-bin.000001

刷新binlog

# 1.重启数据库会自动刷新binlog
# 2.当binlog大小达到1G的时候,会自动刷新出下一个binlog
# 3.手动执行 flush logs;
# 4.使用mysqladmin flush-log
[root@db04 data]# mysqladmin flush-log
# 5.使用mysqldump做备份时,可以刷新binlog
[root@db02 data]# mysqldump -A -F > /tmp/full.sql
每有一张表就会刷新出一个binlog日志,不建议使用。。。。

删除binlog

原则:
在存储能力范围内,能保留多少binlog就保留多少binlog

# 1.根据存在时间删除日志
# 临时生效
mysql> set global expire_logs_days = 7;
删除七天前的binlog日志

# 永久生效(不建议使用)
[root@db01 data]# vim /etc/my.cnf
[mysqld]
expire_logs_days = 7

# 2.删除指定时间段binlog
mysql> purge binary logs before now() - interval 3 day;
删除三天内的binlog

# 3.指定binlog名字删除,之前的binlog都删除
mysql> purge binary logs to mysql-bin.000010;
删除 mysql-bin.000001到mysql-bin.000009之间的全部binlog日志

# 4.重置binlog,删除所有binlog
mysql> reset master;

#### 切勿使用,会把所有的binlog日志重置变成
show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 120 |
+------------------+-----------+

慢日志(慢查询日志)

默认是否开启:否

| slow_query_log                          | OFF                                     |
| slow_query_log_file | /application/mysql/data/db02-slow.log |

默认路径及*文件名:datadir/$hostname-slow.log

是否可以修改:可以

作用

  • 记录执行的比较慢的SQL语句

如何修改

[root@db01 ~]# vim /etc/my.cnf
[mysqld]
# 指定是否开启慢查询日志
slow_query_log = 1
# 指定慢日志文件存放位置(默认在data)
slow_query_log_file=/application/mysql/data/slow.log
# 设定慢查询的阀值(默认10s)
long_query_time=0.05
# 不使用索引的SQL语句是否记录到慢查询日志
log_queries_not_using_indexes


------------------------------------------------------------
# 查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
min_examined_row_limit=1000(鸡肋)

查看慢查询日志

# 命令
mysqldumpslow

# 选项
-s:指定如何排序
c:按照记录次数
t:按照时间排序
r:按照返回记录排序
l:按照查询时间排序

ac:按照记录次数 倒序排序
at:按照时间排序 倒序排序
ar:按照返回记录 倒序排序
al:按照查询时间 倒序排序

-t:top N
-g:指定正则表达式

## 举例
[root@db03 data]# mysqldumpslow -s c -t 5 slow.log

percona 慢查询工具

wget http://test.driverzeng.com/MySQL_Package/percona-toolkit-3.0.11-1.el6.x86_64.rpm

[root@db03 data]# yum localinstall -y percona-toolkit-3.0.11-1.el6.x86_64.rpm

[root@db02 ~]# pt-query-digest /application/mysql/data/slow.log

以上是关于MySQL日志管理的主要内容,如果未能解决你的问题,请参考以下文章

19MySQL日志管理(下)

库在可执行文件内调用函数,而不是在库内

phpstorm中的mysql怎么用

Mysql数据库理论基础之十一 ---- 日志管理

17. ClustrixDB 日志管理

Mysql安装