如何在MySql中记录SQL日志记录
发布时间:2025-05-18 04:29:13 发布人:远客网络
一、如何在MySql中记录SQL日志记录
错误日志在Mysql数据库中很重要,它记录着mysqld启动和停止,以及服务器在运行过程中发生的任何错误的相关信息。
--log-error=[file-name]用来指定错误日志存放的位置。
如果没有指定[file-name],默认hostname.err做为文件名,默认存放在DATADIR目录中。
也可以将log-error配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log-error.例如:
log-error=/var/lib/mysql/test2_mysqld.err
080313 05:21:55 mysqld started
080313 5:21:55 InnoDB: Started; log sequence number 0 43655
080313 5:21:55 [Note]/usr/local/mysql/bin/mysqld: ready for connections.
Version:'5.0.26-standard-log' socket:'/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition- Standard(GPL)
080313 5:24:13 [Note]/usr/local/mysql/bin/mysqld: Normal shutdown
080313 5:24:13 InnoDB: Starting shutdown...
080313 5:24:16 InnoDB: Shutdown completed; log sequence number 0 43655
080313 5:24:16 [Note]/usr/local/mysql/bin/mysqld: Shutdown complete
080313 05:24:47 mysqld started
080313 5:24:47 InnoDB: Started; log sequence number 0 43655
080313 5:24:47 [Note]/usr/local/mysql/bin/mysqld: ready for connections.
Version:'5.0.26-standard-log' socket:'/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Edition- Standard(GPL)
080313 5:33:49 [Note]/usr/local/mysql/bin/mysqld: Normal shutdown
查询日志记录了clinet的所有的语句。
Note:由于log日志记录了数据库所有操作,对于访问频繁的系统,此种日志会造成性能影响,建议关闭。
--log=[file-name]用来指定错误日志存放的位置。
如果没有指定[file-name],默认为主机名(hostname)做为文件名,默认存放在DATADIR目录中。
也可以将log配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log.例如:
log=/var/lib/mysql/query_log.log
查询日志是纯文本格可,可以使用OS文本读取工具直接打开查看。例如:
[mysql@test2]$ tail-n 15 query_log.log
080313 7:58:28 17 Query show tables
080313 10:01:48 18 Connect root@localhost on
080313 10:02:38 18 Query SELECT DATABASE()
080313 10:02:42 18 Query show tables
080313 10:03:07 18 Query select* from pet
080313 10:06:26 18 Query insert into pet values('hunter','yxyup','cat','f','1996-04-29',null)
080313 10:06:39 18 Query select* from pet
080313 10:07:13 18 Query update pet set sex='m' where name='hunter'
080313 10:07:38 18 Query delete from pet where name='hunter'
080313 10:13:48 18 Query desc test8
080313 10:14:13 18 Query create table t1(id int,name char(10))
080313 10:14:41 18 Query alter table t1 add sex char(2)
慢查询日志是记录了执行时间超过参数long_query_time(单位是秒)所设定值的SQL语句日志。
Note:慢查询日志对于我们发现性能有问题的SQL有很帮助,建议使用并经常分析
--log-slow-queries=[file-name]用来指定错误日志存放的位置。
如果没有指定[file-name],默认为hostname-slow.log做为文件名,默认存放在DATADIR目录中。
也可以将log-slow-queries配置到my.cnf文件中,这样就省去了每次在启动mysqld时都手工指定--log-slow-queries.例如:
log-slow-queries=/var/lib/mysql/slow_query_log.log
[mysql@test2]$ cat slow_query_log.log
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket:/var/lib/mysql/mysql.sock
# User@Host: root[root]@ localhost []
# Query_time: 108 Lock_time: 0 Rows_sent: 0 Rows_examined: 8738
select count(1) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name;
# User@Host: root[root]@ localhost []
# Query_time: 583 Lock_time: 0 Rows_sent: 0 Rows_examined: 508521177
select count(1) from t1 a, t1 b where a.id=b.id;
/usr/local/mysql/bin/mysqld, Version: 5.0.26-standard-log. started with:
Tcp port: 3306 Unix socket:/var/lib/mysql/mysql.sock
# User@Host: root[root]@ localhost []
# Query_time: 11 Lock_time: 0 Rows_sent: 4537467 Rows_examined: 4537467
如果慢查询日志记录很多可以使用mysqldumpslow进行分类汇总
[mysql@test2]$ mysqldumpslow slow_query_log.log
Reading mysql slow query log from slow_query_log.log
Count: 1 Time=583.00s(583s) Lock=0.00s(0s) Rows=0.0(0), root[root]@localhost
select count(N) from t1 a, t1 b where a.id=b.id
Count: 1 Time=108.00s(108s) Lock=0.00s(0s) Rows=0.0(0), root[root]@localhost
select count(N) from t1 a, t1 b,t1 c where a.id=b.id and b.name=c.name
Count: 1 Time=11.00s(11s) Lock=0.00s(0s) Rows=4537467.0(4537467), root[root]@localhost
在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。
#Enter a name for the binary log. Otherwise a default name will be used.
#Enter a name for the query log file. Otherwise a default name will be used.
#Enter a name for the error log file. Otherwise a default name will be used.
#Enter a name for the update log file. Otherwise a default name will be used.
mysql>show variables like'log_bin';
那日志文件就在mysql的安装目录的data目录下
3.查看从某一段时间到某一段时间的日志
mysqlbinlog--start-datetime='2008-01-19 00:00:00'
--stop-datetime='2008-01-30 00:00:00'/var/log/mysql/mysql-bin.000006
二、mysql的几种日志记录
防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。
默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2
innodb_log_group_home_dir指定日志文件组所在的路径,默认./,表示在数据库的数据目录下。
innodb_log_files_in_group指定重做日志文件组中文件的数量,默认2
关于文件的大小和数量,由一下两个参数配置:
innodb_log_file_size重做日志文件的大小。
innodb_mirrored_log_groups指定了日志镜像文件组的数量,默认1
很重要一点,redo log是什么时候写盘的?前面说了是在事物开始之后逐步写盘的。
之所以说重做日志是在事务开始之后逐步写入重做日志文件,而不一定是事务提交才写入重做日志缓存,
原因就是,重做日志有一个缓存区Innodb_log_buffer,Innodb_log_buffer的默认大小为8M(这里设置的16M),Innodb存储引擎先将重做日志写入innodb_log_buffer中。
保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。
事务开始之前,将当前是的版本生成undo log,undo也会产生 redo来保证undo log的可靠性
当事务提交之后,undo log并不能立马被删除,
而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。
MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数
如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。
关于MySQL5.7之后的独立undo表空间配置参数如下
innodb_undo_directory=/data/undospace/--undo独立表空间的存放目录
innodb_undo_logs= 128--回滚段为128KB
innodb_undo_tablespaces= 4--指定有4个undo log文件
用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
用于数据库的基于时间点的还原。
逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。
但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。
在使用mysqlbinlog解析binlog之后一些都会真相大白。
因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。
事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。
这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。
因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。
这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。
binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。
配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。
对于每个binlog日志文件,通过一个统一的index文件来组织。
慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。
show variables like“long_query_time”;默认10s
show variables like“%slow%”;
标签:basename逻辑最大的指定bin判断purgeselectredo
三、MySQL日志问题为什么MySQL不生成日志mysql不生成日志
MySQL日志问题:为什么MySQL不生成日志?
MySQL是一种流行的开源关系型数据库管理系统,在数据库运维中扮演着重要的角色。MySQL提供了多个不同类型的日志,如二进制日志、错误日志、慢查询日志等,但有时候会遇到MySQL不生成日志的问题,这会导致查询问题的跟踪变得困难,使问题排查变得更加困难。那么,为什么MySQL会出现不生成日志的情况呢?本文将对此进行探讨。
在分析MySQL不生成日志问题之前,让我们首先了解MySQL日志的作用。MySQL日志是记录数据库操作过程的信息和各种事件的日志,主要包括:
*错误日志:用于记录数据库的错误日志;
*二进制日志:用于记录所有的数据库更改操作,包括INSERT、UPDATE和DELETE等;
*事务日志:用于记录提交的事务,以及回滚的事务;
*慢查询日志:用于记录执行时间超过阈值的查询;
*查询日志:用于记录MySQL服务器接收到的所有请求,以及服务器的响应。
通过MySQL日志,可以方便地追踪问题,了解数据库的运行情况,对于优化数据库性能以及排除故障非常有帮助。
那么,为什么MySQL不生成日志呢?原因可能有以下几点:
在MySQL中,日志开关默认是关闭的。如果没有打开日志开关,那么MySQL就不会生成任何日志。要检查和打开MySQL日志开关,可以编辑MySQL配置文件 my.cnf或 my.ini,按照需求滚动找到下面的行:
slow_query_log=1#慢查询日志开关
long_query_time=2#慢查询日志记录阈值
如果日志开关被注释了或者关闭了,MySQL就不会生成任何日志。
当MySQL日志的目录没有足够的权限时,MySQL就无法写入日志文件。要检查权限,可以使用以下命令:
sudo chown-R mysql:mysql/var/log/mysql
sudo chmod-R 755/var/log/mysql
如果你没有足够的权限,可以使用以上命令进行更改。
不同版本的MySQL可能有不同的日志设置方法和参数,因此在不同版本的MySQL中可能会出现不生成日志的问题。在进行MySQL升级之前,需要检查是否需要更新日志设置。
MySQL会在开启日志功能时生成日志文件,当日志文件达到最大值时,MySQL会停止继续写入该日志文件。如果MySQL没有将日志文件自动清理,则无法继续写入日志文件。在这种情况下,你可以手动清理日志文件。
针对MySQL不生成日志问题,可以采取以下解决方案:
检查 MySQL的配置文件是否正确,并找到并打开日志开关,确保日志文件正常生成。
检查 MySQL日志文件目录的权限是否正确,MySQL可以写入所需的日志文件。
如果 MySQL版本较旧,则可能需要更新 MySQL版本。在更新版本之前,请查看版本升级步骤和日志设置方法,以确保日志功能可以正确使用。
如果 MySQL不再生成新的日志文件,则可以尝试手动删除日志文件。请注意,在删除日志文件时,请小心,不要删除任何正在使用的日志文件。
MySQL是广泛使用的关系型数据库管理系统,日志功能对于快速排除问题以及优化性能非常有帮助。但是,当 MySQL不生成日志时,会给故障排除带来极大的困难。在本文中,我们了解到了 MySQL日志的作用,以及不生成日志的原因,为排除 MySQL日志问题提供了解决方法。在数据库维护过程中,应注重监控 MySQL日志文件,确保 MySQL运行正常。