数据库服务日志概述
任何一种数据库中,都会有各种各样的日志,记录这数据库工作的方方面面,以帮助数据库管理员追踪数据库曾经发生过的各种事件;
主要是针对数据库server层产生的数据信息,主要用于记录和数据库服务运行本身有关的日志、以及SQL语句操作执行相关的日志;
数据库日志常用分类
1 2 mysql > show variables like '%log%' ;
常用日志信息
日志名称
说明
general_log
表示查询日志(通用日志),默认日志状态处于关闭,可以进行在线调整配置 作用:记录了客户端从会话连接开始,执行过的所有SQL语句信息; 常用于 功能测试、语句审计
log_error
表示错误日志(运行日志),默认日志状态处于激活 作用:记录了数据库服务启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息;
log_bin
表示二进制日志(binlog日志),默认日志状态处于激活(8.0之后) 作用:记录了所有的DDL语句和DML语句,但是不包括数据库查询语句;语句以事件的形式保存,描述了数据的更改过程,此日志对于灾难时的数据恢复起着极其重要的作用。
slow_query_log
表示慢查询日志,记录了所有执行时间超过参数long_query_time设置值并且扫描记录数小于min_examined_row_limit的所有SQL语句的日志。
通用日志general_log
1 2 3 4 5 6 7 8 9 10 11 12 13 general_log=OFF general_log_file=/app/mysql/data/general.log [root@db01 ~]# vim /etc/my.cnf general_log=OFF general_log_file=/app/mysql/data/general.log mysql > set global general_log=1;
注意:企业真实环境,由于日志记录量比较大,所以不建议打开此日志记录功能,可以在有需要时打开,支持在线配置调整;
错误日志log_error
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 mysql >show variables like '%err%' ; +---------------------+--------------+ | Variable_name | Value | +---------------------+--------------+ | log_error | ./db01.err | /app/mysql/data +---------------------+--------------+ 1.编辑配置文件 [root@xiaoq ~]# vim /etc/my.cnf log_error=/data/db01.err 2.创建错误日志文件 touch /data/db01.err3.授权文件 chown mysql.mysql /data/db01.err4.重启数据库 systemctl restart msyqld [root@oldboyxiaoq ~]# ll /data/3306/data/ibdata1 -rw-r----- 1 mysql mysql 12582912 Nov 16 17:46 /data/3306/data/ibdata1 [root@oldboyxiaoq ~]# chmod 000 /data/3306/data/ibdata1 [root@oldboyxiaoq ~]# /etc/init.d/mysqld restart Shutting down MySQL............................... SUCCESS! Starting MySQL......................................... ERROR! The server quit without updating PID file (/data/3306/data/oldboyxiaoq.com.pid). [root@oldboyxiaoq ~]# tail -20 /data/3306/data/oldboyxiaoq.com.err 2022-11-21T01:20:47.735040Z 1 [ERROR] [MY-012271] [InnoDB] The innodb_system data file 'ibdata1' must be writable 2022-11-21T01:20:47.744091Z 1 [ERROR] [MY-012278] [InnoDB] The innodb_system data file 'ibdata1' must be writable 2022-11-21T01:20:47.744808Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine 2022-11-21T01:20:47.745739Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2022-11-21T01:20:47.746526Z 0 [ERROR] [MY-010119] [Server] Aborting -- 根据错误日志的错误提示信息,进行错误信息进行分析,从而排查故障可能出现的原因;
说明:企业真实环境,日志处于默认激活记录状态,可以使用错误日志信息做故障诊断,记录错误信息级别为note warning error;
二进制日志(log_bin)
binlog日志,此日志文件其实就是用于记录对数据库进行操作更改的语句信息的;
并且记录更改的语句信息以事件形式进行记录,但是需要注意的是查询相关的语句是不会被记录的,比如:select、show;
然而作为所有对数据库的改操作事件信息都会被记录,比如:insert、update、create、drop。。。
查看数据库binlog日志配置参数:
进入到数据库服务系统环境中,可以使用命令进行查看binlog日志功能是否开启;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 root@(none) > show variables like '%log_bin%' ; +---------------------------------+---------------------------------+ | Variable_name | Value | +---------------------------------+---------------------------------+ | log_bin | ON | | log_bin_basename | /app/mysql/data/mysql-bin | | log_bin_index | /app/mysql/data/mysql-bin.index | | log_bin_trust_function_creators | OFF | | log_bin_use_v1_row_events | OFF | | sql_log_bin | ON | +---------------------------------+---------------------------------+ mysql> flush logs; 刷新后日志记录会生成新的
==查看二进制文件 ==
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 root@(none) > show master status ; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000004 | 1252 | | | | +------------------+----------+--------------+------------------+-------------------+ root@(none) > show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 120 | | mysql-bin.000002 | 329 | | mysql-bin.000003 | 317 | | mysql-bin.000004 | 1252 | +------------------+-----------+
01日志信息基本配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@db01 ~]# vim /etc/my.cnf log-bin=mysql-bin binlog_format=row [root@db01 ~]# vim /etc/my.cnf server_id=1 log-bin=mysql-bin binlog_format=row 或者 log_bin=binlog [root@xiaoQ ~]# /etc/init.d/mysqld restart [root@xiaoQ xiaoQ]# ll -h /data/3306/data/binlog* -rw-rw----. 1 mysql mysql 245 6月 24 02:19 /data/3306/data/binlog.00000N -rw-rw----. 1 mysql mysql 16 6月 24 02:19 /data/3306/data/binlog.index -- 数据库服务重启后,已经可以在数据库的数据存储目录中,看到binlog日志文件的踪影
1 企业真实环境,日志处于默认激活记录状态,可以使用日志信息进行灾难数据恢复,以及可以用于实现主从复制;
02二进制日志工作模式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 mysql> show variables like '%binlog_format%' ; +---------------+-----------+ | Variable_name | Value | +---------------+-----------+ | binlog_format | STATEMENT | +---------------+-----------+ 1 row in set (0.00 sec) vim /etc/my.cnf [msyqld] binlog_format=row systemctl restart mysqld
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 优点:简单易读,占用磁盘空间小 缺点:不严谨 [root@db01 data]# mysqlbinlog mysql-bin.000006 BEGIN /*!*/; SET TIMESTAMP=1724141065/*!*/; insert prod values(1001),(1200) /*!*/; COMMIT/*!*/; DELIMITER ;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 优点:严谨,记录原数据和数据的变化过程 缺点:占用磁盘空间大,不易读 mysql> show variables like '%binlog_format%' ; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+ 1 row in set (0.00 sec) [root@db01 data]# mysqlbinlog --base64-output=decode-rows mysql-bin.000006 BEGIN /*!*/; COMMIT/*!*/; DELIMITER ; [root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv mysql-bin.000006 BEGIN /*!*/; COMMIT/*!*/; DELIMITER ;
03 二进制日志操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 mysql> show binary logs; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 143 | | mysql-bin.000002 | 143 | | mysql-bin.000003 | 167 | | mysql-bin.000004 | 785 | | mysql-bin.000005 | 167 | | mysql-bin.000006 | 505 | +------------------+-----------+ 6 rows in set (0.00 sec) root@(none) > show binlog events in 'mysql-bin.000008' ; +------------------+-----+-------------+-----------+-------------+---------------------------------------+ | Log_name | Pos | Event_type | Server_id | End_log_pos | Info | +------------------+-----+-------------+-----------+-------------+---------------------------------------+ | mysql-bin.000008 | 4 | Format_desc | 1 | 120 | Server ver: 5.6.50-log , Binlog ver: 4 | | mysql-bin.000008 | 120 | Query | 1 | 211 | create database lzz | | mysql-bin.000008 | 211 | Query | 1 | 294 | drop database lzz | | mysql-bin.000008 | 294 | Query | 1 | 386 | drop database luay | +------------------+-----+-------------+-----------+-------------+---------------------------------------+ root@(none) > show master status; +------------------+----------+--------------+ | File | Position | Binlog_Do_DB | +------------------+----------+--------------+ | mysql-bin.000008 | 386 | | +------------------+----------+--------------+
==事件 ==
1)在binlog中最小的记录单元为event
2)一个事务会被拆分成多个事件(event)
==事件特性 binlog特性==
1 2 3 4 5 6 1)每个event都有一个开始位置(start position)和结束位置(stop position) 2)所谓的位置就是event对整个二进制的文件的相对位置(文件大小) 3)对于一个二进制日志中,前120个position是文件格式信息预留空间(MySQL5.6) 3)对于一个二进制日志中,前154个position是文件格式信息预留空间(MySQL5.7) 4)MySQL第一个记录的事件,都是从120开始的(MySQL5.6) 4)MySQL第一个记录的事件,都是从154开始的(MySQL5.7)
04 binlog的刷新和删除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1.重启MySQL数据库 2.flush logs; 3.mysqladmin -uroot -p123 flush-log 4.当binlog大小1G会自动刷新 1G自动切割日志 1.根据时间删除 SET GLOBAL expire_logs_days = 7; [root@db01 data]# vim /etc/my.cnf [mysqld] expire_logs_days = 7 2.根据时间删除 PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day; 3.根据文件名删除(常用) ---仅保留mysql-bin.000020之后的binlog PURGE BINARY LOGS TO 'mysql-bin.000020' ; 4.删除所有binlog,从001生成 ❌🔞🈲危险!!!! reset master;
:dango:
05 日志配置信息扩展
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 root@(none) > select @@sync_binlog; +---------------+ | @@sync_binlog | +---------------+ | 1 | +---------------+ 1 row in set (0.00 sec) -- 在进行主从同步过程的双一标准的其中一个1的信息配置,主要是控制缓冲区里的binlog日志信息如何刷写到磁盘中; -- 此参数信息是有三种方式进行配置的: -- 参数信息配置0:表示由操作系统缓存自己决定,什么时候刷新日志到磁盘中; -- 参数信息配置1:表示每次事务提交,立即刷新日志到磁盘中;(此方式配置更安全) -- 参数信息配置N:表示每组事务提交,按照组的事务次数定义,确定刷新日志到磁盘中的频次;(可以有效减少IO性能损耗) -- 参数官方资料链接:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html root@(none) > select @@binlog_format; +-----------------+ | @@binlog_format | +-----------------+ | STATEMENT | +-----------------+ 1 row in set (0.00 sec) -- 在进行主从同步数据恢复时,此参数配置可能会影响数据恢复的一致性问题; -- 此参数信息是有三种方式进行配置的,确定了主从复制的级别,只针对DML语句的日志才有效; -- 参数信息配置 statement(SBR):语句格式记录binlog; -- DDL DCL语句只能使用statement 表示的就是原原本本的语句信息,即做什么就记录什么; create database xiaoQ; -- 参数信息配置 row(RBR):行格式记录binlog(默认模式) update t1 set a=10 where id <10; -- 会记录行的变化信息,属于底层的记录信息,可能会有多个变化日志信息记录 -- 参数信息配置 mixed(MBR):混合格式记录binlog -- 由数据库服务自行决定,是记录语句信息,还是记录行的变化信息;
慢查询日志
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 root@(none) > show variables like '%slow%' ; +---------------------------+--------------------------------------+ | Variable_name | Value | +---------------------------+--------------------------------------+ | log_slow_admin_statements | OFF | | log_slow_slave_statements | OFF | | slow_launch_time | 2 | | slow_query_log | OFF | | slow_query_log_file | /app/mysql-5.6.50/data/db01-slow.log | +---------------------------+--------------------------------------+ 5 rows in set (0.00 sec) db01-slow.log [root@db01 ~]# vim /etc/my.cnf [mysqld] slow_query_log=1 slow_query_log_file=/app/mysql/data/db01-slow.log long_query_time=0.05 log_queries_not_using_indexes min_examined_row_limit=100 mysql >create table world.city1 select * from world.city; mysql >insert into zls_city select * from zls_city; [root@db01 ~]# mysqldumpslow -s:指定排序顺序 c:Count 执行次数 t:Time 执行时间 总时间 r:Rows 结果行数 总行数 l:Lock 锁表时间 总锁表时间 at:平均时间 ar:平均行数 al:平均锁表时间 [root@db01 ~]# yum install -y https://downloads.percona.com/downloads/percona-toolkit/3.6.0/binary/redhat/7/x86_64/percona-toolkit-3.6.0-1.el7.x86_64.rpm yum install -y percona-toolkit-3.0.11-1.el6.x86_64.rpm [root@mysql-db01 ~]# pt-query-digest /application/mysql/data/mysql-db01-slow.log 成可视化界面: Anemometer基于pt-query-digest将MySQL慢查询可视化 https://www.percona.com/downloads/percona-toolkit/LATEST/ 慢日志分析工具下载 https://github.com/box/Anemometer 可视化代码下载
:dango:percona慢查询可视化
1 2 3 4 5 yum install -y https://downloads.percona.com/downloads/percona-toolkit/3.6.0/binary/redhat/7/x86_64/percona-toolkit-3.6.0-1.el7.x86_64.rpm $ git clone git://github.com/box/Anemometer.git anemometer
配合binlog恢复数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 模拟数据: create database binlog; use binlog create table binlog_table(id int); insert into binlog_table values(1); +------+ | id | +------+ | 1 | +------+ insert into binlog_table values(2); insert into binlog_table values(3); commit; select * from binlog_table;+------+ | id | +------+ | 1 | | 2 | | 3 | +------+ delete from binlog_table where id =1; commit; root@localhost:binlog:18: >select * from binlog_table; +------+ | id | +------+ | 2 | | 3 | +------+ update binlog_table set id =22 where id =2; commit; root@localhost:binlog:19: >select * from binlog_table; +------+ | id | +------+ | 22 | | 3 | +------+ drop table binlog_table; drop database binlog; 想要恢复数点: begin:30776 end:42009 mysqlbinlog --start-position=30776 --stop-position=42009 -d binlog /app/mysql/data/mysql-bin.000008 > /tmp/binlog.sql
使用binlog截取数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ [root@db02 ~]# /etc/init.d/mysqld stop [root@db02 ~]# vim /etc/my.cnf 保持和旧环境一致 [root@db02 ~]# rm -fr /app/mysql-5.6.50/data [root@db02 ~]# /app/mysql-5.6.50/scripts/mysql_install_db --user=mysql --basedir=/app/mysql --datadir=/app/mysql/data [root@db02 ~]# /etc/init.d/mysqld start [root@db01 data]# mysqldump -uroot -p123 -A > /tmp/full.sql mysql> grant all on *.* to root@'%' identified by '123' ; [root@db01 data]# mysql -uroot -p123 -h172.16.1.52 < /tmp/full.sql [root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /app/mysql/data/mysql-bin.000030 起始位置点:120 [root@db01 data]# mysqlbinlog --base64-output=decode-rows -vvv /app/mysql/data/mysql-bin.000030 |grep -iC 10 delete 结束位置点:832 [root@db01 data]# mysqlbinlog --start-position=120 --stop-position=832 /app/mysql/data/mysql-bin.000030 > /tmp/binlog.sql [root@db01 data]# mysql -uroot -p123 -h172.16.1.52 < /tmp/binlog.sql root@localhost:(none):42: >select * from binlog.binlog_table; +------+ | id | +------+ | 1 | | 2 | | 3 | +------+ - 开发改代码 - 运维导出新环境数据恢复到旧环境 每天全备+增备 mysqlbinlog --start-position=120 --stop-position=832 -d binlog app/mysql/data/mysql-bin.000030 > /tmp/binlog.sql