- 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'; #删除指定时间以前的日志文件