赞
踩
MySQL
数据库中常见的日志文件error log
)binlog
)slow query log
)general log
)错误日志(error log
)对MySQL
的启动、运行、关闭过程进行了记录, 主要作用是帮助 MySQL DBA
在遇到问题时快速定位问题。 该文件不仅记录了所有的错误信息(ERROR
),也记录了一些警告信息(Warning
)以及普通信息(Note
)。错误日志默认是开启的,默认存放路径为datadir
,默认的日志文件名为hostname.err
(hostname
为主机名),且错误日志是可以直接阅读的日志,建议开启。
# 设置错误日志log-err存储路径及文件名前缀
log-error = /usr/local/mysql/logs/mysql-error
show variables like 'log_error%';
二进制日志(binlog
)记录了对MySQL
数据库执行更改的所有操作,但是不包括select
和show
语句,其中包括了所有的DDL
(数据定义语言)和DML
(数据操作语言),如create
、alter
、drop
、truncate
以及insert
、delete
、update
等,主要作用是进行数据恢复和主从复制。
二进制日志默认为关闭状态,需要在MySQL
配置文件中进行开启,并设置二进制日志文件的日志记录形式。开启二进制日志对于MySQL
整体性能会有一定的影响,大于为1%,但是考虑到二进制日志提供的功能,这种性能损失是完全可以接受的,建议开启。
# 设置二进制日志log-bin存储路径及文件名前缀
# 若不指定具体路径,则是存放在datadir路径下
log-bin = /usr/local/mysql/logs/mysql-bin
# 设置binlog日志记录格式
binlog-format = STATEMENT
在存储二进制日志文件的文件夹内,一般包含二进制日志索引文件(.index
)和二进制日志文件(.00000X
),其中二进制日志索引文件(.index
)中记录的是所有二进制日志文件的文件名,是直接可阅读的,而二进制日志文件(.00000X
)记录的则是二进制日志,不可以直接阅读,可以使用MySQL服务器命令行工具 mysqlbinlog
进行查看。
STATEMENT
:在此记录格式下,二进制日志文件中记录的是对数据库造成修改的逻辑SQL
语句,通过mysqlbinlog
工具看到的是修改行为对应的SQL
语句;ROW
: 在此记录格式下,二进制日志文件中不再是记录简单的SQL
语句,而是记录表的行更改情况,是目前(MySQL 5.7
)默认的二进制日志文件的记录格式,由于记录的是表中行记录的更改,当进行批量修改时,相比于STATEMENT
需要占用的存储空间要大得多;MIXED
:在此记录格式下,MySQL
一般会采用STATEMENT
格式进行二进制文件的记录,但是在一些特殊情况下会使用ROW
格式进行记录。并不是所有的存储引擎都支持
STATEMENT
和ROW
记录格式。
使用MySQL
提供的服务器命令行工具mysqlbinlog
可以通过多种方式查看和管理二进制日志文件binlog
。在MySQL
客户端命令行也可以使用对应命令查看二进制日志。
# 语法
mysqlbinlog [options] log-files1 log-files2...
# 常用选项
-d, --database=name 指定数据库名称
-o, --offset=n 设置查看的偏移量,即忽略前n行
-r, --result-file=name 将显示内容输出到指定文件
-s, --short-from 按照简单格式显示,省略部分信息
--start-datatime=detel --stop-datatime=date2
指定日志显示条目的时间间隔
--start-position=pos1 --stop-position=pos2
指定日志显示条目的开始和结束位置
MySQL
客户端直接执行reset master
命令,直接删除所有的 binlog
日志,并且日志编号从000001
重新开始;MySQL
客户端执行PURGE MASTER LOGS TO 'mysql-bin.xxxxxx'
,此命令将删除指定编号之前的所有二进制日志,需要指定二进制日志文件名;MySQL
客户端执行命令PURGE BINARY LOGS BEFORE 'YYYY-MM-DD hh:mm:ss';
,此命令将删除指定日期之前的所有二进制日志;binlog
的自动过期天数,日志存放指定时间后将被自动删除,可以通过在MySQL
配置文件中设置expire-logs-days
参数,或者直接在MySQL
客户端命令行中设置全局变量expire_logs_days
来开启自动日志清除。MySQL
官方提供的mysqlbinlog
命令行工具不仅可以查看binlog
日志文件,还可以基于binlog
二进制日志文件对数据库中的数据进行恢复,实际上就是将对数据库进行修改的逻辑 SQL
语句再顺序执行一次。
进行数据恢复时必须要有对应数据库某个时间点的备份。例如:如果误删了某张表的数据,则可以先将数据库恢复最近的备份状态,然后从二进制文件中获取上一次备份的到删表之前的SQL
语句重新执行,最终将数据库恢复到删表之前的状态。
获取删表前到数据库备份时二进制日志位置,以及删除表过程在二进制日志中的起始位置;
找出备份过程在对应二进制日志中的结束位置**pos1
** :
cat books.sql | grep -i "CHANGE MASTER TO MASTER_LOG_FILE"
# 示例
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=3361;
找到删除表过程在对应二进制日志中的开始位置 pos2
,通过 less
命令检索指定 SQL
语句定位pos
:
mysql -uroot -proot -e "show binlog events in 'mysql-bin.000002'\G" | less -N
# 示例
*************************** 40. row ***************************
Log_name: mysql-bin.000002
Pos: 3713
Event_type: Query
Server_id: 1
End_log_pos: 3845
Info: use `books`; DROP TABLE IF EXISTS `authors` /* generated by server */
导入备份库数据重建库
mysql -uroot -proot < books.sql
获取对应二进制日志文件中pos1
到pos2
之间修改指定数据库的SQL
语句并重新执行:
mysqlbinlog --start-position=3361 --stop-position=3713 -d books mysql-bin.000002 | mysql -uroot -proot
慢查询日志(slow query log
)能够记录执行时间超过某阈值的SQL
语句,且只记录成功执行的SQL
语句,可以帮助DBA
定位可能存在问题的SQL
语句,从而进行SQL
语言层面的查询优化。慢查询日志默认文件名为主机名-slow.log
,默认存放路径为datadir
,默认为关闭状态,建议开启。
# 同时设置查询日志general log和慢查询日志slow query log输出方式(可选FILE/TABLE/NONE/FILE,TABLE)
log-output = FILE
# 设置启动慢查询日志slow-query-log
slow-query-log=1
# 设置慢查询日志slow-query-log存储路径及文件名
slow-query-log-file = /usr/local/mysql/logs/slow_query_log.log
# 设置慢查询阈值
long-query-time = 10
查询日志(general log
)也叫作通用日志,可以直接阅读,其中记录了所有对MySQL
数据库请求的信息以及对应执行的SQL
语句,不论这些请求是否得到了正确的执行。此日志功能默认为关闭状态,不建议开启。
# 同时设置查询日志general log和慢查询日志slow query log输出方式(可选FILE/TABLE/NONE/FILE,TABLE)
log-output = FILE
# 设置开启通用日志general-log
general-log = 1
# 设置通用日志存储路径及文件名
general-log-file = /usr/local/mysql/logs/general.log
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。