MySQL的日志记录了MySQL的平常操做和错误信息,经过这些日志咱们能够知道MySQL内部发生的事情,能够为MySQL的优化和管理提供必要的信息。java
MySQL的日志主要有:二进制日志、通用查询日志、慢查询日志、错误日志、事务日志等。mysql
二进制日志用来记录操做MySQL数据库中的写入性操做(包括增删改,但不包括查询),操做语句以事件的形式进行保存,描述数据更改。sql
二进制的主要做用有两个:数据库
二进制能够经过show variables like 'log_bin';
查看是否已经打开。缓存
下面的返回表示是关闭的:性能优化
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | OFF |
+---------------+-------+
复制代码
安装成功之后,查看MySQL版本:bash
C:\>mysql -V
mysql Ver 14.14 Distrib 5.7.17, for Win64 (x86_64)
复制代码
C:\ProgramData\MySQL\MySQL Server 5.7
(注意目录不要搞错)目录下的my.ini文件,并在[mysqld]
配置组下面加入以下配置:# MySQL二进制日志配置
# bin log输出的目录及文件
log-bin="C:/1workspace/develop/db/mysql/mysql57/logs/binlog"
# bin log清理时间
expire_logs_days=7
# 每一个bin log文件大小
max_binlog_size=200m
#binlog缓存大小
binlog_cache_size=10m
#最大binlog缓存大小
max_binlog_cache_size=20m
复制代码
C:\>net stop MySQL57
MySQL57 服务正在中止.
MySQL57 服务已成功中止。
C:\>net start MySQL57
MySQL57 服务正在启动 .
MySQL57 服务已经启动成功。
复制代码
C:\>mysql -uroot -pmysqltao
复制代码
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
复制代码
这时候你能够打开你配置的bin log路径,能够看到生成的二进制日志文件:binlog.000001,服务器
以及一个二进制log的索引文件:binlog.index。session
每次重启MySQL都会生成一个新的binlog文件,经过show binary logs
语句能够看到全部的binlog文件,返回的内容跟 binlog.index 文件里记录的binlog文件数是同样的。app
如今有3个binglog文件:
mysql> show binary logs;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000001 | 177 |
| binlog.000002 | 177 |
| binlog.000003 | 154 |
+---------------+-----------+
复制代码
执行一条update语句:
update demo_java_db_1.t_user set name='Jack' where id=1;
复制代码
再经过mysqlbinlog
语句查看当前的binlog文件:
C:\1workspace\develop\db\mysql\mysql57\logs>mysqlbinlog binlog.000003
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#190704 17:19:28 server id 1 end_log_pos 123 CRC32 0xaf193fc6 Start: binlog v 4, server v 5.7.17-log created 190704 17:19:28 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG '
oMQdXQ8BAAAAdwAAAHsAAAABAAQANS43LjE3LWxvZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAACgxB1dEzgNAAgAEgAEBAQEEgAAXwAEGggAAAAICAgCAAAACgoKKioAEjQA
AcY/Ga8=
'/*!*/;
# at 123
#190704 17:19:29 server id 1 end_log_pos 154 CRC32 0xc916f3aa Previous-GTIDs
# [empty]
# at 154
#190704 17:39:43 server id 1 end_log_pos 219 CRC32 0xcecca4bf Anonymous_GTID last_committed=0 sequence_number=1
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 219
#190704 17:39:43 server id 1 end_log_pos 287 CRC32 0xb6a3de97 Query thread_id=7 exec_time=0 error_code=0
SET TIMESTAMP=1562233183/*!*/;
SET @@session.pseudo_thread_id=7/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=1344274432/*!*/;
SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=33/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 287
#190704 17:39:43 server id 1 end_log_pos 358 CRC32 0xd1ce52d6 Table_map: `demo_java_db_1`.`t_user` mapped to number 115
# at 358
#190704 17:39:43 server id 1 end_log_pos 445 CRC32 0x7a57aa7a Update_rows: table id 115 flags: STMT_END_F
BINLOG '
X8kdXRMBAAAARwAAAGYBAAAAAHMAAAAAAAEADmRlbW9famF2YV9kYl8xAAZ0X3VzZXIABQgPDw8P
CGAAYABgAGAAHtZSztE=
X8kdXR8BAAAAVwAAAL0BAAAAAHMAAAAAAAEAAgAF///wAQAAAAAAAAAFZmlyc3QGcHdkMTIzA01B
TvABAAAAAAAAAARKYWNrBnB3ZDEyMwNNQU56qld6
'/*!*/;
# at 445
#190704 17:39:43 server id 1 end_log_pos 476 CRC32 0x6e49c227 Xid = 42
COMMIT/*!*/;
SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
DELIMITER ;
# End of log file
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
复制代码
经过binlog能够看到在 17:39:43改了demo_java_db_1
库的t_user
表。
经过show binlog events
命令能够查看binlog内记录的事件:
mysql> show binlog events in 'binlog.000003'\G
*************************** 1. row ***************************
Log_name: binlog.000003
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 123
Info: Server ver: 5.7.17-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: binlog.000003
Pos: 123
Event_type: Previous_gtids
Server_id: 1
End_log_pos: 154
Info:
*************************** 3. row ***************************
Log_name: binlog.000003
Pos: 154
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 219
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
Log_name: binlog.000003
Pos: 219
Event_type: Query
Server_id: 1
End_log_pos: 287
Info: BEGIN
*************************** 5. row ***************************
Log_name: binlog.000003
Pos: 287
Event_type: Table_map
Server_id: 1
End_log_pos: 358
Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 6. row ***************************
Log_name: binlog.000003
Pos: 358
Event_type: Update_rows
Server_id: 1
End_log_pos: 445
Info: table_id: 115 flags: STMT_END_F
*************************** 7. row ***************************
Log_name: binlog.000003
Pos: 445
Event_type: Xid
Server_id: 1
End_log_pos: 476
Info: COMMIT /* xid=42 */
*************************** 8. row ***************************
Log_name: binlog.000003
Pos: 476
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 541
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 9. row ***************************
Log_name: binlog.000003
Pos: 541
Event_type: Query
Server_id: 1
End_log_pos: 609
Info: BEGIN
*************************** 10. row ***************************
Log_name: binlog.000003
Pos: 609
Event_type: Table_map
Server_id: 1
End_log_pos: 680
Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 11. row ***************************
Log_name: binlog.000003
Pos: 680
Event_type: Update_rows
Server_id: 1
End_log_pos: 765
Info: table_id: 115 flags: STMT_END_F
*************************** 12. row ***************************
Log_name: binlog.000003
Pos: 765
Event_type: Xid
Server_id: 1
End_log_pos: 796
Info: COMMIT /* xid=69 */
*************************** 13. row ***************************
Log_name: binlog.000003
Pos: 796
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 861
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 14. row ***************************
Log_name: binlog.000003
Pos: 861
Event_type: Query
Server_id: 1
End_log_pos: 929
Info: BEGIN
*************************** 15. row ***************************
Log_name: binlog.000003
Pos: 929
Event_type: Table_map
Server_id: 1
End_log_pos: 1000
Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 16. row ***************************
Log_name: binlog.000003
Pos: 1000
Event_type: Update_rows
Server_id: 1
End_log_pos: 1085
Info: table_id: 115 flags: STMT_END_F
*************************** 17. row ***************************
Log_name: binlog.000003
Pos: 1085
Event_type: Xid
Server_id: 1
End_log_pos: 1116
Info: COMMIT /* xid=101 */
*************************** 18. row ***************************
Log_name: binlog.000003
Pos: 1116
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 1181
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 19. row ***************************
Log_name: binlog.000003
Pos: 1181
Event_type: Query
Server_id: 1
End_log_pos: 1249
Info: BEGIN
*************************** 20. row ***************************
Log_name: binlog.000003
Pos: 1249
Event_type: Table_map
Server_id: 1
End_log_pos: 1320
Info: table_id: 115 (demo_java_db_1.t_user)
*************************** 21. row ***************************
Log_name: binlog.000003
Pos: 1320
Event_type: Update_rows
Server_id: 1
End_log_pos: 1405
Info: table_id: 115 flags: STMT_END_F
*************************** 22. row ***************************
Log_name: binlog.000003
Pos: 1405
Event_type: Xid
Server_id: 1
End_log_pos: 1436
Info: COMMIT /* xid=107 */
22 rows in set (0.00 sec)
复制代码
经过mysqlbinlog
命令能够恢复数据,mysqlbinlog
命令支持添加参数来恢复指定的事件:
mysqlbinlog --start-date="2019-07-04 18:00:00" --stop-date="2019-07-04 18:10:00" binlog.000003 |mysql -uroot -pmysqltao
复制代码
MySQL的错误日志记录了 mysqld 启动和中止时,以及服务器在运行过程当中出现的任何严重错误。
与binlog同样,在my.ini文件配置:
# error log输出的目录及文件
log-error="C:/1workspace/develop/db/mysql/mysql57/logs/errorlog"
复制代码
通用查询日志可以存放到一个文本文件或者表中,所有链接和语句被记录到该日志文件或表,默认不开启该日志。
在my.ini文件[mysqld]组配置通用查询日志:
#通用查询日志输出格式 [none|file|table|file,table]
log_output=file
#是否启用通用查询日志[on|off]
general_log=on
#通用查询日志位置及名字
general_log_file="C:/1workspace/develop/db/mysql/mysql57/logs/generallog"
复制代码
慢查询日志记录的是查询较慢的SQL语句的日志,可用于对执行时间较长、执行效率较低的SQL语句的性能优化。
set global slow_query_log = on;
复制代码
若是想关闭慢查询日志,只须要执行:
set global slow_query_log = off;
复制代码
2.临时设置慢查询时间临界点
查询时间高于这个临界点的都会被记录到慢查询日志中。
全部执行时间超过1秒的sql都将被记录到慢查询日志:
set long_query_time = 1;
复制代码
set globle log_output = file;
复制代码
这里设置为了file,就是说慢查询日志是经过file保存,默认是none,咱们还能够设置为table,若是是table则慢查询信息会保存到mysql库下的slow_log表中。
show variables like '%quer%';
复制代码
事务日志是InnoDB引擎特有的日志,能够帮助提升事务的效率。
使用事务日志,存储引擎在修改表的数据时只须要修改其内存拷贝,再把改修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据自己持久到磁盘。
事务日志采用追加的方式,所以写日志的操做是磁盘上一小块区域内的顺序I/O,而不像随机I/O须要在磁盘的多个地方移动磁头,因此采用事务日志的方式相对来讲要快得多。
事务日志持久之后,内存中被修改的数据在后台能够慢慢的刷回到磁盘。目前大多数的存储引擎都是这样实现的,咱们一般称之为预写式日志,修改数据须要写两次磁盘。
若是数据的修改已经记录到事务日志并持久化,但数据自己尚未写回磁盘,此时系统崩溃,存储引擎在重启时可以自动恢复这部分修改的数据。具备的恢复方式则视存储引擎而定。
查看事务日志参数:
mysql> SHOWGLOBAL VARIABLES LIKE '%log%';
+-----------------------------------------+-----------------------------------+
| Variable_name | Value |
+-----------------------------------------+-----------------------------------+
| innodb_flush_log_at_trx_commit | 1 |
|innodb_locks_unsafe_for_binlog |OFF |
| innodb_log_buffer_size | 8388608 |
|innodb_log_file_size |5242880 |
| innodb_log_files_in_group | 2 |
|innodb_log_group_home_dir |./ |
|innodb_mirrored_log_groups |1 |
复制代码
错误日志、通用查询日志、慢查询日志、事务日志、二进制日志
file(文件),table(表)、none(不保存)
异常监控、性能优化、数据恢复、主从同步