您的当前位置:首页正文

MySQL四种类型日志:Error Log、General Query Log、Binary Log、Slow Query Log

2023-11-12 来源:帮我找美食网

MySQL Server 有四种类型的日志——Error Log、General Query Log、Binary Log 和 Slow Query Log。

第一个是错误日志,记录mysqld的一些错误。第二个是一般查询日志,记录mysqld正在做的事情,比如客户端的连接和断开、来自客户端每条Sql Statement记录信息;如果你想准确知道客户端到底传了什么给服务端,这个日志就非常管用了,不过它非常影响性能。第四个是慢查询日志,记录一些查询比较慢的SQL语句——这种日志非常常用,主要是给开发者调优用的。

剩下的第三种就是binlog了,包含了一些事件,这些事件描述了数据库的改动,如建表、数据改动等,也包括一些潜在改动,比如delete from ran where bing = luan,然而一条数据都没被删掉的这种情况。除非使用Row-based logging,否则会包含所有改动数据的SQL Statement。

那么binlog就有了两个重要的用途——复制和恢复。比如主从表的复制,和备份恢复什么的。

常用的估计就两种:

1、binlog:记录MySQL变更前后的数据(包括insert、update、delete)

2、gennerallorg:记录myql数据库上执行的所有原始SQL语句:(select、insert、update、delete)

 

参考:

http://blog.51cto.com/linuxboys/1605899

https://segmentfault.com/a/1190000003072963(以上内容部分转自此篇文章)

http://www.jb51.net/article/69301.htm

MySQL四种类型日志:Error Log、General Query Log、Binary Log、Slow Query Log

标签:lan   用途   row   服务端   com   ref   ase   包含   包括   

小编还为您整理了以下内容,可能对您也有帮助:

mysql有几种日志格式

mysql 5.5 有以下几种日志:
错误日志(error log): log-err
查询日志(general query log): log
慢查询日志: -log-slow-queries
二进制日志 (binary log): log-bin
中继日志( relay log)
innodb 在线redo 日志
默认情况下,没有启动任何log,可以通过log 选项来启动相关的log

mysql有几种日志格式

mysql 5.5 有以下几种日志:
错误日志(error log): log-err
查询日志(general query log): log
慢查询日志: -log-slow-queries
二进制日志 (binary log): log-bin
中继日志( relay log)
innodb 在线redo 日志
默认情况下,没有启动任何log,可以通过log 选项来启动相关的log

mysql日志文件有什么用

MySQL日志文件可分为:重做日志(redo log)、回滚日志(undo log)、二进制日志(binlog)、错误日志(errorlog)、慢查询日志(slow query log)、一般查询日志(general log)、中继日志(relay log)。下面本篇文章就来给大家简单介绍一下这些MySQL日志文件,希望对你们有所帮助。

1、重做日志(redo log)

重做日志是一种物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。

重做日志可以确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。

2、回滚日志(undo log)

回滚日志是一种逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。

回滚日志保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读

3、二进制日志(binlog)

二进制日志是一种逻辑格式的日志,以二进制文件的形式记录了数据库中的操作,但不记录查询语句。可以简单认为就是执行过的事务中的sql语句;但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。

二进制日志可用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步; 用于数据库的基于时间点的还原。

4、错误日志(errorlog)

错误日志记录着mysqld启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。

5、慢查询日志(slow query log)

慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。

6、一般查询日志(general log)

记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。

7、中继日志(relay log)

中继日志类似二进制;可用于复制架构中,从服务器用于从主服务器中二进制文件取的事件。

说明:

其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

如何查看mysql运行,访问记录等日志

mysql有以下几种日志:  

错误日志:     -log-err  

查询日志:     -log  

慢查询日志:   -log-slow-queries  

更新日志:     -log-update  

二进制日志: -log-bin  


是否启用了日志 

mysql>show variables like 'log_%';


怎样知道当前的日志 

mysql> show master status;


显示二进制日志数目 

mysql> show master logs;


看二进制日志文件用mysqlbinlog 

