MySQL日志文件能够帮助咱们程序员对MySQL数据库的运行状态进行诊断,从而更好的进行数据库层面及代码层面的优化,我说说我所了解的一些MySQL日志文件。mysql
错误日志文件对MySQL的启动、运行、关闭过程都进行了记录,它不只记录了全部的错误信息,也记录了一些警告信息和正确的信息。它能过很好的帮助咱们定位问题。程序员
咱们经过命令SHOW VARIABLES LIKE 'log_error'
命令找到该文件的路径和文件名(如下所有使用个人本机MySQL为例)面试
在默认状况下错误文件的文件名为服务器的主机名。这是我本身的笔记本上面的MySQL。sql
在面试的常常被问到sql优化,能够聊聊慢查询日志。(在默认状况下不会开启慢查询日志)开启慢查询日志后,MySQL会将运行时间超过long_query_time所设置的参数(默认为10)的全部sql语句都记录到慢查询日志文件中去。数据库
(1)使用set global slow_query_log=1
开启了慢查询日志只对当前数据库生效,若是MySQL重启后则会失效。若是要永久生效,就必须修改配置文件。缓存
(2)能够经过命令SHOW VARIABLES LIKE 'slow_query_log'
来查看是否开启,个人已经开启了。(以下图)服务器
(3)能够经过命令SHOW VARIABLES LIKE 'long_query_time'
来查看这个时间阈值(以下图)。set global long_query_time=1
命令设置阈值为1s。并发
(4)能够经过命令SHOW VARIABLES LIKE 'slow_query_log_file'
来查看慢查询日志位置。测试
(5)用本机测试:首先将阈值设置为1,执行sql语句SELECT * FROM test;
用了1s多,而后查询慢查询文件已经产生了该条记录(以下图) 优化
(6)还有两个和慢查询日志有关的比较重要的参数。一个是log_queries_not_using_indexes
,意为若是运行的sql语句没有使用索引,则数据库一样会将这条sql记录到慢查询日志里面去;另外一个是log_throttle_queries_not_using_indexes
,意为每分钟运行记录到slow log的且未使用索引的sql语句的次数。具体用法和上面相似,首先要开启相关功能,具体再也不赘述。
后面随着sql的增多,不可能慢慢查看日志,而这时MySQL提供了mysqldumpslow命令,能够很好的帮助咱们解决问题,具体的用法请问度娘。
注意:MySQL数据库会记录运行时间超过阈值的全部sql语句,可是运行时间正好等于long_query_time的状况是不会被记录下。
查询日志记录了全部对MySQL数据库的请求信息,无论这些请求是否获得了正确的执行。默认状况下,通用查询日志不会被启用,须要本身在配置文件设置,我如今经过命令set global general_log=on;
进行启用查询日志(以下图)。
用本机测试:首先使用了一些查询语句,发现这些正常的请求,是能够看到日志的。又故意输入错误密码链接MySQL,发现查询日志甚至记录了对Access denied的请求(以下图)。
二进制文件记录了对MySQL数据库执行更改的全部操做,可是不包括对数据自己没有进行修改的操做,如select和show这类操做。虽然如此,可是二进制文件仍是有许多其余重要的做用。 恢复:某些数据的恢复须要二进制文件; 复制:其原理相似于恢复,经过复制和执行二进制日志使一台远程的MySQL数据库与另外一台MySQL数据库进行实时同步(MySQL主从同步); 审计:用户能够经过二进制日志中的信息来进行审计,判断是否有对数据库进行注入的攻击。
二进制日志文件在默认状况下并无启动,须要咱们本身配置,经过配置参数log-bin[=name]能够启动二进制日志。(下面所有以个人线上应用为例,线上为mysql主从配置)输入show slave status
命令能够看到以下信息(以下图)mysql-bin.000001即为二进制日志文件。
一些重要的配置文件的参数: (1)max_binlog_size:单个二进制日志文件的最大值,若是超过了该值,则生成一个新的二进制日志文件。输入show VARIABLES like 'max_binlog_size'
命令,能够看出个人配置为默认1G(以下图)
(2)binlog_cache_size:当使用事务的表存储引擎时,全部未提交的二进制日志会被记录到一个缓存中去,等该事务提交时才将缓存中的二进制日志写入二进制日志文件中,而该缓存的大小则由该参数决定。输入show VARIABLES like 'binlog_cache_size'
命令,能够看出个人配置为默认32k(以下图)。那有人会问为何只有这么小呢?那是由于该参数是基于会话的,当一个线程开启一个事务的时候,MySQL会自动分配该参数大小的缓存,若是设置过大,你懂的!
(3)sync_binlog:表示每写缓存多少次就同步到磁盘里面去。输入show VARIABLES like 'sync_binlog'
命令,能够看出个人是采用同步写磁盘的方式来写二进制日志(以下图)
(4)binlog-do-db、binlog-ignore-db:分别表示须要写入或者忽略写入哪些库的日志,默认是空的,表示须要同步全部库的日志到二进制日志中去,个人默认也是空的。
(5)log-slave-update:若是当前数据库是复制中的slave角色,它是不会从master取得并去执行二进制日志写入到本身的二进制文件中去。若是要写,则须要设置log-slave-update,由于我本身的应用配置是采用一主一从的,因此执行show VARIABLES like 'log-slave-update'
命令后,是没有值的(以下图)
(6)binlog_format:该参数影响了记录二进制日志的格式。其有三值,分别为STATEMENT、ROW、MIXED。 STATEMENT:记录的是日志的逻辑sql语句。 ROW:记录表的行更改状况。 MIXED:会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在STATEMENT和ROW之间选择一种。个人配置就采用这个。
注意:①若是设置了ROW,能够将InnoDB的事务隔离级别设置为Read-Committed,以得到更好的并发行;②bing_format参数是有存储引擎的限制,具体的请问度娘;③ROW所产生的二进制文件会比STATEMENT大。
若有描述不对的地方,望指正!