mysql日志总结

第1章 Mysql日志

1.1 错误文件的配置方式

1.1.1 方法1:在my.cnf配置文件中调整

注意,是在[mysql_safe]模块下面进行配置

[[email protected] logs]# vim /etc/my.cnf

[mysqld_safe]

log-error = /application/mysql/logs/cc666.err

1.1.2 方法2:在启动MySQL服务的命令里加入记错错入日志参数

显示如下:

[[email protected] ~]# mysqld_safe --log-error=/application/mysql-5.6.34/data/cc666.err &

[1] 13188

mysql> show variables like ‘log_error%‘;

+---------------+------------------------------------+

| Variable_name | Value                              |

+---------------+------------------------------------+

| log_error     | /application/mysql/logs/cc666.err |

+---------------+------------------------------------+

1 row in set (0.00 sec)

mysql>

1.1.3 错误日志(error log)轮询

管理员可以使用命令轮询错误日志,例如可以按天轮询,具体方法如下:

[[email protected] ~]# cd /application/mysql/data/                    #切换到日志目录下

[[email protected] data]# mv cc666.err cc666_$(date +%F).err        #将错误日志按天移动改名

[[email protected] data]# mysqladmin flush-logs                       #执行刷新日志命令

[[email protected] data]# mysqladmin -uroot -p123  flush-logs

Warning: Using a password on the command line interface can be insecure.

[[email protected] data]# ls -l old

cc666/                cc666_2017-05-04.err  oldgirl/

[[email protected] data]# ls -l cc666_2017-05-04.err                 #新的错误日志诞生了

-rw-r----- 1 mysql root 60 May  4 21:41 cc666_2017-05-04.err

[[email protected] data]# cat cc666_2017-05-04.err

170504 21:41:02 mysqld_safe A mysqld process already exists

[[email protected] data]#

1.1.4 数据库故障排查案例分析

新手安装数据库时,遇到数据库无法启动时的排查方法为:

1.先把错误日志文件清空,然后重新启动MySQL服务,再查看日志文件报有什么错误,并根据错误日志进行处理。

2.如果无法解决,则删除数据文件,重新初始化数据库。

假设在故障排查时,得到的错误日志提示为:

InnoDB:The error means mysqld does  not have the access rights to

Innodb:the directory

根据提示可知,是权限问题导致的问题,可对数据目录递归执行权限,然后在重启数据库命令如下:

[[email protected] data]# chown -R mysql.mysql /application/mysql/data/

[[email protected] data]#

1.2 普通查询日志(general query log)介绍与配置

1.2.1 普通日志查询介绍

普通日志查询的作用是记录客户端连接信息,以及执行的SQL语句信息

1.2.2 普通查询日志(gengeral query log)功能配置

可能官方考虑到普通查询日志的重要性比较低,因此默认情况下普通查询日志是关闭状态,如下所示:

[mysqld]   #写在[mysql]下

general_log = on

general_log_file = /application/mysql-5.6.34/data/cc666.log

[[email protected] data]# cat /application/mysql-5.6.34/data/cc666.log

/application/mysql/bin/mysqld, Version: 5.6.34-log (Source distribution). started with:

Tcp port: 0  Unix socket: (null)

Time                 Id Command    Argument

1.2.3 开启日志查询临时开启

mysql> set global general_log = on;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like ‘general_log%‘;

+------------------+-------------------------------------------+

| Variable_name    | Value                                     |

+------------------+-------------------------------------------+

| general_log      | ON                                        |

| general_log_file | /application/mysql-5.6.34/data/cc666.log |

+------------------+-------------------------------------------+

2 rows in set (0.00 sec)

mysql>

mysql> system cat /application/mysql/data/db02.log
/application/mysql/bin/mysqld, Version: 5.6.34-log (Source distribution). started with:
Tcp port: 3306  Unix socket: /application/mysql-5.6.34/tmp/mysql.sock
Time                 Id Command    Argument
170504 10:34:57     6 Query show variables like ‘general_log%‘
170504 10:35:51     6 Query select * from mysql.user
170504 10:36:02     6 Query show databases

访问量不大的企业没有审计需求的不用开启。互联网公司要关闭普通日志,减小磁盘IO读写负载

1.2.4 普通查询日志(general query log)生产使用建议

在高并发数据库的场景,普通查询日志应该是关闭的(默认也是关闭),主要是因为查询日志信息量会很大,容易导致磁盘I/O性能问题,当访问量不是很大,而企业又有审计执行的SQL语句需求时,可以考虑开启该功能。

