• Mysql日志管理


    日志简介

    错误日志

    1. 作用: 记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志。
    2. 默认位置: DATA_DIR/hostname.err
    3. 开启方式:(MySQL安装完后默认开启)
    4. #查询
    5. mysql> select @@log_error;
    6. +-------------+
    7. | @@log_error |
    8. +-------------+
    9. | ./mysql.log |
    10. +-------------+
    11. mysql> show variables like 'log_error';
    12. +---------------+-------------+
    13. | Variable_name | Value |
    14. +---------------+-------------+
    15. | log_error | ./mysql.log |
    16. +---------------+-------------+
    17. #修改
    18. vim /etc/my.cnf
    19. [mysqld]
    20. log_error=/data/mysql/data/mysql.log

    一般查询日志

    1. 作用: 记录mysql所有执行成功的SQL语句信息,可以做审计用,但是我们很少开启。
    2. 默认位置: DATA_DIR/hostname.log
    3. 开启方式:(MySQL安装完之后默认不开启)
    4. #查看
    5. mysql> show variables like '%general%';
    6. +------------------+---------------------------+
    7. | Variable_name | Value |
    8. +------------------+---------------------------+
    9. | general_log | OFF |
    10. | general_log_file | /data/mysql/data/db02.log |
    11. +------------------+---------------------------+
    12. #修改
    13. vim /etc/my.cnf
    14. [mysqld]
    15. general_log=1
    16. general_log_file=/data/mysql/data/db02.log

    二进制日志(binlog)

    binlog概述

    1. 作用:
    2. 记录已提交的DML事务语句,并拆分为多个事件(event)来进行记录
    3. 记录所有DDL、DCL等语句 ,实现数据恢复、主从复制
    4. 总之,二进制日志会记录所有对数据库发生修改的操作
    5. 二进制日志模式:
    6. STATEMENT:SBR,语句模式,记录操作语句本身,MySQL5.6的默认模式
    7. 优点:简单明了,容易被看懂,就是sql语句,记录时不需要太多的磁盘空间。
    8. 缺点:记录不够严谨。
    9. ROW:RBR,行模式,即数据行的变化过程,MySQL5.7的默认模式
    10. 优点:记录更加严谨。
    11. 缺点:有可能会需要更多的磁盘空间,不太容易被读懂。
    12. MIXED:MBR,以上两者的混合模式
    13. 企业推荐使用row模式

    binlog配置

    1. log_bin:binlog开关、设定存放位置文件的路径及文件名前缀
    2. server_id(5.6不需要添加此参数,5.7以上必须加)
    3. 生产要求:日志和数据分开存放
    1. # 创建binlog目录,并修改归属
    2. # mkdir -p /data/mysql/binlog
    3. # chown -R mysql.mysql /data/mysql/binlog
    4. # 修改MySQL配置文件
    5. # vim /etc/my.cnf
    6. [mysqld]
    7. server_id=6
    8. log_bin=/data/mysql/binlog/mysql-bin
    9. # 重启mysqld
    10. # systemctl restart mysqld
    11. # 系统下查看binlog
    12. # ls /data/mysql/binlog/mysql-bin.*
    13. total 8
    14. -rw-r----- 1 mysql mysql 154 Apr 7 22:52 mysql-bin.000001
    15. -rw-r----- 1 mysql mysql 36 Apr 7 22:52 mysql-bin.index
    16. # MySQL中查看
    17. # 查看binlog的参数
    18. mysql> show variables like '%log_bin%';
    19. +---------------------------------+------------------------------------+
    20. | Variable_name | Value |
    21. +---------------------------------+------------------------------------+
    22. | log_bin | ON |
    23. | log_bin_basename | /data/mysql/binlog/mysql-bin |
    24. | log_bin_index | /data/mysql/binlog/mysql-bin.index |
    25. | log_bin_trust_function_creators | OFF |
    26. | log_bin_use_v1_row_events | OFF |
    27. | sql_log_bin | ON |
    28. +---------------------------------+------------------------------------+
    29. # 查看binlog模式
    30. mysql> show variables like 'binlog_format';
    31. # 查看所有的binlog文件
    32. mysql> show binary logs;
    33. # 查看查看当前日志工作
    34. mysql> show master logs;
    35. # 查看正在工作的binlog
    36. mysql> show master status;
    37. # 查看指定binlog文件的事件
    38. mysql> show binlog events in 'mysql-bin.000001';
    39. +------------------+-----+----------------+-----------+-------------+------------
    40. ---------------------------+
    41. | Log_name | Pos | Event_type | Server_id | End_log_pos | Info
    42. |
    43. +------------------+-----+----------------+-----------+-------------+------------
    44. ---------------------------+
    45. | mysql-bin.000001 | 4 | Format_desc | 6 | 123 | Server
    46. ver: 5.7.32-log, Binlog ver: 4
    47. | mysql-bin.000001 | 123 | Previous_gtids | 6 | 154 |
    48. | mysql-bin.000001 | 154 | Anonymous_Gtid | 6 | 219 | SET
    49. @@SESSION.GTID_NEXT= 'ANONYMOUS'
    50. | mysql-bin.000001 | 219 | Query | 6 | 322 | create
    51. database binlong
    52. | mysql-bin.000001 | 322 | Anonymous_Gtid | 6 | 387 | SET
    53. @@SESSION.GTID_NEXT= 'ANONYMOUS'
    54. | mysql-bin.000001 | 387 | Query | 6 | 478 | drop
    55. database binlong
    56. | mysql-bin.000001 | 478 | Anonymous_Gtid | 6 | 543 | SET
    57. @@SESSION.GTID_NEXT= 'ANONYMOUS'
    58. | mysql-bin.000001 | 543 | Query | 6 | 643 | create
    59. database binlog
    60. bin_log头部标记:
    61. 5.6120个Position号
    62. 5.7123个Position号
    63. 注释:以上输出中每一行为一个事件
    64. Log_name:日志名
    65. Pos:事件开始的Position *****
    66. Event_type:事件类型
    67. Server_id:发生在哪台机器的事件 //主从时区分机器
    68. End_log_pos:事件结束的位置号 *****
    69. Info:事件内容

    binlog事件

    1. 二进制日志的最小记录单元
    2. 对于DDL,DCL,一个语句就是一个event
    3. 对于DML语句来讲:只记录已提交的事务。
    4. event的组成
    5. 事件的开始标识(start position)
    6. at
    7. 事件内容
    8. 事件的结束标识(stop position)
    9. end_log_pos
    10. 例如以下例子,就被分为了4个event
    11. position号码(字节偏移量)
    12. begin; 120 - 340
    13. DML1 340 - 460
    14. DML2 460 - 550
    15. commit; 550 - 760
    16. 作用:方便对日志进行截取,指定部分日志进行数据恢复

    binlog内容分析及数据恢复

    1. 案例练习1
    2. 环境
    3. create database test;
    4. use test
    5. create table t1(id int);
    6. insert into t1 values(1);
    7. insert into t1 values(2),(3),(4);
    8. 模拟误操作,删除2
    9. delete from t1 where id=2;
    10. 要求:将上述误操作恢复
    11. 1.观察事务日志,找到误操作之前的节点
    12. 需要解码,通过误操作前的commit来寻找end_log_position
    13. mysqlbinlog --base64-output=decode-rows -v /data/mysql/binlog/mysql-bin.000001
    14. # at 1220
    15. #240228 14:49:02 server id 6 end_log_pos 1251 CRC32 0xa44eb22a Xid = 32
    16. COMMIT/*!*/;
    17. # at 1251
    18. #240228 14:50:01 server id 6 end_log_pos 1316 CRC32 0x7bc48a6e Anonymous_GTID last_committed=4 sequence_number=5 rbr_only=yes
    19. /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    20. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    21. # at 1316
    22. #240228 14:49:44 server id 6 end_log_pos 1388 CRC32 0x71c50f4b Query thread_id=2 exec_time=0 error_code=0
    23. SET TIMESTAMP=1709102984/*!*/;
    24. BEGIN
    25. /*!*/;
    26. # at 1388
    27. #240228 14:49:44 server id 6 end_log_pos 1433 CRC32 0x2b1a91b1 Table_map: `test`.`t1` mapped to number 108
    28. # at 1433
    29. #240228 14:49:44 server id 6 end_log_pos 1473 CRC32 0x587544fc Delete_rows: table id 108 flags: STMT_END_F
    30. ### DELETE FROM `test`.`t1`
    31. ...
    32. 2.导出该节点之前binlog信息
    33. mysqlbinlog --start-position=219 --stop-position=1251 /data/mysql/binlog/mysql-bin.000003 > /tmp/binlog.sql
    34. 3.导入到数据库中
    35. 在mysql的交互环境中导入上述步骤的sql文件的内容
    36. #1.临时关闭binlog
    37. set sql_log_bin=0;
    38. #2.source导入
    39. drop table test.t1;
    40. source /tmp/binlog.sql
    41. #3.查询数据是否恢复
    42. select * from test.t1;
    43. #4.开启binlog
    44. set sql_log_bin=1;
    45. 也可以关闭会话,重新登录
    46. 案例练习2
    47. 环境
    48. create table t2(id int);
    49. insert into t2 values(5),(6),(7);
    50. # 误操作1
    51. update t1 set id=33 where id=3;
    52. insert into t2 values(8),(9);
    53. # 误操作2
    54. delete from t1 where id=1;
    55. create table t3(id int);
    56. insert into t3 values(111),(222);
    57. 1.观察事务日志,找到误操作之前的节点
    58. 需要解码,通过误操作前的commit来寻找end_log_position
    59. mysqlbinlog --base64-output=decode-rows -v /data/mysql/binlog/mysql-bin.000001
    60. # at 1220
    61. #240228 14:49:02 server id 6 end_log_pos 1251 CRC32 0xa44eb22a Xid = 32
    62. COMMIT/*!*/;
    63. # at 1251
    64. #240228 14:50:01 server id 6 end_log_pos 1316 CRC32 0x7bc48a6e Anonymous_GTID last_committed=4 sequence_number=5 rbr_only=yes
    65. /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    66. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    67. # at 1316
    68. #240228 14:49:44 server id 6 end_log_pos 1388 CRC32 0x71c50f4b Query thread_id=2 exec_time=0 error_code=0
    69. SET TIMESTAMP=1709102984/*!*/;
    70. BEGIN
    71. /*!*/;
    72. # at 1388
    73. #240228 14:49:44 server id 6 end_log_pos 1433 CRC32 0x2b1a91b1 Table_map: `test`.`t1` mapped to number 108
    74. # at 1433
    75. #240228 14:49:44 server id 6 end_log_pos 1473 CRC32 0x587544fc Delete_rows: table id 108 flags: STMT_END_F
    76. ### DELETE FROM `test`.`t1`
    77. ...
    78. 根据上述细节分析,我们的有效数据有三段
    79. test库,t1表起始:672
    80. test库,t1表结束:1509
    81. t2表起始:1762
    82. t2表结束:2187
    83. t3表起始:2957
    84. t3表结束:3312
    85. 2.导出该节点之前binlog信息
    86. 在shell中使用mysqlbinlog工具导出上述结果
    87. mysqlbinlog --start-position=672 --stop-position=1509 /data/mysql/binlog/mysql-bin.000001 > /tmp/binlog1.sql
    88. mysqlbinlog --start-position=1762 --stop-position=2187 /data/mysql/binlog/mysql-bin.000001 > /tmp/binlog2.sql
    89. mysqlbinlog --start-position=2957 --stop-position=3312 /data/mysql/binlog/mysql-bin.000001 > /tmp/binlog3.sql
    90. 3.导入到数据库中
    91. 在mysql的交互环境中导入上述步骤的sql文件的内容
    92. #1.临时关闭binlog
    93. set sql_log_bin=0;
    94. #2.source导入
    95. drop database test;
    96. source /tmp/binlog1.sql
    97. source /tmp/binlog2.sql
    98. source /tmp/binlog3.sql
    99. #3.查询数据是否恢复
    100. select * from test.t1;
    101. select * from test.t2;
    102. select * from test.t3;
    103. #4.开启binlog
    104. set sql_log_bin=1;
    105. 也可以关闭会话,重新登录

    binlog日志阈值管理

    1. 1.刷新binlog
    2. mysql> flush logs;
    3. mysqladmin -uroot -p flush-logs;
    4. 重启数据库时
    5. 设置binlog上限(max_binlog_size 默认是1G大小)。
    6. 2.删除binlog
    7. 1.手动删除
    8. 1)使用PURGE手动删除,不会重置binlog编号
    9. mysql> PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day; //删除从现在开始三天之前的二
    10. 进制日志
    11. mysql> PURGE BINARY LOGS TO 'mysql-bin.000003'; //删除到哪里为止
    12. 2)使用reset master;删除所有binlog,并重新计数(从000001开始)
    13. mysql> reset master;
    14. 2.自动删除
    15. 设置超时时间
    16. 临时生效的
    17. SET GLOBAL expire_logs_days= 7;
    18. 永久生效:
    19. vim /etc/my.cnf
    20. expire_logs_days=7
    21. 自动删除设置依据:至少是一个全备周期+1,企业建议至少2个全备周期+1

    慢查询日志

    慢日志作用

    记录慢SQL语句的日志,定位低效SQL语句的工具日志默认没开启

    慢日志配置

    1. vim /data/3307/my.cnf
    2. slow_query_log=1 #指定是否开启慢查询日志
    3. slow_query_log_file=/data/mysql/slow.log #指定慢日志文件存放位置,可以为空,系统会给一个
    4. 缺省的文件host_name-slow.log
    5. long_query_time=0.05 #设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s
    6. log_queries_not_using_indexes=1 #不使用索引的慢查询日志是否记录到日志中
    7. min_examined_row_limit=100 #查询检查返回少于该参数指定行的SQL不被记录到慢查询日志,鸡肋
    8. 进入数据库:查看参数是否生效
    9. mysql> show variables like 'long_query_time';

    模拟慢日志环境

    1. use world
    2. create table t1 select * from city;
    3. insert into t1 select * from t1;
    4. insert into t1 select * from t1;
    5. commit;
    6. insert into t1 select * from t1;
    7. insert into t1 select * from t1;
    8. commit;
    9. insert into t1 select * from t1;
    10. insert into t1 select * from t1;
    11. commit;
    12. select count(*) from t1;
    13. select * from t1 group by id;

    分析慢日志

    1. 1.mysqldumpslow命令
    2. mysqldumpslow -s c -t 10 /data/mysql/slow.log
    3. 这会输出记录次数最多的10SQL语句,其中:
    4. -s
    5. 是表示按照何种方式排序,c、t、l、r
    6. 分别是按照记录次数、时间、查询时间、返回的记录数来排序
    7. ac、at、al、ar,表示相应的倒叙
    8. -t
    9. 是top n的意思,即为返回前面多少条的数据;
    10. -g,
    11. 后边可以写一个正则匹配模式,大小写不敏感的;
    12. 例子:
    13. /path/mysqldumpslow-s r -t 10 /database/mysql/slow-log
    14. 得到返回记录集最多的10个查询。
    15. /path/mysqldumpslow-s t -t 10 -g “left join/database/mysql/slow-log
    16. 得到按照时间排序的前10条里面含有左连接的查询语句。
    17. 2.pt-query-digest
    18. pt-query-digest基本使用:
    19. 下载二进制包地址
    20. https://www.percona.com/downloads/percona-toolkit/LATEST/
    21. 安装软件包支持:(不同的版,依赖包不一样)
    22. yum install -y *Dumper* *MD5*
    23. /xxx/bin/pt-query-digest /data/mysql/slow.log
    24. 扩展:Anemometer基于pt-query-digest将MySQL慢查询可视化
    25. httpss://github.com/box/Anemometer 可视化代码下载

          

  • 相关阅读:
    124. 二叉树中的最大路径和
    Git 使用
    torch.distributed.launch 指定端口rdzv_endpoint
    为什么数组它的顺序读写会比较方便?
    Web服务(03)——HTTP协议
    MFC Windows 程序设计[239]之托盘通知展示(附源码)
    云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)
    vscode 安装leetcode 插件
    关于SQL Server数据库中的用户权限和角色管理
    宝,运维100+服务器很头疼怎么办?用行云管家!
  • 原文地址:https://blog.csdn.net/weixin_64252848/article/details/136404862