• 何时、怎样开启 MySql 日志?


    假如你是一名 web 开发者。假设你想调试你的应用或提升其性能的话,那你须要去參考各种日志文件。日志是開始故障排除最好的选择。就著名的 MySql 数据库server而言,你须要參考下面日志文件:
    • 错误日志:它包括了server执行时(当然也包括服务启动和停止时)所发生的错误信息
    • 普通查询日志:这是一个记录 mysqld 在做什么(连接。断开,查询)的通用日志
    • 慢查询日志:正如其名,它记录了 "慢" 的查询 SQL 语句
    本文未涉及到二进制日志。二进制日志要求非常高的server硬件配置。并且仅仅是在特定场景下(比方,主从复制,主从安装。某些数据的恢复操作)实用。

    否则的话,它就是一名实实在在的 "性能杀手"。


    关于 MySql 日志的官方文档參考 http://dev.mysql.com/doc/refman/5.7/en/server-logs.html


    通过 MySql 配置启用日志

    日志相关參数位于 [mysqld] 部分。
    编辑 MySql 配置文件:
    nano /etc/mysql/my.cnf
    以上是 Debian 下的默认安装文件夹,其它 Linux 公布版可能不太一样,这个文件里 MySql server的參数例如以下:
    # * Logging and Replication
    #
    # Both location gets rotated by the cronjob.
    # Be aware that this log type is a performance killer.
    # As of 5.1 you can enable the log at runtime!
    #general_log_file        = /var/log/mysql/mysql.log
    #general_log             = 1
    #
    # Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf.
    #
    # Here you can see queries with especially long duration
    #log_slow_queries       = /var/log/mysql/mysql-slow.log
    #long_query_time = 2
    #log-queries-not-using-indexes
    #
    # The following can be used as easy to replay backup logs or for replication.
    # note: if you are setting up a replication slave, see README.Debian about
    #       other settings you may need to change.
    #server-id              = 1
    #log_bin                        = /var/log/mysql/mysql-bin.log
    expire_logs_days        = 10
    max_binlog_size         = 100M
    #binlog_do_db           = include_database_name
    #binlog_ignore_db       = include_database_name

    MySql 安装默认是不启用全部日志文件的(Windows 平台下的 error 日志除外)。Debian 安装 MySql 默认是将 error 日志发送给 syslog。

    error 日志

    依据 /etc/mysql/conf.d/mysqld_safe_syslog.cnf 配置,error 日志推送给 syslog:
    [mysqld_safe]
    syslog

    这是推荐的做法
    。假设你因为某种原因,不想讲 error 日志推给 syslog。将 /etc/mysql/conf.d/mysqld_safe_syslog.cnf 文件里的上述行注掉,或者直接删除掉这个文件。然后在 /etc/mysql/my.cnf 中加入下面行:
    [mysqld_safe]
    log_error=/var/log/mysql/mysql_error.log
     
    [mysqld]
    log_error=/var/log/mysql/mysql_error.log

    一般查询日志

    要启用一般查询日志,将相关行取消凝视(或者加入)就可以:
    general_log_file        = /var/log/mysql/mysql.log
    general_log             = 1

    慢查询日志

    要启用慢查询日志,将相关行取消凝视(或者加入)就可以:
    log_slow_queries       = /var/log/mysql/mysql-slow.log
    long_query_time = 2
    log-queries-not-using-indexes

    配置修改后重新启动 MySql server

    以上方法要求服务重新启动才干生效:
    service mysql restart
    或者使用 systemd

    systemctl restart mysql.service


    执行时启用日志

    MySql 5.1 之后我们能够在执行时启用或者禁用日志。
    执行时启用日志。登录 MySql client(mysql -u root -p)然后执行:
    SET GLOBAL general_log = 'ON';
    SET GLOBAL slow_query_log = 'ON';

    执行时禁用日志,登录 Mysql client(mysql -u root -p)后执行:
    SET GLOBAL general_log = 'OFF';
    SET GLOBAL slow_query_log = 'OFF';

    这样的方式适用于全部平台并且不须要重新启动服务。


    显示日志结果

    error 日志

    按以上办法设置以后,你能够通过下面命令显示 error 日志:
    tail -f /var/log/syslog
    备注:假设你没有配置 error 日志文件。MySql 将把 error 日志保存在数据文件夹(一般是 /var/lib/mysql)下的一个名为 {host_name}.err 的文件里。

    普通查询日志

    按以上办法设置以后。你能够通过使用下面命令来显示普通日志:
    tail -f /var/log/mysql/mysql.log
    备注:假设你没有配置普通日志文件。MySql 将把普通日志保存在数据文件夹(一般是 /var/lib/mysql)下的一个名为 {host_name}.log 的文件里。


    慢查询日志

    按以上办法设置以后。你能够通过使用下面命令来显示慢查询日志:
    tail -f /var/log/mysql/mysql-slow.log

    备注:假设你没有配置慢查询日志文件,MySql 将把普通日志保存在数据文件夹(一般是 /var/lib/mysql)下的一个名为 {host_name}-slow.log 的文件里。


    循环日志

    别忘了滚动日志。否则的话日志文件可能会变得非常庞大。
    Debian(以及 Debian 派生系列诸如 Ubuntu 等)系统,MySql 初始安装之后,循环日志就已经使用了 logrotate:
    nano /etc/logrotate.d/mysql-server
    对于其它 Linux 发行版。可能须要做一些修改:
    # - I put everything in one block and added sharedscripts, so that mysql gets
    #   flush-logs'd only once.
    #   Else the binary logs would automatically increase by n times every day.
    # - The error log is obsolete, messages go to syslog now.
    /var/log/mysql.log /var/log/mysql/mysql.log /var/log/mysql/mysql-slow.log {
            daily
            rotate 7
            missingok
            create 640 mysql adm
            compress
            sharedscripts
            postrotate
                    test -x /usr/bin/mysqladmin || exit 0
                    # If this fails, check debian.conf!
                    MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
                    if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
                      # Really no mysqld or rather a missing debian-sys-maint user?
                      # If this occurs and is not a error please report a bug.
                      #if ps cax | grep -q mysqld; then
                      if killall -q -s0 -umysql mysqld; then
                        exit 1
                      fi
                    else
                      $MYADMIN flush-logs
                    fi
            endscript
    }


    检验server配置

    使用 show variables like '%log%'; 来检查server和日志文件相关的变量:
    root@cosmos ~ # mysql -uroot -p
    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 144332
    Server version: 5.5.31-0+wheezy1 (Debian)
     
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
     
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
     
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
     
    mysql> show variables like '%log%';
    +-----------------------------------------+--------------------------------+
    | Variable_name                           | Value                          |
    +-----------------------------------------+--------------------------------+
    | back_log                                | 50                             |
    | binlog_cache_size                       | 32768                          |
    | binlog_direct_non_transactional_updates | OFF                            |
    | binlog_format                           | STATEMENT                      |
    | binlog_stmt_cache_size                  | 32768                          |
    | expire_logs_days                        | 10                             |
    | general_log                             | OFF                            |
    | general_log_file                        | /var/lib/mysql/cosmos.log      |
    | innodb_flush_log_at_trx_commit          | 1                              |
    | innodb_locks_unsafe_for_binlog          | OFF                            |
    | innodb_log_buffer_size                  | 8388608                        |
    | innodb_log_file_size                    | 5242880                        |
    | innodb_log_files_in_group               | 2                              |
    | innodb_log_group_home_dir               | ./                             |
    | innodb_mirrored_log_groups              | 1                              |
    | log                                     | OFF                            |
    | log_bin                                 | OFF                            |
    | log_bin_trust_function_creators         | OFF                            |
    | log_error                               |                                |
    | log_output                              | FILE                           |
    | log_queries_not_using_indexes           | OFF                            |
    | log_slave_updates                       | OFF                            |
    | log_slow_queries                        | OFF                            |
    | log_warnings                            | 1                              |
    | max_binlog_cache_size                   | 18446744073709547520           |
    | max_binlog_size                         | 104857600                      |
    | max_binlog_stmt_cache_size              | 18446744073709547520           |
    | max_relay_log_size                      | 0                              |
    | relay_log                               |                                |
    | relay_log_index                         |                                |
    | relay_log_info_file                     | relay-log.info                 |
    | relay_log_purge                         | ON                             |
    | relay_log_recovery                      | OFF                            |
    | relay_log_space_limit                   | 0                              |
    | slow_query_log                          | OFF                            |
    | slow_query_log_file                     | /var/lib/mysql/cosmos-slow.log |
    | sql_log_bin                             | ON                             |
    | sql_log_off                             | OFF                            |
    | sync_binlog                             | 0                              |
    | sync_relay_log                          | 0                              |
    | sync_relay_log_info                     | 0                              |
    +-----------------------------------------+--------------------------------+
    41 rows in set (0.00 sec)

    server变量相关官方文档參考 http://dev.mysql.com/doc/refman/5.7/en/server-options.html


    何时启用日志

    MySql 默认安装的话,全部的日志文件都不会被启用的(除了 Windows 平台上的 error 日志)。Debian 上安装默认将 error 日志发给 syslog。
    实际上,在非常多情况下日志文件都能够提供关键问题的解决的方法:
    • 总是启用 error 日志
    • 在这些情况下开启普通查询日志(最好在执行时):检查你的应用是否正确处理了 MySql 数据库连接(一个常见的错误就是从一个单一脚本多次连接到 MySql);监控来自你的应用的查询的执行情况;測试 memcached(或者相似的软件),检查某查询是被 db 执行还是被 memcached 处理
    • 当你的应用因为某些原因造成性能下降而你想找到这些慢查询时。启用慢查询日志(MySql 最好是在短期内这样配置,比方 2-3 天)


    演示样例

    下面是一个 MySql 普通日志的演示样例:
    131021 17:43:50    43 Connect root@localhost as anonymous on pnet_blog
           43 Init DB pnet_blog
           43 Query SELECT count(id) as total_posts FROM posts WHERE date_published is not null AND date_published <= '20131021144350'
           43 Query SELECT * FROM posts WHERE date_published is not null AND date_published <= '20131021144350' ORDER BY date_published DESC LIMIT 0,10
           44 Connect root@localhost as anonymous on pnet_blog
           44 Query SELECT id, title, impressions FROM tips WHERE date_published IS NOT NULL AND date_published <= '20131021144350' ORDER BY date_published DESC LIMIT 0, 10
           44 Quit
           43 Quit
    131021 17:44:28    45 Connect root@localhost as anonymous on pnet_blog
           45 Init DB pnet_blog
           45 Query SELECT * FROM posts WHERE url='how-and-when-to-enable-mysql-logs'
           45 Query UPDATE posts SET impressions=impressions+1 WHERE id='41'
           45 Query SELECT url, post_title FROM posts WHERE date_published IS NOT NULL AND date_published < '20131020150000' ORDER BY date_published DESC LIMIT 0,1
           45 Query SELECT url, post_title FROM posts WHERE date_published IS NOT NULL AND date_published > '20131020150000' ORDER BY date_published ASC LIMIT 0,1
           45 Query SELECT * FROM posts WHERE date_published is not null AND date_published <= '20131021144428' AND date_published >= '20130421144428' ORDER BY impressions DESC LIMIT 0,10
           46 Connect root@localhost as anonymous on pnet_blog
           46 Query SELECT id, title, impressions FROM tips WHERE date_published IS NOT NULL AND date_published <= '20131021144428' ORDER BY date_published DESC LIMIT 0, 10
           46 Quit
           45 Quit  
        
    原文链接:http://www.pontikis.net/blog/how-and-when-to-enable-mysql-logs

  • 相关阅读:
    JavaScript数组方法--includes、indexOf、lastIndexOf
    JavaScript数组方法--flat、forEach、map
    JavaScript数组方法--filter、find、findIndex
    bootstrap-14
    bootstrap-13
    bootstrap-12
    bootstrap-11
    bootstrap-10
    bootstrap-9
    bootstrap-8
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7138050.html
Copyright © 2020-2023  润新知