1.3 二进制日志(binary log)介绍与配置

1.3.1 二进制日志(binary log)介绍

二进制日志(binary log)的作用是记录数据库里的数据被修改的SQL语句,一般为DDL和DML语句,例如含有insert update delete create drop alter等关键字的语句

1.3.2 二进制日志(binary log)作用

二进制日志最重要的作用有2个:

第一个记录MySQL数据的增量数据,用来做增量数据库恢复,没有二进制功能,MySQL的备份将无法完整还原数据

第二个是实现主从复制功能,具体可见MySQL主从复制相关内容

1.3.3 二进制日志(binary log)配置

前文已经讲过了,查验二进制文件内容如下所示

[[email protected] data]# grep log_bin /etc/my.cnf

# log_bin

log_bin = /application/mysql/logs/cc666-bin

[[email protected] data]#

mysql> system mysqlbinlog cc666-bin.00005|grep  "cc666"

mysql> show variables like ‘log_bin‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |#记录binlog开关

+---------------+-------+

1 row in set (0.00 sec)

mysql> show variables like ‘%log_bin‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |  #记录binlog开关

| sql_log_bin   | ON    |  #临时不记录binlog开关

+---------------+-------+

2 rows in set (0.00 sec)

mysql>

mysql> system mysqlbinlog cc666-bin.000013|grep ‘cc666‘;   # 过滤binlog文件 没有

mysql>

mysql> drop database cc666;

Query OK, 1 row affected (0.23 sec)

mysql> system mysqlbinlog cc666-bin.000013|grep ‘cc666‘;  #继续过滤发现记录了binlog

drop database cc666

mysql>

Sql_log_bin的功能就是用户通常用于mysql数据恢复时,不希望恢复的数据SQL记录到binlog里面的情况。

有个参数可以实现在开启binlog功能的前提下,临时不记录binlog,实例如下:

mysql> set session sql_log_bin = OFF;

Query OK, 0 rows affected (0.00 sec)

mysql> show variables like  ‘%log_bin‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |

| sql_log_bin   | OFF   |    #已经关闭

+---------------+-------+

2 rows in set (0.00 sec)

mysql> show variables like  ‘%log_bin‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| log_bin       | ON    |

| sql_log_bin   | OFF   |

+---------------+-------+

2 rows in set (0.00 sec)

mysql> create database cc666;

Query OK, 1 row affected (0.00 sec)

mysql> system mysqlbinlog cc666-bin.000013|grep ‘cc666‘;

drop database cc666

mysql> system mysqlbinlog cc666-bin.000013|grep ‘cc666‘;

drop database cc666

mysql>

1.4 二进制文件刷新条件

数据库重启会自动刷新binlog为新文件

执行mysqldump -F 或mysqladmin flush-logs 会将binlog刷新为新文件

Binlog文件达到1GB左右时,会自动刷新binlog为新文件

人为配置切割及调整

Binlog 最大值控制参数及默认大小查看方法如下:

mysql> show variables like ‘max_binlog_size‘;

+-----------------+------------+

| Variable_name   | Value      |

+-----------------+------------+

| max_binlog_size | 1073741824 |

+-----------------+------------+

1 row in set (0.00 sec)

1.5 二进制日志(binary log)索引文件

除了很多按序生成的binlog文件列表外,还有一个索引文件,例如下文里的cc666-bin.index

[[email protected] data]# cd /application/mysql/logs/

[[email protected] logs]# ls

bin.sql            cc666-bin.000008  cc666-bin.000011  cc666-bin.index

cc666-bin.000006  cc666-bin.000009  cc666-bin.000012  cc666.err

cc666-bin.000007  cc666-bin.000010  cc666-bin.000013  slow.log

索引文件的文件名和binlog文件一样,只是扩展名为index,查看索引文件内容的命令如下:

1.5.1 binlog文件的索引参数

mysql> show variables like ‘log_bin_index‘;

+---------------+------------------------------------------+

| Variable_name | Value                                    |

+---------------+------------------------------------------+

| log_bin_index | /application/mysql/logs/cc666-bin.index |

+---------------+------------------------------------------+

1 row in set (0.00 sec)

mysql>

1.6 删除二进制日志(binary log)日志方法

Binlog日志很重要,不能随意清除,有些读者看到所维护的服务器空间满了,竟然会直接删除binlog物理文件,这样的操作是错误的,应避免,那么如何正确删除binlog文件呢?

