MySQL日志种类
种类 | 特点 | 用途 |
---|
二进制日志(binlog || binary log) | 重要! | 记录对数据库进行更改的所有操作(表结构变化、表数据修改) |
事务日志(redo log 或 undo log) | 重要! | 重做日志、回滚日志 |
错误日志(error log) | | 记录MySQL启动、停止、关闭股哦成 |
一般查询日志(general query log) | | 记录所有客户端的SQL语句,体量非常大,默认关闭,建议关闭 |
慢查询日志(slow query log) | 重要! | 解决SQL慢查询时用来找到慢查询的语句 |
中继日志(relay log) | | 复制过程中产生的日志,只要针对从库 |
DDL日志(metadata log) | | DDL执行的元数据操作 |
慢查询日志以及慢查询的优化
命令 | 解释 |
---|
show variables like "slow_query_log"; | 查看慢查询日志是否打开,on/off |
set global slow_query_log = ON; | 将慢查询日志打开 |
set global long_query_time = 1; | 设置被认为慢查询的时间限制 (秒) |
show global status like "Slow_queries"; | 查看慢查询的语句个数 |
二进制日志(binlog)
命令 | 解释 |
---|
show binary logs | 显示所有二进制列表 |
show binlog events in "JIAHONGRUI-bin.000026" limit 10; | 显示日志具体内容 |
show variables like 'binlog_format'; | 显示binlog的格式 |
binlog的格式模式
模式 | 特点、区别 | |
---|
Statement模式 | 每一条修改数据库数据的SQL都会被记录(insert、update、delete) | 日志文件小,对磁盘I/O压力小 |
Row模式 | 每一行的具体变化都会被记录在日志中 | 准确性比Statement高 |
Mixed模式 | 上面两种模式的混合,会默认采取其中一种,在特殊情况会使用另外一种 | |
binlog在主从复制中的做作用(同样的原理也可以用来做数据恢复)
步骤 |
---|
主库将数据库中的数据变化写入到binlog |
从库连接主库 |
从库创建一个I/O线程向主库请求更新binlog |
主库创建一个binlog dump线程来发送binlog,从库中的I/O线程负责接收 |
从库的I/O线程接收binlog写到relay log中 |
从库的SQL线程读取relay log同步数据本地(也就是在执行一边SQL) |
注意事项:
binlog只在事务提交的时候才会刷盘,注意参数内存的binlog_cache块,磁盘上的binlog文件,不可差分性,binlog_cache_size控制binlog_cache的大小,sync_binlog控制刷盘时机(0不要求听从系统安排,1每个事务都要刷盘,N每N个事务刷盘一次)
以下三种情况会导致binlog重新生成:binlog文件超过max_binlog_size的阈值,MySQL服务重启或停止,使用flush_logs命令
innoDB引擎下的redo_log(保证数据库的持久性和一致性)
redo_log的刷盘时机 |
---|
事务提交:将log_buffer里面的redo_log刷到磁盘 |
log_buffer空间不足:一般占到了log_buffer总内存的一半 |
事务日志缓冲区满(了解) |
CheckPoint:innoDB定期执行 |
后台线程刷新 |
正常的关闭服务器 |
redo_log丢失数据的情况 |
---|
redo_log写入log_buffer但是还没有写入page_cache,此时数据库崩溃,就会出现数据丢失 |
redo_log已经写入page_cache,但是还没有刷新到磁盘,此时操作系统崩溃,就可能会出现数据丢失 |
undo_log保证事务原子性
undo_log属于逻辑日志,记录SQL语句,比如事务执行Delete语句,undo_log会相应的记录一条insert语句
总结
总结 | 关键词 |
---|
binlog日志 | 数据恢复、主从复制、刷盘时机 |
redo_log | 数据一致性和持久性、刷盘时机、丢失数据的情况 |
undo_log | 原子性,反向记录 |