环境部署
bash
docker run -d -p 3306:3306 --privileged=true -v $(pwd)/logs:/var/lib/logs -v $(pwd)/conf:/etc/mysql/conf.d -v $(pwd)/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=654321 --name mysql mysql:5.7
运行指令的目录下新建好这些文件:
日志类型
日志类型 | 写出到日志的信息 |
---|---|
ErrorLog(错误日志) | mysqld 错误日志(记录了mysqld开始,停止,运行中的错误日志)。 |
General query log (查询日志) | 记录了msqld在做什么事情,用户建立连接和用户执行SQL都会被记录。 |
Binary log(二进制日志) | 对于数据库的任何修改事件都会记录到这里,二进制日志用于恢复,复制和审计。 |
Relay log(中继日志) | 中继日志和二进制日志相似,记录了一些对数据库改变的操作事件,同时维护了一个已经使用过的中继日志索引。 |
SlowQueryLog | 慢查询日志,记录慢查询 比long_query_time(可配置)长的都为慢查询。 |
DDL log (metadata log) | 记录了比如修改表结构或者重命名这些对元数据进行修改的操作。 |
查看日志变量
通过下面两条指令可以查看各种日志的启用情况
bash
show variables like "log_%";
show variables like "%_log";
ErrorLog
默认开启,错误日志记录了运行过程中遇到的所有严重的错误信息,以及 MySQL每次启动和关闭的详细信息。
默认是stderr也就是输出到控制台.
如果我们需要输出到目录我们需要修改这个配置:
bash
[mysqld]
#设置输出路径
log-error=/var/lib/logs/log-err.log
这里注意可能回报错误,因为没有权限在这个路径写东西,放到这个目录/var/lib/logs下即可:
重启服务器我们可以看到日志的输出变为了文件路径:
同时我们可以根据log-warnings去配置输出那些信息,默认为2我们可以看到:
log_warnings 为0, 表示不记录告警信息。
log_warnings 为1, 表示告警信息写入错误日志。
log_warnings 大于1, 表示各类告警信息,例如:有关网络故障的信息和重新连接信息写入错误日志。
比如我们做下面的配置,可以看到值被修改为了1,这里的配置log-error 和 log_error都会生效,统一一下就可以
bash
[mysqld]
log-error=/var/lib/logs/log-err.log
log_warnings=1
二进制日志
binlog记录了数据库所有的ddl语句和dml语句,但不包括select和show语句内容因为不是更新操作(这些日志由General query log 来记录),语句以事件的形式保存,描述了数据的变更顺序,binlog还包括每个更新语句的执行时间信息。
如果是DDL语句,则直接记录到binlog日志,而DML语句,必须通过事务提交才能记录到binlog日志中。
binlog主要用于实现mysql主从复制、数据备份、数据恢复。
配置中mysql-bin是binlog日志文件的basename,如果不指定则会取pid-file的名称。binlog日志文件的完整名称:mysql-bin.000001。
pid-file是服务器从中写入其进程ID的文件的路径名。服务器在数据目录中创建文件,除非给出一个绝对路径名来指定其他目录。如果您指定此变量,则必须指定一个值。如果不指定此变量,则MySQL将使用默认值host_name.pid,其中host_name是主机的名称。
bash
[mysqld]
server_id=42
log-bin=mysql-bin
server-id的作用: 1.mysql的同步数据中是包含server-id的,用于标识该语句最初从哪个server写入,所以server-id一定要有 2.每一个同步中的slave在master上都有对应的一个master线程,该线程就是通过slave的server-id来标识的;每个slave在master端最多有一个master线程,如果两个slave的server-id相同,则后一个连接成功时,前一个会被踢掉,slave主动连接master之后,如果slave上面执行了slave stop;则连接断开,但是master上对应的线程并没有退出;当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题. 3.在mysql做主主同步时,多个主需要构成一个环状,但是同步的时候又要保证一条数据不会陷入死循环,这里就是靠server-id来实现的
binlog日志文件的完整名称:mysql-bin.000001......mysql-bin.999999,也就是在追加binlog的时候会在后面进行编号。在这几种情况下这个编号会继续往下编:
- msql服务启动或者重启
- 服务器刷新了binlog日志
- binlog的size达到了我们预设的max_binlog_size
为了跟踪使用了哪些二进制日志文件,mysqld还创建了一个包含二进制日志文件名称的二进制日志索引文件。默认情况下,它与二进制日志文件相同,扩展名为'.index'。您可以使用log_bin_index[=file_name]
选项更改二进制日志索引文件的名称。
开启上面的配置以后我们可以看到二进制日志被开启,并且生产了index文件
我们去docker挂在的目录看一下这些文件
General query log 通用查询日志
general query log 默认关闭,由于通用查询日志会记录用户的所有操作,其中还包含增删查改等信息,在并发操作大的环境下会产生大量的信息从而导致不必要的磁盘IO,会影响MySQL的性能的。如果不是为了调试数据库,不建议开启查询日志。
bash
show global variables like '%general_log%';
bash
[mysqld]
#控制是否开启
general_log={0|1}
#这个变量定义了慢查询或者查询日志的输出的方式 可以是文件也可以是表 也可以是都输出 TABLE,FILE
log_output={FILE|TABLE|NONE}
#general_log_file如果没有指定,默认名是host_name.log
general_log_file=/var/lib/mysql/general_log.log
log_output='FILE'表示将日志存入文件,默认值是'FILE' log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.general_log 或者mysql.slow_log表中.
SlowQueryLog 慢查询日志
slow query log 默认关闭,通过以下设置开启。记录执行时间超过long_query_time秒的所有查询,便于收集查询时间比较长的SQL语句。
bash
show global status like '%Slow_queries%';
show variables like '%slow_query%';
show variables like 'long_query_time%';
bash
[mysqld]
#这个和普通查询日志一样的
log_output={FILE|TABLE|NONE}
# 开启慢查询日志
slow_query_log={0|1}
# 慢查询的阈值,单位秒
long_query_time=10
# 日志记录文件
# 如果没有给出file_name值, 默认为主机名,后缀为-slow.log。
# 如果给出了文件名,但不是绝对路径名,文件则写入数据目录。
slow_query_log_file=/var/lib/mysql/slow_query_log.log
默认情况下,不会记录管理类的日志语句,也不会记录不使用索引进行查询的查询,可以通过下面两个参数开启
bash
#记录管理员
log_slow_admin_statements=ON
#记录没有使用索引的语句
log_queries_not_using_indexes=ON
记录管理类指令 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX,
OPTIMIZE TABLE, and REPAIR TABLE.这些操作。
DDL log (metadata log)
DDL日志或元数据日志记录由数据定义语句生成的影响表分区的元数据操作,例如 ALTER TABLE t3 DROP PARTITION p2,我们必须确保分区被完全删除,其定义从表t3的分区列表中删除。MySQL使用此日志从分区元数据操作中间发生的崩溃中恢复,就比如我们在修改或者删除表的时候发送了异常,mysqld会借助这个日志将数据库恢复到之前的状态。分区元数据操作的记录被写入MySQL数据目录中的文件ddl_log.log。DDL 日志是一个二进制文件,不被人为的阅读修改,也没有其他配置项可以配置它,且在成功启动mysqld 后会被删除,只有在记录元数据时才会被重新创建。因此,这个文件可能不会出现在一个完全正常运行的MySQL服务器上。
Relay log(中继日志)
bash
show variables like '%relay%';
和binlog非常的类似也是记录了数据库的变化,也会维护一个索引用来记录那些中继日志被使用过了。我的理解是它其实就是binlog的一种中间状态,用于在从数据库进行同步数据。
原图链接
出现下面这几种情况,中继日志会创建一个新的文件:
- 每次负责复制的线程开始的时候,会创建一个新的中继日志,这样不会丢失之前的中继日志。
- 当日志被刷到磁盘的时候
- 当中继日志超过文件存储大小上限的时候