zoukankan      html  css  js  c++  java
  • Mysql日志管理

    toc

    • error log 错误日志
      • 记录mysql启停错误信息用于排错
    • general log 普通日志
      • 记录客户端查询日志用于开发
    • bin log 二进制日志
      • 增量备份 DDL DML DCL 用于备份
    • relay log 中继日志
      • 接收 replication master 常用于主从复制
    • slow log 慢查询日志
      • 查询时间超过指定值用于调优

    错误日志

    Mysql 的错误日志 error log 记录 mysqld 服务进程启动/关闭或运行过遇到的错误日志。

    错误日志默认开启(没有开启按照如下方式开启)

    ## 在配置文件 [mysqld] 标签内增加 log-error=/log/mysql/err.log
    [root@Mysql ~]# vim /etc/my.cnf
    [mysqld]
    ......
    log-error=/log/mysql/err.log
    ## 创建对应目录与日志文件
    [root@Mysql ~]# mkdir -p /log/mysql/
    [root@Mysql ~]# touch /log/mysql/err.log
    ## 更改日志文件属主和属组为 mysql
    [root@Mysql ~]# chown -R mysql.mysql /log/mysql/err.log
    ## 重启数据库生效
    [root@Mysql ~]# systemctl restart mysqld
    ## 查看错误日志
    [root@Mysql ~]# tailf /log/mysql/err.log
    ## 通过终端查看日志
    mysql> show variables like "log_error%";

    查询日志

    普通查询日志 general query log 记录客户端连接信息和执行的所有 SQL 语句信息, 默认关闭

    开启普通查询日志

    ## 在配置文件 [mysqld] 标签内增加如下两条
    [root@Mysql ~]# cat /etc/my.cnf
    [mysqld]
    ......
    general_log=ON
    general_log_file=/log/mysql/select.log
    ## 创建对应目录与日志文件
    [root@Mysql ~]# mkdir -p /log/mysql
    [root@Mysql ~]# touch /log/mysql/select.log
    ## 更改日志文件属主和属组为 mysql
    [root@Mysql ~]# chown mysql.mysql /log/mysql/select.log
    ## 重启数据库生效
    [root@Mysql ~]# systemctl restart mysqld
    ## 查看普通查询日志
    [root@Mysql ~]# cat /log/mysql/select.log
    ## 终端查询日志情况
    mysql> show variables like 'general_log%';

    临时开启和关闭查询日志

    ## 临时开启查询日志
    mysql> set global general_log = On;
    ## 临时关闭查询日志
    mysql> set global general_log = Off;

    慢查询日志

    慢查询日志 slow query log 记录执行过长的 SQL 语句, 可利用慢查询优化进行调试优化,不调试不建议开启

    开启慢查询日志

    ## 在配置文件 [mysqld] 标签内增加如下几条
    [root@Mysql ~]# cat /etc/my.cnf
    [mysqld]
    ......
    slow_query_log = on
    slow_query_log_file=/log/mysql/slow.log
    long_query_time=2 # 多长时间的查询语句记录到日志里面,单位为妙
    log_queries_not_using_indexes # 没有启用索引的查询语句
    ## 创建对应目录与日志文件
    [root@Mysql ~]# mkdir -p /log/mysql
    [root@Mysql ~]# touch /log/mysql/slow.log
    ## 更改日志文件属主和属组为 mysql
    [root@Mysql ~]# chown mysql.mysql /log/mysql/slow.log
    ## 重启数据库生效
    [root@Mysql ~]# systemctl restart mysqld

    执行过慢语句进行测试

    mysql> select benchmark(50000000,2*3);
    ## 检查慢日志是否记录
    [root@Mysql ~]# cat  /log/mysql/slow.log

    二进制日志

    二进制日志,用于记录用户对数据库操作的SQL语句(除了数据查询语句)信息。可以使用 mysqlbinlog 命令查看二进制日志的内容。

    binlog的格式也有三种模式

    • STATMENT模式:基于SQL语句的复制(statement-based replication, SBR),每一条会修改数据的sql语句会记录到binlog中。
      • 优点:不需要记录每一条SQL语句与每行的数据变化,这样子binlog的日志也会比较少,减少了磁盘IO,提高性能。
      • 缺点:在某些情况下会导致master-slave中的数据不一致(如sleep()函数, last_insert_id(),以及user-defined functions(udf)等会出现问题)
    • ROW模式:基于行的复制(row-based replication, RBR):不记录每一条SQL语句的上下文信息,仅需记录哪条数据被修改了,修改成了什么样子了。
      • 优点:不会出现某些特定情况下的存储过程、或function、或trigger的调用和触发无法被正确复制的问题。
      • 缺点:会产生大量的日志,尤其是alter table的时候会让日志暴涨。
    • MIXED模式:混合模式复制(mixed-based replication, MBR):以上两种模式的混合使用,一般的复制使用STATEMENT模式保存binlog,对于STATEMENT模式无法复制的操作使用ROW模式保存binlog,MySQL会根据执行的SQL语句选择日志保存方式。(推荐使用)

    开启 binlog 二进制日志

    ## 在配置文件 [mysqld] 标签内增加如下几条
    [root@Mysql ~]# cat /etc/my.cnf
    [mysqld]
    ......
    server-id = 1
    binlog_format = mixed # 指定用什么模式
    log-bin = /log/mysql/bin/mysql-bin
    expire_logs_days = 30 # 多少天后的日志将会被自动删除
    ## 创建对应目录
    [root@Mysql ~]# mkdir /log/mysql/bin
    ## 更改目录属主和属组为 mysql
    [root@Mysql ~]# chown -R mysql.mysql /log/mysql/
    ## 重启数据库生效
    [root@Mysql ~]# systemctl restart mysqld
    ## 查看 binlog 日志信息
    [root@sql ~]# mysqlbinlog -v /log/mysql/bin/binlog.000001
    ## 终端查询日志情况
    mysql> show variables like '%bin_log%';
    • mysqlbinlog 恢复日志
      • -v或 -verbose :从二进制日志中重建 SQL 语句
      • -vv :不光从二进制日志中重建 SQL 语句,并且增加备注
      • -D 或 --disable-log-bin :指定不恢复的内容
      • -d 或 --database :指定数据库,只显示指定数据库的内容
      • -o :指定偏移量
      • -r :指定内容保存的文件。和 > 写入指定文件一样
      • -s 或 --short-form :只显示 SQL 语句
      • -R 或 -read-from-remote-server :指示mysqlbinlog命令从远程服务器读取日志文件
      • -h 或 --host :指定远程服务器的ip地址
      • -p :将提示输入密码。默认情况下,它将使用“root”作为用户名。也可以使用 -u 选项指定用户名。
      • --start-datetime:从二进制日志中读取指定等于时间戳或者晚于本地计算机的时间
      • --stop-datetime:从二进制日志中读取指定小于时间戳或者等于本地计算机的时间
      • --start-position:从二进制日志中读取指定position 事件位置作为开始
      • --stop-position:从二进制日志中读取指定position 事件位置作为事件截至
      • --base64-output= :指定二进制日志中显示内容
        never :输出中显示base64编码的BINLOG语句
        always :只显示BINLOG项
        decode-rows :和 -v 配合把基于行的事件解码成一个SQL语句
        auto(默认) :显示全部
      • --debug-check :返回之后调试结果,使用资源情况
    ## 使用时间节点进行恢复
    # mysqlbinlog mysql.000002 --start-datetime="2018-05-07 12:05:00"
    # mysqlbinlog mysql.000002 --stop-datetime="2018-05-07 11:02:54"
    # mysqlbinlog mysql.000002 --start-datetime="2018-12-05 10:02:56" -stop-datetime="2018-12-05 11:02:54"
    ## 使用位置点进行恢复
    # mysqlbinlog mysql.000002 --start-position=124
    # mysqlbinlog mysql.000002 --stop-position=124
    # mysqlbinlog mysql.000002 --start-position=124 --stop-position=336

    日志截断

    • 切割 binlog 日志
      • 重启 mysqld 服务, 在 mysql 控制台执行 mysql> flush logs
      • 在 mysql 控制台执行 reset master 会清空所有 binlog (危险)
    • 删除部分 binlog 日志
      • mysql> purge master logs to 'sql_70_161.000004'; #删除指定日志以前的日志文件
      • mysql> purge binary logs before '2018-05-07 11:57:33'; #删除指定时间以前的日志文件
  • 相关阅读:
    《修改代码的艺术》读书笔记
    《软件架构师的12项修炼》阅读笔记2
    《软件架构师的12项修炼》阅读笔记1
    python 包
    《编程珠玑》阅读笔记1
    Darknet和YOLO的区别和关系
    darknet
    yolov3
    软件质量属性
    酷客 机器学习十讲(一)机器学习介绍
  • 原文地址:https://www.cnblogs.com/songguoyou/p/11883812.html
Copyright © 2011-2022 走看看