日志类型
Mysql日志主要包含:错误日志、查询日志、慢查询日志、事物日志、二进制日志;
日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
错误日志
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。
错误日志可以使用log_err在主配置文件中手动设置
在my.cnf中
[mysqld_safe]
log_error=/usr/local/mysql/xxx.err(名字可以自己指定否则默认为主机名)修改完需要重启mysql生效。
mysql> show global variables like ‘%log%’;
log_error可以直接定义为文件路径,也可以为ON|OFF;log_warings只能使用1|0来定义开关启动。
在mysql数据库中,可以使用mysqladmin命令开启错误日志。
#mysqladmin -uroot –p flush-logs
或者进入mysql后使用语句
mysql> flush logs;
二进制日志
二进制日志也叫作变更日志,主要用于记录修改数据或有可能引起数据改变的mysql语句,并且记录了语句发生时间、执行时长、操作的数据等等。所以说通过二进制日志可以查询mysql数据库中进行了哪些变化。一般大小体积上限为1G。
查看二进制日志开启状态:
mysql> show global variables like “%log_bin%”;
其中log_bin可以直接定义为文件路径也可以定义为ON|OFF。
开启二进制日志:
在my.cnf配置文件中【mysqld】中添加
[mysqld]
Log-bin=存放路径/名称
log-bin=/usr/local/mysql/data/mysql-bin.log
之后重启mysql即可。
Mysql中查看二进制日志:
mysql> show binary logs;
因为二进制日志是以二进制方式存储的,不能直接读取,需要使用mysql自带的mysqlbinlog工具来进行查看。
#mysqlbinlog mysql-bin.000001 –d test2
对应的一些参数说明:
默认其形式为filename.number,number的形式为000001、000002等。每次重启mysql服务或运行mysql> flush logs;都会生成一个新的二进制日志文件,这些日志文件的number会不断地递增。除了生成上述的文件外还会生成一个名为filename.index的文件。这个文件中存储所有二进制日志文件的清单又称为二进制文件的索引。
设置日志过期时间:
在配置文件中my.cnf
expire_log_day=10
10的单位是天,这里表示保存10天的日志,超过10天日志会被自动删除。
恢复数据:
完全恢复:
Mysqlbinlog mysql-bin.0001|mysql –uroot –p
但是如果是误删除了一张表,使用完全恢复是没有用的,因为日志里面同样也保留着删除的sql语句,所以我们要恢复到误操作之前的状态,然后跳过操作的语句即可。
假设18:48误删除了一张表,这样恢复它:
mysqlbinlog --stop-date=‘2017-11-30 18:47:59’ mysql-bin.000001|mysql -uroot –p
跳过误删除的时间点,之后再执行:
mysqlbinlog --start-date=‘2017-11-30 18:49:00’ mysql-bin.000001|mysql -uroot –p
有时有可能因为系统版本的问题,以上方法行不通,可以将二进制导出到一个sql文件中,再直接根据sql语句进行恢复,这样导出后log.sql就有sql语句,把语句复制到工具或者phpmyadmin里执行。
Mysqlbinlog mysql-bin-log.000001 >log.sql
查询日志
通用查询日志
默认情况下查询日志是关闭的。由于查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响mysql的性能的。如若不是为了调试数据库的目的建议不要开启查询日志。
查看查询日志是否开启:
mysql> show global variables like ‘%log%’;
慢查询日志
慢查询日志是用来记录执行时间超过指定时间的查询语句。通过慢查询日志,可以查找出哪些查询语句的执行效率很低,以便进行优化。一般建议开启,它对服务器性能的影响微乎其微,但是可以记录mysql服务器上执行了很长时间的查询语句。可以帮助我们定位性能问题的。
慢查询日志是以什么时间为标准的?
一般都是通过long_query_time选项来设置这个时间值,时间以秒为单位,可以精确到微秒。如果查询时间超过了这个时间值(默认为10秒),这个查询语句将被记录到慢查询日志中。
查看服务器默认时间值
mysql> show global variables like ‘long%’;
查询log:
mysql> show global variables like ‘%log%’;
#vi ./my.cnf
[mysqld]
Slow_query_log=1
log_slow_queries=/usr/local/mysql/data/xxx-slow.log
或者在数据库中直接定义开启:
mysql>set global slow_query_log=1;
更改时间:
mysql> set session long_query_time=0.01;
查看时间是否更改:
mysql> show variables like ‘long%’;
查看慢查询日志开启状态:
mysql> show global variables like ‘%slow%’;
事务日志:
事务日志(InnoDB特有的日志)可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,我们通常称之为预写式日志,修改数据需要写两次磁盘。
如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。具有的恢复方式则视存储引擎而定。
小结:mysql数据库各种日志必须熟悉,在以后的工作中非常重要。