前言
MySQL 日志记录了 MySQL 数据库日常操作和错误信息. MySQL 有不同类型的日志文件(各自存储了不同类型的日志), 从日志当中可以查询到 MySQL 数据库的运行情况, 用户的操作, 错误的信息等.
MySQL 的日志分为以下四大类:
错误日志: 记录 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 重启后就会失效.
2)查看运行状态
- <!-- 查看全局的运行状态 -->
- MySQL> show global status\G
- <!-- 查看当前会话的运行状态 -->
- MySQL> show session status;
- <!-- 查看 MySQL 的版本 -->
- [[email protected] ~]# MySQL -V MySQL> status; MySQL> select version();
1, 错误日志
在 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 的主配置文件中指定, 如下:
为了方便维护需要, 有时候会希望将错误日志中的内容做备份并重新开始记录, 这时候就可以利用 MySQL 的 FLUSH LOGS 命令来告诉 MySQL 备份旧日志文件并生成新的日志文件. 备份文件名以 ".old" 结尾.
删除错误日志
在 mysql5.5.7 之前: 数据库管理员可以删除很长时间之前的错误日志, 以保证 MySQL 服务器上的硬盘空间. MySQL 数据库中, 可以使用 mysqladmin 命令开启新的错误日志. mysqladmin 命令的语法如下: mysqladmin -u root -p flush-logs 也可以登录 MySQL 数据库中使用 FLUSH LOGS 语句来开启新的错误日志. 在 mysql5.5.7 之后: 服务器将关闭此项功能. 只能使用重命名原来的错误日志文件, 手动冲洗日志创建一个新的, 方式如下:
- [[email protected] ~]# cd /usr/local/MySQL/data/
- [[email protected] data]# mv mysqld.err{
- ,.old
- }
- [[email protected] data]# mysqladmin -uroot -p flush-logs
- Enter password:
2, 二进制日志
二进制日志主要记录 MySQL 数据库的变化, 二进制日志以一种有效的格式, 并且是事务安全的方式包含更新日志中可用的信息. 二进制日志包含了所有更新了数据或者已经潜在更新了数据. 还包含关于每个更新数据库的语句的执行时间, 它不包含没有修改任何数据的语句. 使用二进制日志的主要目的是最大可能地恢复数据库.
1)启动二进制日志(默认情况下二进制日志是关闭的)
- [[email protected] 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 #单个日志文件的大小限制, 超出会新建一个日志文件
- [[email protected] data]# systemctl restart mysqld #重启 MySQL 使配置生效
- [[email protected] 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
登录到数据库中也可以查看到, 如下:
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 命令查看:
[[email protected] 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 的备份与恢复详解 https://blog.51cto.com/14154700/2395340
3, 事务日志
事务日志 (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 操作的时候阻塞了。 总结
| 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 名称存在.
<!---->
MySQL 日志详解(未完待续)
来源: http://www.bubuko.com/infodetail-3358313.html