shell>mysqlbinlog mail-bin.000001


或者

shell>mysqlbinlog mail-bin.000001 | tail


在配置文件中指定log的输出位置. 

Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:Windows 下。

Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下。 

windows下

# 在[mysqld] 中输入  
#log  
log-error="E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/error.log"  
log="E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/mysql.log"  
long_query_time=2  
log-slow-queries= "E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/slowquery.log"

Linux下

# 在[mysqld] 中输入  
#log  
log-error=/usr/local/mysql/log/error.log  
log=/usr/local/mysql/log/mysql.log  
long_query_time=2  
log-slow-queries= /usr/local/mysql/log/slowquery.log

如何查看mysql运行,访问记录等日志

mysql有以下几种日志:  

错误日志:     -log-err  

查询日志:     -log  

慢查询日志:   -log-slow-queries  

更新日志:     -log-update  

二进制日志: -log-bin  


是否启用了日志 

mysql>show variables like 'log_%';


怎样知道当前的日志 

mysql> show master status;


显示二进制日志数目 

mysql> show master logs;


看二进制日志文件用mysqlbinlog 

shell>mysqlbinlog mail-bin.000001


或者

shell>mysqlbinlog mail-bin.000001 | tail


在配置文件中指定log的输出位置. 

Windows:Windows 的配置文件为 my.ini,一般在 MySQL 的安装目录下或者 c:Windows 下。

Linux:Linux 的配置文件为 my.cnf ,一般在 /etc 下。 

windows下

# 在[mysqld] 中输入  
#log  
log-error="E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/error.log"  
log="E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/mysql.log"  
long_query_time=2  
log-slow-queries= "E:/PROGRA~1/EASYPH~1.0B1/mysql/logs/slowquery.log"

Linux下

# 在[mysqld] 中输入  
#log  
log-error=/usr/local/mysql/log/error.log  
log=/usr/local/mysql/log/mysql.log  
long_query_time=2  
log-slow-queries= /usr/local/mysql/log/slowquery.log

mysql内部有4种常见日志,哪种日志是不能直接

1.错误日志 记录启动、运行或停止mysqld时出现的问题
log-error=d:/mysql_log_err.txt
2.查询日志 记录建立的客户端连接和执行的所有语句(包括错误的)。
log=d:/mysql_log.txt
3、二进制日志 记录所有更改数据的语句、还用于主从复制
log-bin=d:/mysql_log_bin
4.慢日志 记录所有执行时间超过long_query_time秒的所有查询
long_query_time =1 #时间
log-slow-queries= d:/mysql_log_slow.txt
注:log-update 更新日志已经被 log-bin 取代了,如果定义了会导致服务不可启动

mysql内部有4种常见日志,哪种日志是不能直接

1.错误日志 记录启动、运行或停止mysqld时出现的问题
log-error=d:/mysql_log_err.txt
2.查询日志 记录建立的客户端连接和执行的所有语句(包括错误的)。
log=d:/mysql_log.txt
3、二进制日志 记录所有更改数据的语句、还用于主从复制
log-bin=d:/mysql_log_bin
4.慢日志 记录所有执行时间超过long_query_time秒的所有查询
long_query_time =1 #时间
log-slow-queries= d:/mysql_log_slow.txt
注:log-update 更新日志已经被 log-bin 取代了,如果定义了会导致服务不可启动

mysql中哪种日志不能直接cat或more

前言

MySQL中有以下日志文件,分别是:

1:重做日志(redo log)

2:回滚日志(undo log)

3:二进制日志(binlog)

4:错误日志(errorlog)

5:慢查询日志(slow query log)

6:一般查询日志(general log)

7:中继日志(relay log)。

其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

一、重做日志(redo log)

作用:

确保事务的持久性。redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启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中。

然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。

每个事务提交时会将重做日志刷新到重做日志文件。

当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。

因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。

这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

二、回滚日志(undo log)

作用:

保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(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文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

其他:

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。

默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。

因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

三、二进制日志(binlog):

作用:

用于复制,在主从复制中,从库利用主库上的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文件来组织。

其他:

二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同

作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。

内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句

另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。

恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的binlog

关于事务提交时,redo log和binlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用binlog进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

四、错误日志
错误日志记录着mysqld启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。
指定日志路径两种方法:
编辑my.cnf 写入 log-error=[path]
通过命令参数错误日志 mysqld_safe –user=mysql –log-error=[path] &

显示错误日志的命令(如下图所示)

五、普通查询日志 general query log 

记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。

查看日志的存放方式:show variables like ‘log_output’;

如果设置mysql> set global log_output=’table’ 的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV
如果设置表数据到文件set global log_output=file;
设置general log的日志文件路径:
set global general_log_file=’/tmp/general.log’;
开启general log: set global general_log=on;
关闭general log: set global general_log=off;

然后在用:show global variables like ‘general_log’

六、慢查询日志
慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。
1. 查看慢查询时间:
show variables like “long_query_time”;默认10s

2. 查看慢查询配置情况:
show status like “%slow_queries%”;

3. 查看慢查询日志路径:
show variables like “%slow%”;

4. 开启慢日志

查看已经开启:

mysql中哪种日志不能直接cat或more

前言

MySQL中有以下日志文件,分别是:

1:重做日志(redo log)

2:回滚日志(undo log)

3:二进制日志(binlog)

4:错误日志(errorlog)

5:慢查询日志(slow query log)

6:一般查询日志(general log)

7:中继日志(relay log)。

其中重做日志和回滚日志与事务操作息息相关,二进制日志也与事务操作有一定的关系,这三种日志,对理解MySQL中的事务操作有着重要的意义。

一、重做日志(redo log)

作用:

确保事务的持久性。redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启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中。

然后会通过以下三种方式将innodb日志缓冲区的日志刷新到磁盘

Master Thread 每秒一次执行刷新Innodb_log_buffer到重做日志文件。

每个事务提交时会将重做日志刷新到重做日志文件。

当重做日志缓存可用空间 少于一半时,重做日志缓存被刷新到重做日志文件

由此可以看出,重做日志通过不止一种方式写入到磁盘,尤其是对于第一种方式,Innodb_log_buffer到重做日志文件是Master Thread线程的定时任务。

因此重做日志的写盘,并不一定是随着事务的提交才写入重做日志文件的,而是随着事务的开始,逐步开始的。

另外引用《MySQL技术内幕 Innodb 存储引擎》(page37)上的原话:

即使某个事务还没有提交,Innodb存储引擎仍然每秒会将重做日志缓存刷新到重做日志文件。

这一点是必须要知道的,因为这可以很好地解释再大的事务的提交(commit)的时间也是很短暂的。

二、回滚日志(undo log)

作用:

保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(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文件

如果undo使用的共享表空间,这个共享表空间中又不仅仅是存储了undo的信息,共享表空间的默认为与MySQL的数据目录下面,其属性由参数innodb_data_file_path配置。

其他:

undo是在事务开始之前保存的被修改数据的一个版本,产生undo日志的时候,同样会伴随类似于保护事务持久化机制的redolog的产生。

默认情况下undo文件是保持在共享表空间的,也即ibdatafile文件中,当数据库中发生一些大的事务性操作的时候,要生成大量的undo信息,全部保存在共享表空间中的。

因此共享表空间可能会变的很大,默认情况下,也就是undo 日志使用共享表空间的时候,被“撑大”的共享表空间是不会也不能自动收缩的。

因此,mysql5.7之后的“独立undo 表空间”的配置就显得很有必要了。

三、二进制日志(binlog):

作用:

用于复制,在主从复制中,从库利用主库上的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文件来组织。

其他:

二进制日志的作用之一是还原数据库的,这与redo log很类似,很多人混淆过,但是两者有本质的不同

作用不同:redo log是保证事务的持久性的,是事务层面的,binlog作为还原的功能,是数据库层面的(当然也可以精确到事务层面的),虽然都有还原的意思,但是其保护数据的层次是不一样的。

内容不同:redo log是物理日志,是数据页面的修改之后的物理记录,binlog是逻辑日志,可以简单认为记录的就是sql语句

另外,两者日志产生的时间,可以释放的时间,在可释放的情况下清理机制,都是完全不同的。

恢复数据时候的效率,基于物理日志的redo log恢复数据的效率要高于语句逻辑日志的binlog

关于事务提交时,redo log和binlog的写入顺序,为了保证主从复制时候的主从一致(当然也包括使用binlog进行基于时间点还原的情况),是要严格一致的,MySQL通过两阶段提交过程来完成事务的一致性的,也即redo log和binlog的一致性的,理论上是先写redo log,再写binlog,两个日志都提交成功(刷入磁盘),事务才算真正的完成。

四、错误日志
错误日志记录着mysqld启动和停止,以及服务器在运行过程中发生的错误的相关信息。在默认情况下,系统记录错误日志的功能是关闭的,错误信息被输出到标准错误输出。
指定日志路径两种方法:
编辑my.cnf 写入 log-error=[path]
通过命令参数错误日志 mysqld_safe –user=mysql –log-error=[path] &

显示错误日志的命令(如下图所示)

五、普通查询日志 general query log 

记录了服务器接收到的每一个查询或是命令,无论这些查询或是命令是否正确甚至是否包含语法错误,general log 都会将其记录下来 ,记录的格式为 {Time ,Id ,Command,Argument }。也正因为mysql服务器需要不断地记录日志,开启General log会产生不小的系统开销。 因此,Mysql默认是把General log关闭的。

查看日志的存放方式:show variables like ‘log_output’;

如果设置mysql> set global log_output=’table’ 的话,则日志结果会记录到名为gengera_log的表中,这表的默认引擎都是CSV
如果设置表数据到文件set global log_output=file;
设置general log的日志文件路径:
set global general_log_file=’/tmp/general.log’;
开启general log: set global general_log=on;
关闭general log: set global general_log=off;

然后在用:show global variables like ‘general_log’

六、慢查询日志
慢日志记录执行时间过长和没有使用索引的查询语句,报错select、update、delete以及insert语句,慢日志只会记录执行成功的语句。
1. 查看慢查询时间:
show variables like “long_query_time”;默认10s

2. 查看慢查询配置情况:
show status like “%slow_queries%”;

3. 查看慢查询日志路径:
show variables like “%slow%”;

4. 开启慢日志

查看已经开启:

今天看了下mysql的日志,不知道这是不是攻击的

2014-09-19 08:08:55 6252 [ERROR] wampmysqld: unknown variable 'default-character-set=utf8'
2014-09-19 08:08:55 6252 [ERROR] Aborting

default-character-set未知变量,在mysql my.ini查找一下

今天看了下mysql的日志,不知道这是不是攻击的

2014-09-19 08:08:55 6252 [ERROR] wampmysqld: unknown variable 'default-character-set=utf8'
2014-09-19 08:08:55 6252 [ERROR] Aborting

default-character-set未知变量,在mysql my.ini查找一下

怎么开启mysql日志功能

1)怎么查看mysql是否启用了日志

mysql>show variables like 'log_bin';

2)怎样知道当前的日志

