设为首页 收藏本站
查看: 761|回复: 0

[经验分享] 开启mysql日志

[复制链接]

尚未签到

发表于 2017-11-21 21:42:36 | 显示全部楼层 |阅读模式
  假如你是一名 web 开发人员,如果你想调试你的应用或提升其性能的话,那你需要去参考各种日志文件。日志是开始故障排除最好的选择。就著名的 MySql 数据库服务器而言,你需要参考以下日志文件:

  • 错误日志:它包含了服务器运行时(当然也包括服务启动和停止时)所发生的错误信息
  • 普通查询日志:这是一个记录 mysqld 在做什么(连接,断开,查询)的通用日志
  • 慢查询日志:正如其名,它记录了 "慢" 的查询 SQL 语句
  本文未涉及到二进制日志。二进制日志要求非常高的服务器硬件配置,而且只是在特定场景下(比如,主从复制,主从安装,某些数据的恢复操作)有用。否则的话,它就是一名实实在在的 "性能杀手"。
  关于 MySql 日志的官方文档参考 http://dev.mysql.com/doc/refman/5.7/en/server-logs.html。
通过 MySql 配置启用日志
  日志相关参数位于 [mysqld] 部分。
编辑 MySql 配置文件:
nano /etc/mysql/my.cnf
以上是 Debian 下的默认安装目录,其他 Linux 发布版可能不太一样,这个文件中 MySql 服务器的参数如下:
# * 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 服务器
  以上方法要求服务重启才能生效:
service mysql restart
或者使用 systemd:

  systemctl restart mysql.service
运行时启用日志
  MySql 5.1 之后我们可以在运行时启用或者禁用日志。
运行时启用日志,登录 MySql 客户端(mysql -u root -p)然后执行:
SET GLOBAL general_log = 'ON';
SET GLOBAL slow_query_log = 'ON';

运行时禁用日志,登录 Mysql 客户端(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 发行版,可能需要做一些改动:




[plain] view plain copy

  • # - 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
  • }
  

检验服务器配置
  使用 show variables like '%log%'; 来检查服务器和日志文件相关的变量:
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)

  服务器变量相关官方文档参考 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 LIMIT0,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 ISNOT 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-409336-1-1.html 上篇帖子: deb软件源结构 下篇帖子: 同步公网yum源搭建本地yum仓库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表