首先1,要确定什么时候可以删除binlog

理论上每天的数据库全备时刻以前的binlog都是无用的,但是工作中我们会根据需要保留3-7天的本地binlog的文件。

1.6.1 设置参数自动删除binlog

设置参数自动删除binlog是每个管理员都应该做的,参数设置例如下

假设参数为

Expire_logs_days=7 #删除七天以前的日志

该参数默认是没有配置的,生产中可以实现在线修改永久配置文件

mysql> show variables like ‘expire_logs-days‘;

1.6.2 从最开始一直删除到指定文件位置(不含指定文件)

mysql> show binary logs;

+-------------------+-----------+

| Log_name          | File_size |

+-------------------+-----------+

| cc666-bin.000006 |       143 |

| cc666-bin.000007 |      1487 |

| cc666-bin.000008 |      4033 |

| cc666-bin.000009 |       576 |

| cc666-bin.000010 |       246 |

| cc666-bin.000011 |       168 |

| cc666-bin.000012 |       143 |

| cc666-bin.000013 |       218 |

+-------------------+-----------+

8 rows in set (0.00 sec)

删除标识位置之后的

mysql> purge binary logs to ‘cc666-bin.000006‘;

Query OK, 0 rows affected (0.01 sec)

1.6.3 按照时间点进行删除

mysql> system ls -l --time-style=long-iso cc666-bin*;

-rw-rw---- 1 mysql mysql  143 2017-05-03 15:53 cc666-bin.000006

-rw-rw---- 1 mysql mysql 1487 2017-05-03 17:43 cc666-bin.000007

-rw-rw---- 1 mysql mysql 4033 2017-05-03 17:59 cc666-bin.000008

-rw-rw---- 1 mysql mysql  576 2017-04-25 08:53 cc666-bin.000009

-rw-rw---- 1 mysql mysql  246 2017-05-04 18:06 cc666-bin.000010

-rw-rw---- 1 mysql mysql  168 2017-05-04 21:55 cc666-bin.000011

-rw-rw---- 1 mysql mysql  143 2017-05-04 22:32 cc666-bin.000012

-rw-rw---- 1 mysql mysql  218 2017-05-05 12:12 cc666-bin.000013

-rw-rw---- 1 mysql mysql  336 2017-05-04 22:32 cc666-bin.index

mysql>

mysql> PURGE MASTER LOGS BEFORE ‘2017-05-02 19:53‘;

Query OK, 0 rows affected (0.01 sec)

1.7 常用binlog参数

1.7.1 Binlog_cache_size

二进制日志缓存是数据库为每一个客户连接分配的内存空间,对于事务引擎来说,适当调整该参数会获得更好的性能,该参数的默认值为:

1.7.2 Max_binlog_size

该参数用于设置binlog日志的最大大小,默认为1GB,但该值并不能很严格控制binlog大小,若binlog大小接近1GB,而此时又执行了一个较大事务,为了保证事务的完整性,数据库不会做日志刷新动作,而是直到该事务的日志全部记录进入当前binlog日志后才会进行刷新,该参数的默认值查询结果为

mysql> show variables like ‘%max_binlog_size%‘;

+-----------------+------------+

| Variable_name   | Value      |

+-----------------+------------+

| max_binlog_size | 1073741824 |

+-----------------+------------+

1 row in set (0.00 sec)

mysql>

1.7.3 Sync_binlog

这个参数的作用是控制binlog什么时候同步到磁盘。对数据来说,这是很重要的参数,它不仅可以影响数据库的性能,还会影响数据库的完整性

Sync_binlog=0 表示在事务提交之后,数据库不会将binlog_cache 中的数据刷到磁盘,而是让文件系统自行决定什么时候来做刷新或者缓存满之后才刷新到磁盘

Sync_binlog=n 表示每进行n次事务提交之后,数据库将进行一次缓存数据强制刷新到磁盘的操作。

该参数默认的设置是0,示例如下:

mysql> show variables like ‘%sync_binlog%‘;

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| sync_binlog   | 0     |

+---------------+-------+

1 row in set (0.14 sec)

mysql>

1.8 记录二进制文件的三种模式

MySQL使用不同的模式记录二进制日志信息,最常见的有三种模式

1.8.1 语句模式

语句模式是MySQL5.6版本模式,简单地说,就是每一条被修改的数据的SQL语句都会记录到master的binlog中,在复制slave库的时候,SQL进程会解析成和原来master端执行过的SQL来再次执行。