mysql> show master status;

3)如何查看当前的二进制日志,可以使用mysqlbinlog的的工具,命令如下:

shell>mysqlbinlog mail-bin.000001(要写绝对问题路径 d://)

或者shell>mysqlbinlog mail-bin.000001 | tail

4)mysql有以下几种日志:

错误日志:    

-log-err

查询日志:    

-log

慢查询日志:   

-log-slow-queries

更新日志:     

-log-update

二进制日志: 

-log-bin

在mysql的安装目录下,打开my.ini,在后面加上上面的参数,保存后重启mysql服务就行了。

例如:

#Enter a name for the error

log file.   Otherwise a default

name will be used.

log-error=err.log

#Enter a name for the query

log file. Otherwise a default name will be used.

#log=

#Enter a name for the slow

query log file. Otherwise a default name will be used.

#log-slow-queries=

#Enter a name for the update

log file. Otherwise a default name will be used.

#log-update=

#Enter a name for the binary

log. Otherwise a default name will be used.

#log-bin=

上面只开启了错误日志,要开其他的日志就把前面的“#”去掉。

long_query_time =2--

这里设置慢日志的最大实现是指执行超过多久的sql会被log下来,这里是2秒

log-slow-queries=slowqueris.log --将查询返回较慢的语句进行记录,这里设置慢日志的名称

