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

    我叫张贺,贪财好色。一名合格的LINUX运维工程师,专注于LINUX的学习和研究,曾负责某中型企业的网站运维工作,爱好佛学和跑步。
    个人博客:传送阵
    笔者微信:zhanghe15069028807

    日志 作用
    error log错误日志 记录mysql启停错误信息,用于运维排错
    general log普通日志 记录客户端查询日志,用于开发
    bin log 二进制日志 用于增加备份
    slow log 慢查询日志 查询执行速度慢的语句,用于调优

    1、错误日志

    错误日志是我们运维人员用的最多的日志了,里面记录了数据库启动/关闭时的提示信息,我们可以利用错误日志定位到错误。

    1、查看错误日志默认存放的位置

    MariaDB [(none)]> show variables like "log_error%";
    +---------------+------------------------------+
    | Variable_name | Value                        |
    +---------------+------------------------------+
    | log_error     | /var/log/mariadb/mariadb.log |
    +---------------+------------------------------+
    1 row in set (0.00 sec)
    

    2、更改错误日志存放的位置并授权

    [root@mysql01 ~]# grep error /etc/my.cnf
    [mysqld]
    log-error=/log/mysql/err.log
    [root@mysql01 ~]# mkdir -p /log/mysql ; touch /log/mysql/err.log
    [root@mysql01 ~]# chown -R mysql:mysql /log/mysql/err.log 
    //然后重启数据库
    
    

    3、查看错误日志常用操作

    [root@mysql01 ~]# grep -i "error" /log/mysql/err.log 
    

    2、查询日志

    查询日志会把所有人对数据库的所有的操作都记录下来,常用于开发测试数据库,运维默认将其关闭,因为一直开着它,会产生大量的无用IO。

    1、开启general日志

    [root@mysql01 ~]# grep "general" /etc/my.cnf
    [mysqld]
    general_log=ON
    general_log_file=/log/mysql/select.log
    
    

    2、创建对应的目录与日志文件,并授权

    [root@mysql01 ~]# mkdir -p /log/mysql
    [root@mysql01 ~]# touch /log/mysql/select.log
    [root@mysql01 ~]# chown -R mysql:mysql /log/mysql/select.log
    //重启生效
    

    3、查看日志,任何操作都会记录

    [root@mysql01 ~]# cat /log/mysql/select.log 
    /usr/libexec/mysqld, Version: 5.5.64-MariaDB (MariaDB Server). started with:
    Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
    Time                 Id Command    Argument
    191122 11:51:28	    3 Connect	root@localhost as anonymous on 
    		    3 Query	select @@version_comment limit 1
    		    3 Query	show databases
    		    3 Quit	
    

    4、通过变量查看查询日志的位置与启动

    MariaDB [(none)]> show variables like "general_log%";
    +------------------+-----------------------+
    | Variable_name    | Value                 |
    +------------------+-----------------------+
    | general_log      | ON                    |
    | general_log_file | /log/mysql/select.log |
    +------------------+-----------------------+
    2 rows in set (0.00 sec)
    //临时开启查询日志
    MariaDB [(none)]> set global general_log = ON;
    Query OK, 0 rows affected (0.00 sec)
    //临时关闭查询日志
    MariaDB [(none)]> set global general_log = OFF;
    Query OK, 0 rows affected (0.00 sec)
    

    3、慢查询日志

    慢查询日志用于运维人员定位到执行缓慢的语句,用于数据库的调优。运维能做的仅仅是通过慢查询日志来找出哪些语句比较慢,然后把这语句告诉开发,让开发进行做索引或语句的优化,运维不能擅自改动,因为开发对于业务比较熟悉。数据库语句执行较慢的原因主要有二:

    • 开发水平较低,把能简单操作语句写的很长,很复杂,比较普通内连接能完成的事结果把语句写的很长很复杂
    • 数据量很大导致的速度慢,这种情况就需要建立索引了,但索引最好也是开发进行建立。

    1、开启慢查询日志

    [root@mysql01 ~]# 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  #忽略索引,索引做的不好也会查的慢
    

    2、创建对应目录与日志文件,并授权

    [root@mysql01 ~]# mkdir -p /log/mysql ; touch /log/mysql/slow.log
    [root@mysql01 ~]# chown -R mysql:mysql /log/mysql/slow.log
    //重启数据库生效
    

    3、执行过慢语句进行测试

    MariaDB [(none)]>  select BENCHMARK(500000000,2*3); #6秒
    +--------------------------+
    | BENCHMARK(500000000,2*3) |
    +--------------------------+
    |                        0 |
    +--------------------------+
    1 row in set (6.14 sec)
    

    4、检查慢日志是否记录

    [root@mysql01 ~]# cat /log/mysql/slow.log
    /usr/libexec/mysqld, Version: 5.5.64-MariaDB (MariaDB Server). started with:
    Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
    Time                 Id Command    Argument
    # Time: 191122 12:14:20
    # User@Host: root[root] @ localhost []
    # Thread_id: 2  Schema:   QC_hit: No
    # Query_time: 6.138377  Lock_time: 0.000000  Rows_sent: 1  Rows_examined: 0
    SET timestamp=1574396060;
    select BENCHMARK(500000000,2*3);
    

    4、二进制日志

    二进制日志只记录数据被修改的信息,所以二进制日志常用于做数据恢复。

    1、开启binLog二进制日志

    [root@mysql01 ~]# cat /etc/my.cnf
    [mysqld]
    server-id = 161
    log-bin = /log/mysql/bin/sql_70_161
    expire_logs_days = 30  #30天前之前的内容自动删除
    
    mysql> show variables like 'log_bin%';  #查看二进制日志是否开启成功
    

    2、创建对应目录与日志文件,并授权

    [root@mysql01 ~]# mkdir -p /log/mysql/bin
    [root@mysql01 ~]# touch /log/mysql/bin/sql_70_161
    [root@mysql01 ~]# chown -R mysql:mysql /log/mysql/bin
    [root@mysql01 ~]# systemctl restart mariadb
    

    3、查看binlog信息

    [root@mysql01 ~]# mysqlbinlog -v /log/mysql/bin/sql_70_161.000001 
    

    4、日志截断

    • 切割binlog日志
      重启数据库或者执行flush logs;
      在控制台执行reset master会清空所有binlog(危险)

    • 删除部分binlog日志
      MariaDB [(none)]> purge master logs to 'sql_70_161.000003'; #删除指定日志以前的日志文件

  • 相关阅读:
    IIS笔记-Application Request Route(ARR)
    UE4笔记-UStructToJsonObjectString首字母自动转换为小写的问题及解决方法
    Electron/Nodejs开发笔记-功能问题记录及指南
    Net笔记-EF/EF Core/Dapper等ORM开发记录
    C/C++和C#混合编程笔记-DLL调用与IPC等mixed问题记录
    CImg笔记
    Net/Net Core笔记 WebAPI/MVC一些bug和处理
    Net-Net Core 3.0 gRPC 开发不完全笔记
    UE4-PixelStreaming不完全开发笔记
    UE4-开发中遇到的问题和处理方法
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/11911093.html
Copyright © 2011-2022 走看看