该模式的优点是不需要记录细到master的binlog中。在复制slave库的时候,SQL进程会解析成和原来master端执行过的相同的SQL来再次执行

该模式的优点是不需要记录到每一行数据的更改变化,因此,可减少binlog日志量,要少很多,节约磁盘I/O,提高系统性能。

但该模式同样有一些缺点,由于语句模式记录的是执行的SQL语句,所以,对于某些具有特殊功能的SQL语句,就可能导致无法再从库上正确执行,从而导致主从库数据不一致。

例如:当特殊的函数被执行时,当触发器,存储过程等特殊功能被执行时,而row level模式是基于每一行来记录变化的,所以不会出现类似的问题。

1.8.2 行级模式

简单地说,行级模式就是将数据被修改的每一行的情况记录为一条语句。

优点:在行级模式下,binlog中科院不记录执行的SQL语句的上下文相关信息,仅仅记录了哪一条被修改了,修改成什么样了,所以row level的日志内容会非常清楚地记录下每一行数据修改的细节,非常容易理解。而且不会出现某些特定情况下的存储过程或function以及trigger的调用和触发无法被正确复制的内容。

缺点:行级模式下,所有的执行语句都将根据修改的行来记录,而这就可能会产生大量的日志内容,例如一条语句修改了100万行,语句模式就用一条语句即可搞定,而行级模式执行后,日志中记录的就是100万行,语句模式就用一条语句即可搞定,而行级模式之后,日志中记录的就是100万行的修改记录,binlog量可能会大的惊人。

1.8.3 混合模式(mixed-based)

混合模式默认采用语句模式记录日志,会在一些特定情况下会记录模式切换为行级模式记录,这些特殊情况包含不限于有:

当函数中包含UUID()时

当表中有自增列被更新时

当触发器或者等特殊功能时

当FOUND_ROWS(),ROW_COUNT(),USER()CURRENT_USER()CURRENT_USER等执行时

1.9 二进制日志的模式配置调整

临时调整命令如下:

mysql>SET GLOBAL binlog_format=’STATEMENT’;

>SET GLOBAL binlog_format=’ROW’

>SET GLOBAL binlog_format=’MIXED’

永久调整可以直接将‘binlog_format=’模式名’’写入到my.cnf配置文件中并重启服务。

1.10   慢查询日志

1.10.1 慢查询日志介绍

简单地理解,慢查询日志就是记录执行时间超出指定值或其它条件的SQL语句

1.10.2 慢查询日志相关参数说明

慢查询的参数对于数据库SQL的优化非常重要,是SQL优化前提,因此,这里以表的形式说明。

1.10.3 慢查询日志(slow query log)重要参数配置

Slow-query-log=ON                         #慢查询开启开关

Long_query_time =2                         #记录大于2秒的SQL语句

Log_queries_not_using_indexes =ON            #没有使用索引的SQL语句

Slow-query-log-file = /application/mysql/slow.log  #记录SQL语句的文件

Min_examinde_row_limit=800                #记录结果集大于800行的SQL语句

1.10.4 慢查询日志的刷新方法

在工作中,可以利用定时任务按天对慢查询日志进行切割,然后再分析。

示例切割脚本为:

[[email protected]cc666 data]# mkdir /server/scripts/ -p
[[email protected]cc666 data]# cat /server/scripts/cut_slow_log.sh
#!/bin/bash
# Author: cc666
# Organization: www.cc666edu.com
# Created Time : 2017-03-19 23:47:21
export PATH=/application/mysql/bin:/sbin:/bin:/usr/sbin:/usr/bin
cd /application/mysql &&\
mv slow.log slow.log.$(date +%F)&&\
mysqladmin flush-log

1.10.5 使用工具分析慢查询日志案例

实际工作中,慢查询的日志可能非常多,给优化的运维人员带来了一定的困难,MySQL官方提供了慢查询的分析工具mysqldumpslow,有兴趣的读者可以参考官方的4.6.9节“mysqldumpslow”了解该工具的用法

1.安装mysqlsla

请提前下载好mysqlsla-2.03.tar.gz到指定目录下,然后执行如下命令安装。
yum install  perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
tar xf mysqlsla-2.03.tar.gz 
cd mysqlsla-2.03
perl Makefile.PL
make
make install

2.利用mysqlsla工具分析慢查询

Mysqlsla命令默认路径为:/usr/local/bin/mysqlsla

