Mysql日志管理

孤街浪徒 提交于 2019-12-04 21:03:43

toc
  • error log 错误日志
    • 记录mysql启停错误信息用于排错
  • general log 普通日志
    • 记录客户端查询日志用于开发
  • bin log 二进制日志
    • 增量备份 DDL DML DCL 用于备份
  • relay log 中继日志
    • 接收 replication master 常用于主从复制
  • slow log 慢查询日志
    • 查询时间超过指定值用于调优

错误日志

Mysql 的错误日志 error log 记录 mysqld 服务进程启动/关闭或运行过遇到的错误日志。

错误日志默认开启(没有开启按照如下方式开启)

## 在配置文件 [mysqld] 标签内增加 log-error=/log/mysql/err.log
[root@Mysql ~]# vim /etc/my.cnf
[mysqld]
......
log-error=/log/mysql/err.log
## 创建对应目录与日志文件
[root@Mysql ~]# mkdir -p /log/mysql/
[root@Mysql ~]# touch /log/mysql/err.log
## 更改日志文件属主和属组为 mysql
[root@Mysql ~]# chown -R mysql.mysql /log/mysql/err.log
## 重启数据库生效
[root@Mysql ~]# systemctl restart mysqld
## 查看错误日志
[root@Mysql ~]# tailf /log/mysql/err.log
## 通过终端查看日志
mysql> show variables like "log_error%";

查询日志

普通查询日志 general query log 记录客户端连接信息和执行的所有 SQL 语句信息, 默认关闭

开启普通查询日志

## 在配置文件 [mysqld] 标签内增加如下两条
[root@Mysql ~]# cat /etc/my.cnf
[mysqld]
......
general_log=ON
general_log_file=/log/mysql/select.log
## 创建对应目录与日志文件
[root@Mysql ~]# mkdir -p /log/mysql
[root@Mysql ~]# touch /log/mysql/select.log
## 更改日志文件属主和属组为 mysql
[root@Mysql ~]# chown mysql.mysql /log/mysql/select.log
## 重启数据库生效
[root@Mysql ~]# systemctl restart mysqld
## 查看普通查询日志
[root@Mysql ~]# cat /log/mysql/select.log
## 终端查询日志情况
mysql> show variables like 'general_log%';

临时开启和关闭查询日志

## 临时开启查询日志
mysql> set global general_log = On;
## 临时关闭查询日志
mysql> set global general_log = Off;

慢查询日志

慢查询日志 slow query log 记录执行过长的 SQL 语句, 可利用慢查询优化进行调试优化,不调试不建议开启

开启慢查询日志

## 在配置文件 [mysqld] 标签内增加如下几条
[root@Mysql ~]# cat /etc/my.cnf
[mysqld]
......
slow_query_log = on
slow_query_log_file=/log/mysql/slow.log
long_query_time=2 # 多长时间的查询语句记录到日志里面,单位为妙
log_queries_not_using_indexes # 没有启用索引的查询语句
## 创建对应目录与日志文件
[root@Mysql ~]# mkdir -p /log/mysql
[root@Mysql ~]# touch /log/mysql/slow.log
## 更改日志文件属主和属组为 mysql
[root@Mysql ~]# chown mysql.mysql /log/mysql/slow.log
## 重启数据库生效
[root@Mysql ~]# systemctl restart mysqld

执行过慢语句进行测试

mysql> select benchmark(50000000,2*3);
## 检查慢日志是否记录
[root@Mysql ~]# cat  /log/mysql/slow.log

二进制日志

二进制日志,用于记录用户对数据库操作的SQL语句(除了数据查询语句)信息。可以使用 mysqlbinlog 命令查看二进制日志的内容。

binlog的格式也有三种模式

  • STATMENT模式:基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中。
    • 优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
    • 缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
  • ROW模式:基于行的复制(row-based replication, RBR):不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。
    • 优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
    • 缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。
  • MIXED模式:混合模式复制(mixed-based replication, MBR):以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。(推荐使用)

开启 binlog 二进制日志

## 在配置文件 [mysqld] 标签内增加如下几条
[root@Mysql ~]# cat /etc/my.cnf
[mysqld]
......
server-id = 1
binlog_format = mixed # 指定用什么模式
log-bin = /log/mysql/bin/mysql-bin
expire_logs_days = 30 # 多少天后的日志将会被自动删除
## 创建对应目录
[root@Mysql ~]# mkdir /log/mysql/bin
## 更改目录属主和属组为 mysql
[root@Mysql ~]# chown -R mysql.mysql /log/mysql/
## 重启数据库生效
[root@Mysql ~]# systemctl restart mysqld
## 查看 binlog 日志信息
[root@sql ~]# mysqlbinlog -v /log/mysql/bin/binlog.000001
## 终端查询日志情况
mysql> show variables like '%bin_log%';
  • mysqlbinlog 恢复日志
    • -v或 -verbose :从二进制日志中重建 SQL 语句
    • -vv :不光从二进制日志中重建 SQL 语句,并且增加备注
    • -D 或 --disable-log-bin :指定不恢复的内容
    • -d 或 --database :指定数据库,只显示指定数据库的内容
    • -o :指定偏移量
    • -r :指定内容保存的文件。和 > 写入指定文件一样
    • -s 或 --short-form :只显示 SQL 语句
    • -R 或 -read-from-remote-server :指示mysqlbinlog命令从远程服务器读取日志文件
    • -h 或 --host :指定远程服务器的ip地址
    • -p :将提示输入密码。默认情况下,它将使用“root”作为用户名。也可以使用 -u 选项指定用户名。
    • --start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
    • --stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间
    • --start-position:从二进制日志中读取指定position 事件位置作为开始
    • --stop-position:从二进制日志中读取指定position 事件位置作为事件截至
    • --base64-output= :指定二进制日志中显示内容
      never :输出中显示base64编码的BINLOG语句
      always :只显示BINLOG项
      decode-rows :和 -v 配合把基于行的事件解码成一个SQL语句
      auto(默认) :显示全部
    • --debug-check :返回之后调试结果,使用资源情况
## 使用时间节点进行恢复
# mysqlbinlog mysql.000002 --start-datetime="2018-05-07 12:05:00"
# mysqlbinlog mysql.000002 --stop-datetime="2018-05-07 11:02:54"
# mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" -stop-datetime="2018-12-05 11:02:54"
## 使用位置点进行恢复
# mysqlbinlog mysql.000002 --start-position=124
# mysqlbinlog mysql.000002 --stop-position=124
# mysqlbinlog mysql.000002 --start-position=124 --stop-position=336

日志截断

  • 切割 binlog 日志
    • 重启 mysqld 服务, 在 mysql 控制台执行 mysql> flush logs
    • 在 mysql 控制台执行 reset master 会清空所有 binlog (危险)
  • 删除部分 binlog 日志
    • mysql> purge master logs to 'sql_70_161.000004'; #删除指定日志以前的日志文件
    • mysql> purge binary logs before '2018-05-07 11:57:33'; #删除指定时间以前的日志文件
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!