查看版本
mysql> select version();
+------------+
| version() |
+------------+
| 5.7.24-log |
+------------+
查看安装路径 --- C:\Program Files\MySQL\MySQL Server 5.7\
mysql> show variables like '%char%';
+--------------------------+---------------------------------------------------------+
| Variable_name | Value |
+--------------------------+---------------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.7\share\charsets\ |
+--------------------------+---------------------------------------------------------+
查看日志文件路径 --- C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql-bin
mysql> show variables like 'log_%';
+----------------------------------------+------------------------------------------------------------+
| Variable_name | Value |
+----------------------------------------+------------------------------------------------------------+
| log_bin | ON |
| log_bin_basename | C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql-bin |
| log_bin_index | C:\ProgramData\MySQL\MySQL Server 5.7\Data\mysql-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| log_builtin_as_identified_by_password | OFF |
| log_error | .\HLW103339.err |
| log_error_verbosity | 3 |
| log_output | FILE |
| log_queries_not_using_indexes | OFF |
| log_slave_updates | OFF |
| log_slow_admin_statements | OFF |
| log_slow_slave_statements | OFF |
| log_statements_unsafe_for_binlog | ON |
| log_syslog | ON |
| log_syslog_tag | |
| log_throttle_queries_not_using_indexes | 0 |
| log_timestamps | UTC |
| log_warnings | 2 |
+----------------------------------------+------------------------------------------------------------+
文件夹下相关日志文件:
查看二进制binlog日志
方式一、mysql> show binlog events in 'mysql-bin.000014';
mysql> show binlog events in 'mysql-bin.000014';
+------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------------------------+
| Log_name | Pos | Event_type | Server_id | End_log_pos | Info |
+------------------+------+----------------+-----------+-------------+---------------------------------------------------------------------------------------+
| mysql-bin.000014 | 4 | Format_desc | 1 | 123 | Server ver: 5.7.24-log, Binlog ver: 4 |
| mysql-bin.000014 | 123 | Previous_gtids | 1 | 154 | |
| mysql-bin.000014 | 154 | Anonymous_Gtid | 1 | 219 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000014 | 219 | Query | 1 | 368 | use `blog`; ALTER TABLE `t_press_info`
ADD FULLTEXT INDEX `index_full_press` (`press`) |
| mysql-bin.000014 | 368 | Anonymous_Gtid | 1 | 433 | SET @@SESSION.GTID_NEXT= 'ANONYMOUS' |
| mysql-bin.000014 | 433 | Query | 1 | 505 | BEGIN |
| mysql-bin.000014 | 505 | Table_map | 1 | 570 | table_id: 123 (blog.t_press_info) |
| mysql-bin.000014 | 570 | Update_rows | 1 | 664 | table_id: 123 flags: STMT_END_F |
方式二、mysqlbinlog mysql-bin.000014
例如:
下面使用 mysqlbinlog 命令,来查看C:\ProgramData\MySQL\MySQL Server 5.7\Data目录下的mysql-bin.000014文件,代码执行如下:
C:\ProgramData\MySQL\MySQL Server 5.7\Data>mysqlbinlog mysql-bin.000014
......省略
BINLOG '
QbaHYBMBAAAAQQAAAEREAAAAAHsAAAAAAAEABGJsb2cADHRfcHJlc3NfaW5mbwAFAw8PEhIGlgCW
AAAAGFzPR1Q=
QbaHYB8BAAAAbwAAALNEAAAAAHsAAAAAAAEAAgAF///4AQAAAA3ljJfkuqzniYgxMTExD+WMl+S6
rOWHuueJiOekvvgCAAAAEmJpbmxvZyB1cGRhdGUgZGF0YQ/ljJfkuqzlh7rniYjnpL511QUt
'/*!*/;
# at 17587
#210427 14:59:13 server id 1 end_log_pos 17618 CRC32 0xa4eef463 Xid = 3787
COMMIT/*!*/;
# at 17618
#210427 15:04:07 server id 1 end_log_pos 17683 CRC32 0x3a7d0a0d Anonymous_GTID last_committed=25 sequence_number=26 rbr_only=no
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
# at 17683
#210427 15:04:07 server id 1 end_log_pos 17802 CRC32 0xc809181b Query thread_id=455 exec_time=0 error_code=0
SET TIMESTAMP=1619507047/*!*/;
DROP TABLE `t_note` /* generated by server */
/*!*/;
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,redolog,undolog都是什么,起什么作用
binlog(二进制日志)是mysql-server层的,主要是做主从复制,时间点恢复使用
redolog(重做日志)是InnoDB存储引擎层的,用来保证事务安全
undolog(回滚日志)保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。select如果没有特定加锁的话就是快照读,
用到了undolog,而insert delete和update都是当前读,与这个日志关系不大。
1:重做日志(redo log)
作用:
确保事务的持久性。redo日志记录事务执行后的状态,用来恢复未写入data file的已成功事务更新的数据。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log进行重做,从而达到事务的持久性这一特性。
内容:
物理格式的日志,记录的是物理数据页面的修改的信息,其redo log是顺序写入redo log file的物理文件中去的。
什么时候产生:
事务开始之后就产生redo log,redo log的落盘并不是随着事务的提交才写入的,而是在事务的执行过程中,便开始写入redo log文件中。
什么时候释放:
当对应事务的脏页写入到磁盘之后,redo log的使命也就完成了,重做日志占用的空间就可以重用(被覆盖)。
对应的物理文件:
默认情况下,对应的物理文件位于数据库的data目录下的ib_logfile1&ib_logfile2
innodb_log_group_home_dir 指定日志文件组所在的路径,默认./ ,表示在数据库的数据目录下。
innodb_log_files_in_group 指定重做日志文件组中文件的数量,默认2
2:回滚日志(undo log)
作用:
保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读
内容:
逻辑格式的日志,在执行undo的时候,仅仅是将数据从逻辑上恢复至事务之前的状态,而不是从物理页面上操作实现的,这一点是不同于redo log的。
什么时候产生:
事务开始之前,将当前是的版本生成undo log,undo 也会产生 redo 来保证undo log的可靠性
什么时候释放:
当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其他事务在使用undo段中表的上一个事务之前的版本信息,决定是否可以清理undo log的日志空间。
对应的物理文件:
MySQL5.6之前,undo表空间位于共享表空间的回滚段中,共享表空间的默认的名称是ibdata,位于数据文件目录中。
MySQL5.6之后,undo表空间可以配置成独立的文件,但是提前需要在配置文件中配置,完成数据库初始化后生效且不可改变undo log文件的个数
如果初始化数据库之前没有进行相关配置,那么就无法配置成独立的表空间了。
3:二进制日志(binlog)
binlog 的配置信息:show variables like '%log_bin%';
binlog 的格式:show variables like 'binlog_format';
日志的文件列表:show binary logs;
当前日志的写入状态:show master status;
清空 binlog 日志:reset master;
作用:
用于复制,在主从复制中,从库利用主库上的binlog进行重播,实现主从同步。
用于数据库的基于时间点的还原。
内容:
逻辑格式的日志,可以简单认为就是执行过的事务中的sql语句。
但又不完全是sql语句这么简单,而是包括了执行的sql语句(增删改)反向的信息,也就意味着delete对应着delete本身和其反向的insert;update对应着update执行前后的版本的信息;insert对应着delete和insert本身的信息。
在使用mysqlbinlog解析binlog之后一些都会真相大白。
因此可以基于binlog做到类似于oracle的闪回功能,其实都是依赖于binlog中的日志记录。
什么时候产生:
事务提交的时候,一次性将事务中的sql语句(一个事物可能对应多个sql语句)按照一定的格式记录到binlog中。
这里与redo log很明显的差异就是redo log并不一定是在事务提交的时候刷新到磁盘,redo log是在事务开始之后就开始逐步写入磁盘。
因此对于事务的提交,即便是较大的事务,提交(commit)都是很快的,但是在开启了bin_log的情况下,对于较大事务的提交,可能会变得比较慢一些。
这是因为binlog是在事务提交的时候一次性写入的造成的,这些可以通过测试验证。
什么时候释放:
binlog的默认是保持时间由参数expire_logs_days配置,也就是说对于非活动的日志文件,在生成时间超过expire_logs_days配置的天数之后,会被自动删除。
对应的物理文件:
配置文件的路径为log_bin_basename,binlog日志文件按照指定大小,当日志文件达到指定的最大的大小之后,进行滚动更新,生成新的日志文件。
对于每个binlog日志文件,通过一个统一的index文件来组织。
查看是否开启
mysql> show variables like 'log_bin';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set
查看日志文件
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 236897 |
| mysql-bin.000002 | 177 |
| mysql-bin.000003 | 177 |
| mysql-bin.000004 | 94725 |
| mysql-bin.000005 | 177 |
| mysql-bin.000006 | 879 |
| mysql-bin.000007 | 177 |
| mysql-bin.000008 | 177 |
| mysql-bin.000009 | 177 |
| mysql-bin.000010 | 177 |
| mysql-bin.000011 | 177 |
| mysql-bin.000012 | 177 |
| mysql-bin.000013 | 177 |
| mysql-bin.000014 | 5394 |
+------------------+-----------+
查看最新的文件
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000014 | 5394 | | | |
+------------------+----------+--------------+------------------+-------------------+
4:错误日志(errorlog)
5:慢查询日志(slow query log)
查看是否记录到慢查询日志文件的时间
mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 0.000100 |
+-----------------+----------+
查看慢查询文件
mysql> SHOW VARIABLES LIKE 'slow_query_log_file';
+---------------------+--------------------+
| Variable_name | Value |
+---------------------+--------------------+
| slow_query_log_file | HLW103339-slow.log |
+---------------------+--------------------+
设置是否记录到慢查询日志文件的时间
mysql> SET long_query_time=10;
mysql> SHOW VARIABLES LIKE 'long_query_time';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
6:一般查询日志(general log)
7:中继日志(relay log)