日志文件
MySQL
数据库中常见的日志文件有:
- 错误日志(
error log
) - 慢查询日志(
slow query log
) - 查询日志(
log
) - 二进制日志(
binlog
)
错误日志
SHOW VARIABLES LIKE "log_error";
当MySQL
数据库不能启动时,可以查看该日志文件。
慢查询日志
MySQL
启动时可以设置一个阀值,将运行时间大于该阀值的SQL
语句都记录
到慢查询日志中。该阀值可以通过long_query_time
来设置,默认值为10,即10秒。
MySQL 5.1
开始long_query_time
以微妙记录SQL语句运行的时间,之前是秒。
默认情况下MySQL
不开启慢查询日志,需要手动将log_slow_queries
设置为ON
。
记录未使用索引的查询
log_queries_not_using_indexes
,如果运行的SQL
语句没有使用索引,则MySQL
同样会将这条SQL
记录到慢查询日志文件。
MySQL 5.6.5
版本开始新增一个参数log_throttle_queries_not_using_indexes
,
用来表示每分钟允许记录到慢查询日志的未使用索引的SQL
语句的次数,默认是0,
表示无限制。可以控制此类SQL
写入慢查询日志的频率。
查看慢查询日志
MySQL
数据库提供了 mysqldumpslow
命令帮助查看慢查询日志。
-- 查看执行时间最长的10条 SQL
mysqldumpslow -s al -n 10 david.log
慢查询日志的格式
参数log_output
指定了慢查询日志输出的格式,默认是FILE
,可以设置为`TABLE,
之后的慢查询日志就输入到mysql.slow_log
表中。
log_output
参数是动态的,并且是全局的。如果改为输入到表中,还可以改表的存储引擎,为表加索引等。
额外的参数
InnoDB
版本加强了对SQL
语句的捕获方式,在原版MySQL
的基础上在slow_log
中增加对于逻辑读取和物理读取的统计。物理读取即从磁盘进行IO
读取的次数,
逻辑读取包括所有读取,不管是磁盘还是缓冲池。
用户可以通过额外的参数long_query_io
将超过指定逻辑IO
次数的SQL
记录到
slow_log
中,默认值的100。
还添加了参数slow_query_type
,用来表示启动slow log
的方式
- 0 表示不将
SQL
语句记录到slow log
- 1 表示根据运行时间将
SQL
语句记录到slow log
- 2 表示根据逻辑
IO
次数将SQL
语句记录到slow log
- 3 表示根据运行时间及逻辑
IO
次数将SQL
语句记录到slow log
查询日志
查询日志记录了所有对MySQL
数据库请求的信息,无论这些请求是否得到了正确的执行。
默认文件名为:主机名.log。
从MySQL 5.1
开始,可以将查询日志的记录放入mysql
架构下的general_log
表中,
与slow_log
表一样。
二进制日志
二进制日志(binary log
)记录了对MySQL
数据库执行更改的所有操作,但是不包括
SELECT
和SHOW
这类操作,因为这类操作并不修改数据。但操作本身没有产生对数据
的修改也可能会写入二进制日志,如
-- 不存储 a = 2 的数据
UPDATE t SET a = 1 WHERE a = 2
二进制日志的作用
恢复(
recovery
):point-in-time
恢复复制(
replication
):搭建主从审计(
audit
):用户可以通过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
咋操作?
二进制日志的设置
二进制日志文件在默认情况下没有启动,需要手动指定参数启动。
开启对数据库整体性能按照官方手册表明会下降1%。
一些影响二进制文件的配置
配置 | 作用 |
---|---|
max_binlog_size | 指定单个二进制日志文件的最大值,如果超过该值,则产生新的二进制文件 默认是1G |
binlog_cache_size | 当使用事务的表存储引擎时,所有未提交的二进制日志会被记录到一个缓存中, 等该事务提交时直接将缓冲中的二进制日志写入二进制日志文件,而该文件的 大小由 binlog_cache_size 决定,默认是32K。binlog_cache_size 是基于会话的,即一个线程开启一个事务时,会自动分配这么一块内存。 可以通过 SHOW GLOBAL STATUS 查看binlog_cache_use 、binlog_cache_disk_use 的状态,判断当前 binlog_cache_size 大小是否合适。 |
sync_binlog | 默认情况下,二进制日志不是在每次写的时候同步到磁盘。 参数 sync_binlog=[N] 表示每写缓冲多少次就同步到磁盘。 |
binlog-do-db binlog-ignore-db |
表示写入或者忽略哪些库的日志,默认为空,表示需要同步所有库的日志到 二进制日志。 |
log-slave-update | 如果当前数据库是slave 角色,则不会将从master 取得并执行的二进制日志写入自己的二进制日志文件中去。如果需要写入,则设置log-slave- update 。如果需要搭建 master->slave->slave 架构的复制,则必须设置该参数。 |
binlog_format | 影响了记录二进制日志的格式,是动态参数STATEMENT :记录的是日志的的逻辑SQL 语句,节省空间ROW :记录表的行更改情况,不会有数据问题MIXED :默认会使用STATEMENT ,某些情况下会用ROW |
binlog_format
设置为MIXED
格式下,写入ROW
格式的情况
- 表的存储引擎是
NDB
- 使用了
UUID()
、USER()
、CURRENT_USER()
、FOUND_ROWS()
、ROW_COUNT()
等不确定函数- 使用了
INSERT DELAY
语句- 使用了用户定义函数(
UDF
)- 使用了临时表(
temporary table
)
二进制日志的查看
因为格式为二进制,因此无法直接用cat
、head
、tail
等直接查看。
需要通过MySQL
提供的工具mysqlbinlog
。
STATEMENT
格式的二进制日志文件才有可读性,ROW
的看不出啥。