3.安装mysqlsla

3.mysqlsla安装
yum install  perl-devel perl-DBI perl-DBD-MySQL -y
rpm -qa perl-devel perl-DBI perl-DBD-MySQL
wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz
tar xf mysqlsla-2.03.tar.gz 
cd mysqlsla-2.03
perl Makefile.PL
make
make install
mysqlsla命令默认路径为:
[[email protected]cc666 mysqlsla-2.03]# which mysqlsla
/usr/local/bin/mysqlsla

时间: 2024-08-18 13:03:22

mysql日志总结的相关文章

MySQL日志

mysql日志=====默认为数据目录下 1.错误日志(记录错误信息) show variables like '%log%'; log_error = /database/mydata/server1.err   ======默认为数据目录2.访问日志(记录客户端执行的语句)====文本记录 general_log = on general_log_file = /database/mydata/server1.log 3.二进制日志(记录对数据库的操作)===只记录数据改变的命令==upda

如何查询MySql日志

如何查询MySql日志 分类: mysql2012-02-23 19:14 26756人阅读 评论(2) 收藏 举报 mysqlcommandprintingserversocketoutput 今天美国老板发来一封email,一句What happen to ...? 其他任何线索没有,我的给出答案,一一排查,看能否找到问题缘由或是恢复数据,更新问题?程序问题?结果都是没有头绪,最后想了下mysql的日志看能否看看,以前没看过mysql的日志,查查资料,最终皇天不负有心人,搞定了,现在总结下:

何时、怎样开启 MySql 日志?

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

MySQL日志文件与分析

1.查询日志.慢查询日志.二进制日志对比 查询日志 general_log 会记录用户的所有操作,其中包含增删查改等 可以指定输出为表 慢查询日志 slow_log 只要超过定义时间的所有操作语句都记录 可以指定输出为表 二进制日志 log_bin 记录可能执行更改的所有操作 mysqlbinlog查看 2.日志的分析 2.1日志的存储 数据操作过程中,Mysqld是将接收到的语句按照接收的顺序(注意不是执行顺序)写到查询日志文件中.一条一条就类似这样: # Time: 070927 8:08:

MySQL日志审计 帮你揪出内个干坏事儿的小子

MySQL日志审计 帮你揪出内个干坏事的小子 简介 Part1:写在最前 MySQL本身并不像MariaDB和Percona一样提供审计功能,但如果我们想对数据库进行审计,去看是谁把我的数据库数据给删了,该怎么办呢?我们主要利用init-connect参数,让每个登录的用户都记录到我们的数据库中,并抓取其connection_id(),再根据binlog就能够找出谁干了那些破事儿. MariaDB如何审计,可移步: http://suifu.blog.51cto.com/9167728/1857

MySQL 日志

MySQL 日志 ================================================================================ 概述: ================================================================================ MySQL的日志分类: ★查询日志:general_log ★慢查询日志:log_slow_queries ★错误日志:log_error, log_

mysql日志管理

                            学习MYsql日志(一)       错误日志:       服务器启动和关闭过程中的信息 服务器运行过程中产生的错误信息 事件调度器运行一个事件时产生的(event)信息 在从服务器上启动或关闭从服务器进程时产生的信息 警告日志也会产生在错误日志(log_warnings) 一般查询日志: general_log general_log_file log log_output FILE 意思是指定文件中,还有两个值(log_output=

Windows下mysql日志配置

日志文件类型概述:1.错误日志记录启动.运行或停止mysqld时出现的问题.My.ini配置信息:#Enter a name for the error log file.Otherwise a default name will be used.#log-error=d:/mysql_log_err.txt2.查询日志记录建立的客户端连接和执行的语句.My.ini配置信息:#Enter a name for the query log file. Otherwise a default nam

mysql引擎和mysql日志相关总结

mysql日志 01.错误日志: 可以在my.cnf里面配置: [mysqld_safe] log-error=/data/3306/mysql_qb3306.err 02.查询日志 普通查询日志:纪录客户端连接信息和执行的sql语句信息(由于占用内存,作用也不是很大,就一般是关着的) mysql> show variables like 'general_log%'; +------------------+--------------------------+ | Variable_name

MySQL日志系统

body { font-family: Helvetica, arial, sans-serif; font-size: 14px; line-height: 1.6; padding-top: 10px; padding-bottom: 10px; background-color: white; padding: 30px } body>*:first-child { margin-top: 0 !important } body>*:last-child { margin-bottom: