一、日志的类型
类型:错误日志、二进制日志、慢日志、通用日志、事务日志
日志的作用:日志是mysql数据库的重要组成部分,日志文件中记录了mysql运行期间发生的变化
可以用来排错和数据分析,了解程序的运行情况,是否健康
二、错误日志
mysql默认开起错误日志,默认情况下,错误日志存放在mysql的数据目录下,名字是主机名.err
如果指定日志的路径,需要给mysql用户写的权限
查看错误日志的路径:
root@(none) 09:25 mysql>show variables like '%log_error%';
+---------------------+--------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------+
| binlog_error_action | ABORT_SERVER |
| log_error | /data/mysql/sc_mysql_error.log |
| log_error_verbosity | 3 |
+---------------------+--------------------------------+
3 rows in set (0.00 sec)
主要记录的信息有:
- mysql启动和关闭过程的信息
- mysql运行中的错误信息
- 配置文件出错也会记录
注意,mysql起不来首先看的就是错误日志,登录失败的原因一般都可以看到
三、慢日志
慢查询日志:记录执行时间超过指定时间的sql语句,通过慢日志,可以找出哪些查询语句的执行效率低,为数据库性能提升提供了优化线索
管理功能的sql语句默认不记录到慢日志里,但是可以开起
log_slow_admin_statements = 1
mysql默认是关闭的,可以通过修改配置文件my.cnf来开起
[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
log-error=/data/mysql/sc_mysql_error.log
slow_query_log = 1 # 开起慢日志
long_query_time = 0.001 # 定义sql语句执行时间超过多少秒会被记录到慢日志中去
查询方法,ON表示开起
root@(none) 09:25 mysql>show variables like '%slow_query%';
+---------------------+--------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /data/mysql/localhost-slow.log |
+---------------------+--------------------------------+
2 rows in set (0.00 sec)
四、通用日志
通用日志会记录用户的所有操作,会大量的消耗CPU、内存、磁盘等资源,默认情况下是不开启的,默认存在数据目录下,名字是主机名+log
临时开起:set global general_log = 1;
五、二进制日志
二进制日志主要用于记录用户修改数据或者可能改变数据的SQL语句(create、alter table、insert、update、delete)执行的时间、操作的数据
root@(none) 09:50 mysql>show variables like '%log_bin%';
+---------------------------------+---------------------------------+
| Variable_name | Value |
+---------------------------------+---------------------------------+
| log_bin | ON | #以开起
| log_bin_basename | /data/mysql/localhost-bin |
| log_bin_index | /data/mysql/localhost-bin.index |
| log_bin_trust_function_creators | OFF |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+---------------------------------+
6 rows in set (0.00 sec)
日志格式
statement格式、row格式、mixed格式
statement:记录用户输入的SQL语句
特点:binlog文件较小,易于理解,但是存在安全隐患,可能导致主从不一致
row:记录表里的哪些行的数据发生了变化
特点:相比statement更加安全,更少的锁,数据一致性高,但是文件会比较大,无法从binlog中看见用户执行的语句
mysql5.7之后,默认的格式为Row格式
什么时候产生二进制日志:
service mysqld restart
当日志到达最大值1G的时候
查看正在使用的二进制日志
root@(none) 09:50 mysql>show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| localhost-bin.000004 | 154 | | | |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
查看二进制日志:
mysqlbinlog vv localhost-bin.000004
position:记录具体的事件的位置
time:时间点
数据恢复:
二进制日志里会记录什么时间发送了什么事情
恢复数据的时候:
1.根据时间来恢复
2.根据位置来恢复Position
二进制文件相关操作
SHOW BINARY LOGS 查看所有的二进制文件和大小
SHOW MASTER STATUS 查看当前正在使用那个二进制文件和位置
SHOW BINLOG EVENTS
PURGE BINARY LOGS TO 'WANGJING-MYSQL-bin.000003'
二进制日志的删除
reset master :清除所有的二进制日志
自动清理日志:
六、事务日志
1、redo log
重做日志:记录事务对数据页做了哪些修改,适用于崩溃恢复
redo log 包括两个部分,一个是内存中的日志缓冲,另一个是磁盘是的日志文件,mysql 每执行一条
DML 语句,先将记录写入
redo log buffer ,后续某个时间点再一次性将多个操作记录写到 redo log file
。这种 先写日志,再写磁盘 的技术就是 MySQL
里经常说到的 WAL(Write-Ahead Logging)
技术。
2、undo log
回滚日志:记录了数据的逻辑变化,事务四个特性中的原子性底层就是通过undo log 实现的
比如一条 ` INSERT语句,对应一条
DELETE 的
undo log ,对于每个
UPDATE 语句,对应一条相反的
UPDATE 的
undo log ,这样在发生错误时,就能回滚到事务之前的数据状态。同时,
undo log 也是
MVCC `(多版本并发控制)实现的关键
详情请参考:必须了解的mysql三大日志-binlog、redo log和undo log - SegmentFault 思否