MySQL日志详解(未完待续)

前言

MySQL日志记录了MySQL数据库平常操做和错误信息。MySQL有不一样类型的日志文件(各自存储了不一样类型的日志),从日志当中能够查询到MySQL数据库的运行状况、用户的操做、错误的信息等。mysql

MySQL的日志分为如下四大类:sql

  • 错误日志:记录mysql服务的启动,运行或中止mysql服务时出现的问题;
  • 查询日志:记录创建的客户端的链接和执行的语句;
  • 二进制日志:记录全部更改数据的语句,能够用于数据的复制;
  • 慢查询日志:记录全部执行的时间超过long_query_time的全部查询或不使用索引的查询。

默认状况下,全部日志建立于MySQL数据目录中,经过刷新日志,能够强制MySQL关闭和从新打开日志文件,Flush logs刷新日志或者执行mysqladmin flush-logs 若是正使用MySQL复制功能,在复制服务器上能够维护更多日志文件,这种日志咱们称为接替日志。启动日志功能会下降MySQL数据库的性能。数据库

1)查看系统设置

<!--查看全局的系统状态-->
mysql> show global variables\G
mysql> show global variables like '%log%';
<!--查看当前会话的系统状态-->
mysql> show session variables\G
mysql> show session variables like '%log%';

若要修改上面查看出来的参数,能够在MySQL的主配置文件中的mysqld字段中写入便可,如:binlog_cache_size = 1M。又或者能够在MySQL数据库中进行临时修改:set global binlog_cache_size = 1048576,这种临时修改在MySQL重启后就会失效。vim

2)查看运行状态

<!--查看全局的运行状态-->
mysql> show global status\G
<!--查看当前会话的运行状态-->
mysql> show session status;
<!--查看MySQL的版本-->
[root@mysql ~]# mysql -V
mysql> status;
mysql> select version();

一、错误日志

在mysql数据库中,错误日志功能是默认开启的。默认状况下,错误日志存储在mysql数据库的数据目录中。错误日志文件一般的名称为hostname.err。其中,hostname表示服务器主机名。 错误日志信息能够本身进行配置的,错误日志所记录的信息是能够经过log-error和log-warnings来定义的,其中log-error是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认状况下错误日志大概记录如下几个方面的信息:服务器启动和关闭过程当中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化本身的存储引擎的等等)、服务器运行过程当中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息,MySQL有不少系统变量能够设置,系统变量设置不一样,会致使系统运行状态的不一样。所以mysql提供两组命令,分别查看系统设置和运行状态。缓存

通常而言,日志级别的定义没有会话变量都只是在全局级别下定义错误日志的状态:安全

mysql> show global variables like '%log_error%';
+---------------------+----------------------------------+
| Variable_name       | Value                            |
+---------------------+----------------------------------+
| binlog_error_action | ABORT_SERVER                     |
| log_error           | /usr/local/mysql/data/mysqld.err |
| log_error_verbosity | 3                                |
+---------------------+----------------------------------+
3 rows in set (0.01 sec)

其中 log_error定义为错误日志文件路径 ,log_error_verbosity值得含义以下:服务器

Verbosity Message
1 Error only
2 Error and warnings
3 Errors, warnings,and notes(default)

错误日志的存放路径在my.cnf的主配置文件中指定,以下:session

MySQL日志详解(未完待续)

为了方便维护须要,有时候会但愿将错误日志中的内容作备份并从新开始记录,这时候就能够利用MySQL 的FLUSH LOGS 命令来告诉MySQL 备份旧日志文件并生成新的日志文件。备份文件名以“.old”结尾。并发

删除错误日志
在mysql5.5.7以前:数据库管理员能够删除很长时间以前的错误日志,以保证mysql服务器上的硬盘空间。mysql数据库中,可使用mysqladmin命令开启新的错误日志。mysqladmin命令的语法以下:mysqladmin –u root –p flush-logs也能够登陆mysql数据库中使用FLUSH LOGS语句来开启新的错误日志。 在mysql5.5.7以后:服务器将关闭此项功能。只能使用重命名原来的错误日志文件,手动冲洗日志建立一个新的,方式以下:socket

[root@mysql ~]# cd /usr/local/mysql/data/
[root@mysql data]# mv mysqld.err{,.old}
[root@mysql data]# mysqladmin -uroot -p flush-logs
Enter password:

二、二进制日志

二进制日志主要记录MySQL数据库的变化,二进制日志以一种有效的格式,而且是事务安全的方式包含更新日志中可用的信息。二进制日志包含了全部更新了数据或者已经潜在更新了数据。还包含关于每一个更新数据库的语句的执行时间,它不包含没有修改任何数据的语句。使用二进制日志的主要目的是最大可能地恢复数据库。

1)启动二进制日志(默认状况下二进制日志是关闭的)

[root@mysql data]# vim /etc/my.cnf      #编辑主配置文件

[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
port=3306
server_id=1
socket=/usr/local/mysql/mysql.sock
log-error=/usr/local/mysql/data/mysqld.err
log-bin=/usr/local/mysql/data/binary_log      #指定二进制日志的路径及名称
expire_logs_days=10         #清除日志的天数
max_binlog_size=100M      #单个日志文件的大小限制,超出会新建一个日志文件
[root@mysql data]# systemctl restart mysqld      #重启MySQL使配置生效
[root@mysql data]# ll | grep binary         #会在指定的路径下生成如下两个文件
-rw-r----- 1 mysql mysql      154 12月 30 20:59 binary_log.000001
-rw-r----- 1 mysql mysql       40 12月 30 20:59 binary_log.index

登陆到数据库中也能够查看到,以下:

MySQL日志详解(未完待续)

2)查看二进制日志