log-queries-not-using-indexes

= nouseindex.log --就是字面意思,log下来没有使用索引的query

5)下面是配置日志的几种方式,不一定全都要配置,请根据自身需求选择性配置

log=mylog.log

--对所有执行语句进行记录

log-error=log-error.log

log=log-query.log

log-queries-not-using-indexes

log-warnings=2

log-slow-queries=log-slow-query.log

log-update=log-update.log

long_query_time=2

MySQL8.0错误日志Error log

错误日志包含mysqld启动和关闭的时间信息,还包含诊断消息,如服务器启动和关闭期间以及服务器运行时出现的错误、警告和其他需要注意的信息。例如:如果mysqld检测到某个表需要检查或修复,会写入错误日志。

根据错误日志配置,错误消息还可能填充performance_schema.error_log表,以便为日志提供SQL接口,使错误日志能够查询。

如果用mysqld_safe启动mysqld,mysqld_safe会将消息写入错误日志。例如,当mysqld_safe注意到mysqld异常退出时,它会重新启动mysqld,并将mysqld重新启动的消息写入错误日志。

在MySQL 8.0中,错误日志使用MySQL组件(component) 架构。错误日志系统由执行日志事件过滤和写出组件以及系统变量组成,该系统变量配置启用哪些组件来实现所需的日志记录。

基于组件的错误日志记录提供了以下功能:

log_error_services系统变量控制为错误记录启用哪些日志组件。多个组件用逗号或分号分隔,日志系统按照此顺序依次执行。组件分过滤filter和写出sink两类。filter类组件过滤错误日志信息,sink类组件将错误日志写到不同的位置。

过滤器组件 过滤依据 相关系统变量 log_filter_internal 错误事件的优先级及错误代码 log_error_verbosity

log_error_suppression_list log_filter_dragnet 用户定义的规则 dragnet.log_error_filter_rules

系统变量log_error指定错误日志的缺省目的地,日志组件根据该系统变量决定自己的日志输出目的地。

sink类日志组件 log_error值 目的地 log_sink_internal(缺省) file_name file_name log_sink_internal stderr 控制台 log_sink_json stderr 控制台 log_sink_json file_name file_name .00.json

file_name .01.json log_sink_test stderr 控制台 log_sink_test file_name file_name log_sink_syseventlog stderr 系统日志 log_sink_syseventlog file_name 系统日志

安装sink组件log_sink_json,修改log_error_services参数增加log_sink_json写出组件。

目标:配置log_sink_internal组件只记录ERROR类信息。

方法:修改启动参数文件,调整log_error_verbosity参数。

目标:配置log_sink_internal记录ERROR, WARNING, INFORMATION类错误,将 WARNING, INFORMATION中错误号MY-010001,MY-10002过滤掉。

方法:修改启动参数文件,调整log_error_verbosity和log_error_suppression_list参数

目标:配置过滤器,按照用户定义的规则过滤错误日志信息。

方法:使用log_filter_dragnet,配置变量dragnet.log_error_filter_rules添加过滤规则。

目标:将MySQL的错误日志写入Linux系统日志。

方法:使用log_sink_syseventlog组件,将错误日志写入Linux系统日志。

目标:保留原错误日志,让MySQL开始一个新的错误日志。

方法:使用FLUSH ERROR LOGS 或 FLUSH LOGS 或 mysqladmin flush-logs都可以关闭错误日志,然后重新创建错误日志,在此之前应该手工将错误日志改名或备份。

Top