暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL日志,你知多少?


1. MySQL 日志文件

一、日志文件

MySQL 使用多种日志文件来记录服务器的运行活动,常见的日志包括:

错误日志 (error log)

记录mysqld启动、运行和停止过程中遇到的问题

常规日志 (general query log)

记录客户端连接以及服务器从客户端收到的各类SQL语句

慢查询日志 (slow query log)

记录运行时间超过选项long_query_time设定阈值的查询语句

二进制日志 (binary log)

记录使数据库数据产生变化的各类语句

日志文件的特点:

有可能会占用大量磁盘空间

通常存储在文件中

可以选择存储在mysql的表中,便于查询和分析

仅限于常规查询和慢查询日志

除了二进制日志,通常以文本格式记录数据

二、MySQL 错误日志

默认开启

日志位置

mysql> show variables like ‘log_error’;


三、MySQL 常规日志

默认关闭

日志位置

mysql> show variables like ‘general_log%’;

默认名称:hostname.log

开启常规日志

mysql> set global general_log=on; (可同时修改/etc/my.cnf以保存服务重启后状态)

测试

mysql> select count(*) from mysql.user;

root# cat var/lib/mysql/hostname.log

mysql> set global general_log=off; 关闭




四、MySQL 慢查询日志

默认关闭

日志位置

mysql> show variables like ‘slow_query_log%’;

mysql> show variables like ‘long_query_time%’;

默认名称:hostname-slow.log

long_query_time默认时长10秒,执行超过10秒的查询语句会记录到慢查询日志中

慢查询日志

mysql> set global slow_query_log=on;(可同时修改/etc/my.cnf以保存服务重启后状态)

测试

mysql> select count(*) from mysql.user;

root# cat var/lib/mysql/hostname-slow.log

mysql> set global slow_query_log=off; 关闭




2. 二进制日志BINLOG

一、简介

内容

BINLOG记录数据库的变更过程。例如创建数据库、建表、修改表等DDL操作、以及数据表的相关DML操作,这些操作会导致数据库产生变化,开启binlog以后导致数据库产生变化的操作会按照时间顺序以“事件”的形式记录到binlog二进制文件中,默认关闭

用途

用户对主数据库SQL语句操作中的DML、DDL、DCL、TCL等语句会对数据库的状态产生变化操作,变化以事件的形式按照时间顺序记录到主数据库的BINLOG二进制日志中

在建立从属数据库时,为了复制主库的数据使从库和主库一模一样,主库需要开启BINLOG日志,然后配置从属数据库,将主库产生的BINLOG日志定期通过网络传递到从数据库

从数据库库接受到主库传递过来的BINLOG后,按照日志中记录的变更事件重新应用日志

利用BINLOG日志最终起到从库和主库数据保持一致的状态,即复制了和主数据库一模一样的从数据库

数据库复制



数据库恢复


三、MySQL 开启BINLOG

MySQL默认没有开启BINLOG

查看BINLOG是否开启

mysql> show variables like ‘%log_bin%’;


如果log_bin的值为OFF说明没有开启binlog

开启BINLOG

root# vi etc/my.cnf

在[mysqld]下面添加下面2行内容

server-id=1     #mysql5.7以上需要添加

log-bin=mysql-bin


root# systemctl restart mysqld

mysql> show variables like ‘%log_bin%’;


如果log_bin的值为ON说明binlog已开启

root# ls -l var/lib/mysql/mysql-bin*


四、MySQL BINLOG记录格式

binlog记录格式分为:

语句级(statement)

行级 (row)   (5.5, 5.6, 5.7版本默认)

混合级 (mixed)

mysql> show variables like ‘%binlog_format%’;


基于语句(STATEMENT)的二进制日志记录:

包含实际 SQL 语句

包括 DDL(CREATE、 DROP 等)和 DML(UPDATE、 DELETE 等)语句

日志占用相对较小的磁盘空间和网络带宽

并非所有主库的的语句都能在远程从库上正确应用,例如一些包括now(),sleep(),uuid()等函数的语句在从库上无法做到和主库一致,数据和主库产生偏差

要求主库和从库上复制的表和列完全相同

基于行(ROW)的二进制日志记录:

日志占用相对较大的磁盘空间和网络带宽

所有主库的的语句都能在远程从库上正确应用 (复制数据库时最安全)

要求从库上MySQL版本和行结构与主库必须完全相同

DDL、DML、DCL、TCL等语句对应的事件部分采用二进制格式

从日志中查找特定语句对应的事件难度相对较高

混合级(mixed)的二进制日志记录:

由 MySQL 选取最适合单个事件的格式,基于语句还是基于行来记录事件

MySQL 通常会使用基于语句的二进制日志,但在需要时可恢复到基于行的复制

五、列出BINLOG文件

列出所有binlog日志

mysql> show binary logs;


列出当前binlog日志

mysql> show master status;


六、BINLOG日志切换

下列3种情况会导致BINLOG日志切换:

MySQL启动或重启



日志量到达了max_binlog_size的设定值


执行flush logs;命令手动切换日志

mysql> flush logs;


七、查看BINLOG内容

binlog以紧凑的二进制方式存储

日志中包含数据和表结构更改事件及其时间戳

无法使用普通的文本查看软件查看其内容

MySQL提供mysqlbinlog 工具

可将二进制数据转成SQL文本格式

在标准输出中查看binlog内容

root# mysqlbinlog var/lib/mysql/mysql-bin.000001


结合more命令查看binlog内容

root# mysqlbinlog var/lib/mysql/mysql-bin.000001 | more

将binlog内容的SQL语句重定向到文件

root# mysqlbinlog var/lib/mysql/mysql-bin.000003 > /root/3.sql

mysqlbinlog 输出中,事件前面会提供相关信息的头注释:

cat /root/3.sql


查看binlog中部分内容,自定义起始和结束头标注

mysqlbinlog --start-position=219 --stop-position=546  /var/lib/mysql/mysql-bin.000005


八、查看BINLOG中的事件

查看第一个binlog日志中的事件

mysql> show binlog events;

查看指定binlog日志中的事件

mysql> show binlog events in ‘mysql-bin.000005’;


查看指定binlog日志中的事件,指定事件起始头注释

mysql> show binlog events in ‘mysql-bin.000005’ from 219;



文中的概念来源于网络,如有侵权,请联系我删除。


欢迎关注公众号:小周的数据库进阶之路,一起交流数据库、中间件和云计算等技术。欢迎觉得读完本文有收获,可以转发给其他朋友,大家一起学习进步!感兴趣的朋友可以加我微信,拉您进群与业界的大佬们一起交流学习。


文章转载自小周的数据库进阶之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论