MySQL二进制日志存储了全部的变动信息,MySQL二进制日志常用。当MySQL建立二进制日志文件时,首先建立一个以’filename’为名称,以’.index’为后缀的文件;在建立一个以’filename’为名称,以’.000001’为后缀的文件。当MySQL服务重启一次,以’.000001’为后缀的文件会增长一个,而且后缀名加1
递增。若是日志长度超过max_binlog_size的上限,也会建立一个新的日志。 Show binary logs;能够查看当前的二进制日志文件个数及其文件名。二进制日志并不能直接查看,若是想要查看日志内容,

能够经过mysqlbinlog命令查看:

mysql> show binary logs;             <!---->
+-------------------+-----------+
| Log_name          | File_size |
+-------------------+-----------+
| binary_log.000001 |       154 |
+-------------------+-----------+
1 row in set (0.00 sec)

也能够退出MySQL在命令行使用mysqlbinlog命令查看:

[root@mysql data]# mysqlbinlog binary_log.000001

3)删除二进制日志

MySQL的二进制文件能够配置自动删除,同时MySQL提供了手动删除二进制文件的方法:
RESET MASTER:删除全部的二进制日志文件;
PURGE MASTER LOGS:只删除部分二进制日志文件;
Reset master:删除全部二进制日志 ;
Purge master logs to ‘二进制名’ :删除单个二进制日志以前的。

mysql> purge master logs to "binary_log.000003";   <!--删除...03以前的二进制日志文件-->
mysql> purge master logs before '20180101';    <!--删除2018-01-01以前的日志文件-->

4)经过二进制日志还原MySQL数据

关于经过二进制日志还原的具体过程,仍是参考我以前的博文吧!以下:
MySQL的备份与恢复详解

三、事务日志

事务日志(InnoDB特有的日志,由于只有Innodb支持事务)能够帮助提升事务的效率。使用事务日志,存储引擎在修改表的数据时只须要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据自己持久到磁盘。事务日志采用追加的方式,所以写日志的操做是磁盘上一小块区域内的顺序I/O,而不像随机I/O须要在磁盘的多个地方移动磁头,因此采用事务日志的方式相对来讲要快得多。事务日志持久之后,内存中被修改的数据在后台能够慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的。 若是数据的修改已经记录到事务日志并持久化,但数据自己尚未写回磁盘,此时系统崩溃,存储引擎在重启时可以自动恢复这部分修改的数据。具备的恢复方式则视存储引擎而定。

1)查看事务日志的定义

mysql> show global variables like 'innodb_lo%';

在上述指令输出的部份内容解释以下:

| innodb_flush_log_at_trx_commit | 1 #在事务提交时innodb是否同步日志从缓冲区到文件
中,当这个值为1(默认值)之时,在每一个事务提交时,日志缓冲被写到日志文件,对日志文件作到磁盘操做的刷新,性能会不好形成大量的磁盘I/O但这种方式最安全;若是设为2,每次提交事务都会写日志,但并不会执行刷的操做。每秒定时会刷到日志文件。要注意的是,并不能保证100%每秒必定都会刷到磁盘,这要取决于进程的调度。每次事务提交的时候将数据写入事务日志,而这里的写入仅是调用了文件系统的写入操做,而文件系统是有缓存的,因此这个写入并不能保证数据已经写入到物理磁盘。设置为0,日志缓冲每秒一次地被写到日志文件,而且对日志文件作到磁盘操做的刷新,可是在一个事务提交不作任何操做。
注:刷写的概念
刷写实际上是两个操做,刷(flush)和写(write),区分这两个概念是很重要的。在大多数的操做系统中,把Innodb的log buffer(内存)写入日志(调用系统调用write),只是简单的把数据移到操做系统缓存中,操做系统缓存一样指的是内存。并无实际的持久化数据。

因此,一般设为0和2的时候,在崩溃或断电的时候会丢失最后一秒的数据,由于这个时候数据只是存在于操做系统缓存。之因此说“一般”,可能会有丢失不仅1秒的数据的状况,好比说执行flush操做的时候阻塞了。
总结
设为1固然是最安全的,但性能页是最差的(相对其余两个参数而言,但不是不能接受)。若是对数据一致性和完整性要求不高,彻底能够设为2,若是只最求性能,例如高并发写的日志服务器,设为0来得到更高性能。

innodb_locks_unsafe_for_binlog OFF
innodb_log_buffer_size 16777216
innodb_log_checksums ON
innodb_log_compressed_pages ON
innodb_log_file_size 50331648 #日志文件大小
innodb_log_files_in_group 2 # DB中设置几组事务日志,默认是2
innodb_log_group_home_dir ./ #定义innodb事务日志组的位置,此位置设置默认为MySQL的datadir 。

每一个事务日志都是大小为50兆的文件(不一样版本的mysql有差别): 在mysql中默认以ib_logfile0,ib_logfile1名称存在。

<!---->

相关文章
相关标签/搜索