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

    mysql日志管理

    1.mysql日志分类

    日志文件 选项 文件名 程序
    错误日志 --log-error host_name.err N/A
    常规日志 --general_log general_log、host_name.log N/A
    慢速查询日志 --slow_query_log、--long_query_time host_name-slow. log、slow_log mysqldumpslow
    二进制日志 --log-bin、--expire-logs-days host_name-bin.000001 mysqlbinlog
    审计日志 --audit_log、--audit_log_file audit.log N/A

    2.mysql错语日志配置

    作用:记录mysql数据库的一般状态信息及报错信息,是我们对于数据库常规报错处理的常用日志
    配置方法:

    [mysqld]
    log-error=/data/mysql/mysql.log
    

    查看配置方式:

    mysql> show variables like '%log%error%';
    

    3.mysql常规日志

    作用:记录mysql所有执行成功的SQL语句信息,可以做审计用,但是我们很少开启
    配置方法

    [mysqld]
    general_log=on
    general_log_file=/data/mysql/server2.log
    

    查看配置方式:

    show variables like '%gen%';
    

    4.二进制日志

    二进制日志主要记录已提交的数据记录,以event的形式记录到二进制文件中
    二进制记录格式:
      row:行模式,即数据行的变化过程,上图中Age=19修改成 Age=20的过程事件。
      statement:语句模式,上图中将update语句进行记录。
      mixed:以上两者的混合模式
    binlog的作用:用于备份、恢复与复制

    4.1 二进制日志管理

    1、开启二进制日志

    set sql_log_bin=0    #在会话级别修改为临时关闭
    vi /etc/my.cnf
    log-bin=/data/mysql/mysql-bin  #在全局打开binlog
    binlog_format=row #设置二进制日志记录格式为row
    sync_binlog=1     #sync_binlog参数来控制数据库的binlog刷到磁盘上去。sync_binlog=0,表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新。这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。
    

    2、设置二进制日志记录格式(建议是ROW):

    配置文件中修改:
    binlog-format=ROW
    命令行修改
    mysql> SET GLOBAL binlog_format = 'STATEMENT';
    mysql> SET GLOBAL binlog_format = 'ROW';
    mysql> SET GLOBAL binlog_format = 'MIXED';
    

    3、查看binlog设置

    show variables like '%binlog%';
    

    4、查看二进制文件数量

    mysql> show binary logs;
    +------------------+-----------+
    | Log_name         | File_size |
    +------------------+-----------+
    | mysql-bin.000001 |      1473 |
    | mysql-bin.000002 |       143 |
    | mysql-bin.000003 |       143 |
    | mysql-bin.000004 |       143 |
    | mysql-bin.000005 |       143 |
    | mysql-bin.000006 |       120 |
    +------------------+-----------+
    6 rows in set (0.00 sec)
    

    5、查看正在使用的二进制日志文件

    mysql> show master status;
    +------------------+----------+--------------+------------------+-------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    +------------------+----------+--------------+------------------+-------------------+
    | mysql-bin.000006 |      120 |              |                  |                   |
    +------------------+----------+--------------+------------------+-------------------+
    1 row in set (0.00 sec)
    

    6、查看二进制日志文件内容

    [root@db02 mysql]# mysqlbinlog  --base64-output=decode-rows -v mysql-bin.000006
    在数据库上查看
    mysql> show binlog events in 'mysql-bin.000002';
    +------------------+-----+-------------+-----------+-------------+---------------------------------------+
    | Log_name         | Pos | Event_type  | Server_id | End_log_pos | Info                                  |
    +------------------+-----+-------------+-----------+-------------+---------------------------------------+
    | mysql-bin.000002 |   4 | Format_desc |         1 |         120 | Server ver: 5.6.42-log, Binlog ver: 4 |
    | mysql-bin.000002 | 120 | Stop        |         1 |         143 |                                       |
    +------------------+-----+-------------+-----------+-------------+---------------------------------------+
    2 rows in set (0.00 sec)
    

    7、刷新二进制日志

    mysql> flush logs;
    

    8、截取二进制日志用做恢复数据

    mysqlbinlog --start-position=xx  --stop-position=xx >a.sql
    例子:通过截取binlog恢复损坏数据
    创建数据库
    mysql> create database oldboy;
    Query OK, 1 row affected (0.00 sec)
    mysql> use oldboy
    Database changed
    创建表
    mysql> create table t1(id int,name varchar(20));
    Query OK, 0 rows affected (0.01 sec)
    插入内容
    mysql> insert into t1 values(1,'zhang');
    Query OK, 1 row affected (0.01 sec)
    删除数据库
    mysql> drop database oldboy;
    Query OK, 1 row affected (0.01 sec)
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    | testdb             |
    | world              |
    +--------------------+
    6 rows in set (0.00 sec)
    查看二进制文件,找出需工截取的部分
    [root@db02 mysql]# mysqlbinlog  --base64-output=decode-rows -v mysql-bin.000001
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    /*!40019 SET @@session.max_insert_delayed_threads=0*/;
    /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    DELIMITER /*!*/;
    # at 4
    #190425 13:59:25 server id 1  end_log_pos 120 CRC32 0xc3b4c8bc     Start: binlog v 4, server v 5.6.42-log creat
    ed 190425 13:59:25 at startup# Warning: this binlog is either in use or was not closed properly.
    ROLLBACK/*!*/;
    # at 120  ============>可以从此处进行截取
    #190425 13:59:25 server id 1  end_log_pos 220 CRC32 0x5b44b064     Query    thread_id=4    exec_time=746    erro
    r_code=0SET TIMESTAMP=1556171965/*!*/;
    SET @@session.pseudo_thread_id=4/*!*/;
    SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autoc
    ommit=1/*!*/;SET @@session.sql_mode=1075838976/*!*/;
    SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    /*!C utf8 *//*!*/;
    SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
    SET @@session.lc_time_names=0/*!*/;
    SET @@session.collation_database=DEFAULT/*!*/;
    create database oldboy
    /*!*/;
    # at 220
    #190425 13:59:25 server id 1  end_log_pos 338 CRC32 0xd98d520a     Query    thread_id=4    exec_time=772    erro
    r_code=0use `oldboy`/*!*/;
    SET TIMESTAMP=1556171965/*!*/;
    create table t1(id int,name varchar(20))
    /*!*/;
    # at 338
    #190425 13:59:25 server id 1  end_log_pos 412 CRC32 0x269d55e6     Query    thread_id=4    exec_time=790    erro
    r_code=0SET TIMESTAMP=1556171965/*!*/;
    BEGIN
    /*!*/;
    # at 412
    #190425 13:59:25 server id 1  end_log_pos 462 CRC32 0xe9e307c9     Table_map: `oldboy`.`t1` mapped to number 71
    # at 462
    #190425 13:59:25 server id 1  end_log_pos 508 CRC32 0x05abce7f     Write_rows: table id 71 flags: STMT_END_F
    ### INSERT INTO `oldboy`.`t1`
    ### SET
    ###   @1=1
    ###   @2='zhang'
    # at 508
    #190425 13:59:25 server id 1  end_log_pos 539 CRC32 0xee83af99     Xid = 116
    COMMIT/*!*/;   ==================>到此结束
    # at 539
    #190425 13:59:25 server id 1  end_log_pos 637 CRC32 0xd3a1140b     Query    thread_id=4    exec_time=846    erro
    r_code=0SET TIMESTAMP=1556171965/*!*/;
    drop database oldboy
    /*!*/;
    DELIMITER ;
    # End of log file
    ROLLBACK /* added by mysqlbinlog */;
    /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
    将截取的内容写入到mysql.sql中
    [root@db02 mysql]# mysqlbinlog  --start-position=120 --stop-position=539 mysql-bin.000001 > /tmp/mysql.sql
    进行恢复
    mysql> source /tmp/mysql.sql
    此时发现数据已经恢复过来
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | oldboy             |
    | performance_schema |
    | test               |
    | testdb             |
    | world              |
    +--------------------+
    7 rows in set (0.00 sec)
    

    9.二进制日志文件删除
    默认情况下,不会删除旧的日志文件

    根据存在时间删除日志
    SET GLOBAL expire_logs_days = 7;
    或者
    PURGE BINARY LOGS BEFORE now() - INTERVAL 3 day;
    根据文件名删除日志:
    PURGE BINARY LOGS TO 'mysql-bin.000010';
    

    5.慢日志管理

      慢日志是将mysql服务器中影响数据库性能的相关SQL语句记录到日志文件
      通过对这些特殊的SQL语句分析,改进以达到提高数据库性能的目的 I

    5.1 慢日志配置

    long_query_time:  设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10s
    slow_query_log :  指定是否开启慢查询日志
    slow_query_log_file:  指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log
    min_examined_row_limit:查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
    log_queries_not_using_indexes: 不使用索引的慢查询日志是否记录到索引
    配置案例:
    在配置文件里添加,注意:slow_query_log_file路径一定要先创建好,然后给mysql用户权限,再重启mysql服务即可生效
    [mysqld]
    slow_query_log=1
    slow_query_log_file=/data/slow/slow.log
    long_query_time=0.5
    log_queries_not_using_indexes
    

    5.2 处理慢日志

    mysqldumpslow命令
    mysqldumpslow -s c -t 10 /data/slow/slow.log  这会输出记录次数最多的10条SQL语句,其中:
    -s:是表示按照何种方式排序
    c、t、l、r:分别是按照记录次数、时间、查询时间、返回的记录数来排序
    ac、at、al、ar:表示相应的倒叙;
    -t:是top n的意思,即为返回前面多少条的数据;
    
  • 相关阅读:
    perlsplice
    perl中数组函数:delete和grep
    Python字符串格式化
    blast命令解释
    通俗解释托管与非托管
    四、GO语言的转义字符
    六、GO语言的指针
    五、GO语言的变量及数据类型
    一、GO语言的特点
    前台生成验证码案例
  • 原文地址:https://www.cnblogs.com/yjiu1990/p/10845683.html
Copyright © 2011-2022 走看看