作者:holy190 | 来源:互联网 | 2023-01-30 17:41
默认装置时,谬误日志通常在配置文件(my.cnf)中mysqld局部的log-error配置项进行设置;利用MySQL零碎变量log_error能够查看谬误日志的文件名
1.Error Log
- 记录MySQL运行过程中的Error、Warning、Note等信息,零碎出错或者某条记录出问题能够查看Error日志。
MySQL的谬误日志默认以hostname.err寄存在MySQL的日志目录,能够通过以下语句查看
2.Slow Log
- MySQL 慢查问日志(slow query log)记录了执行工夫超过指定阈值的 SQL 语句,能够用于监控须要执行优化的查问语句。
- 如果启用了慢查问日志,任何执行工夫超过 long_query_time 并且执行次数达到 min_examined_row_limit 次的查问语句都会被记录到慢查问日志中。
查看日志性能是否开启:show variables like “%slow%”;
援用
slow_query_log 配置为ON , 阐明开启慢日志
- 查看下默认设置的慢查问的工夫:show variables like “%long_query%”;
对于慢查问日志的剖析,举荐应用 mysqldumpslow 或者 pt-query-digest 工具
3.Relay Log
- MySQL 中继日志(relay log)只存在于主从复制构造中的从节点上,用于保留主节点传输过去的数据变更事件,而后将这些事件利用于从节点。
- 中继日志与二进制日志相似,也是由一组带编号的文件组成;同时还蕴含了一个索引文件,记录了所有曾经应用过的中继日志文件。中继日志文件默认寄存在数据目录中。
其中 relay_log 和 relay_log_index 别离对应为中继日志的文件名和索引文件名。 中继日志文件的格局和二进制日志文件的格局雷同,因而也能够应用 mysqlbinlog 工具进行读取
4.Binlog
-
什么是binlog
binlog记录了数据库表构造和表数据变更,比方update/delete/insert/truncate/create,它不会记录select
-
binlog长什么样
binlog咱们能够简略了解为:存储着每条变更的SQL语句
默认状况下binlog日志是二进制格局,无奈间接查看,能够应用mysqlbinlog来查看,mysqlbinlog是mysql官网提供的一个binlog查看工具。
-
binlog个别用来做什么
次要有两个作用:复制和复原数据
1.MySQL在公司应用的时候往往都是一主多从构造的,从服务器须要与主服务器的数据保持一致,这就是通过binlog来实现的
2.数据库的数据被干掉了,咱们能够通过binlog来对数据进行复原。因为binlog记录了数据库表的变更,所以咱们能够用binlog进行复制(主从复制)和复原数据。
5.Redo Log
update table set name=’ws’ where id = 3
援用
MySQL执行这条SQL语句,必定是先把id=3的这条记录查出来,而后将name字段给改掉。这没问题吧?
援用
实际上Mysql的根本存储构造是页(记录都存在页里边),所以MySQL是先把这条记录所在的页找到,而后把该页加载到内存中,将对应记录进行批改。
问题1:如果在内存中把数据改了,还没来得及落磁盘,而此时的数据库挂了怎么办?显然这次更改就丢了。
其实写redo log的时候,也会有buffer,是先写buffer,再真正落到磁盘中的。至于从buffer什么时候落磁盘,会有配置供咱们配置。
援用
redo log的作用是当咱们批改的时候,写完内存了,但数据还没真正写到磁盘的时候。此时咱们的数据库挂了,咱们能够依据redo log来对数据进行复原。
援用
因为redo log是程序IO,所以写入的速度很快,并且redo log记录的是物理变化(xxxx页做了xxx批改),文件的体积很小,复原速度很快。
援用
Redo Log & Binlog
-
存储的内容
redo log 记录的是数据的物理变化,binlog 记录的是数据的逻辑变动
-
性能
redo log的作用是为长久化而生的。写完内存,如果数据库挂了,那咱们能够通过 redo log来复原内存还没来得及刷到磁盘的数据,
binlog的作用是复制和复原而生的。主从服务器须要保持数据的一致性,通过binlog来同步数据。
-
binlog和redo log 写入的细节
redo log是MySQL的Innodb引擎所产生的。
binlog无论MySQL用什么引擎,都会有的。
-
写入工夫
redo log事务开始的时候,就开始记录每次的变更信息
而binlog是在事务提交的时候才记录。
问题2:如果每个申请都须要将数据立马落磁盘之后,那速度会很慢,MySQL可能也顶不住。所以MySQL是怎么做的呢?
MySQL引入了redo log,内存写完了,而后会写一份redo log,这份redo log记录着这次在某个页上做了什么批改。
6.Undo log
1. undo log次要有两个作用:回滚和多版本控制(MVCC)
在数据批改的时候,不仅记录了redo log,还记录undo log,如果因为某些起因导致事务失败或回滚了,能够用undo log进行回滚
undo log次要存储的也是逻辑日志,比方咱们要insert一条数据了,那undo log会记录的一条对应的delete日志。
咱们要update一条记录时,它会记录一条对应相同的update记录。因为undo log存储着批改之前的数据,相当于一个前版本,MVCC实现的是读写不阻塞,读的时候只有返回前一个版本的数据就行了。
-
什么时候产生
事务开始之前,将以后的版本生成undo log,undo 也会产生 redo 来保障undo log的可靠性
-
什么时候开释
当事务提交之后,undo log并不能立马被删除,而是放入待清理的链表,由purge线程判断是否由其余事务在应用undo段中表的上一个事务之前的版本信息,决定是否能够清理undo log的日志空间。
利用
1.MySQL 怎么保障一致性的
*从数据库层面,数据库通过原子性、隔离性、持久性来保障一致性。在ACID四大个性之中,C(一致性)是目标,A(原子性)、I(隔离性)、D(持久性)是伎俩,是为了保障一致性,数据库提供的伎俩。
*MySQL通过两阶段提交来保障redo log和binlog的数据是统一的。
*阶段1:InnoDB redo log 写盘,InnoDB 事务进入 prepare 状态
*阶段2:binlog 写盘,InnoDB 事务进入 commit 状态
*每个事务binlog的开端,会记录一个 XID event,标记着事务是否提交胜利,也就是说,复原过程中,binlog 最初一个 XID event 之后的内容都应该被 革除
2.MySQL怎么保障原子性的
利用Innodb的undo log。
undo log回滚日志,是实现原子性的要害
当事务回滚时可能撤销所有曾经胜利执行的sql语句,它须要记录你要回滚的相应日志信息。
3.MySQL怎么保障持久性的
利用Innodb的redo log
InnoDB是有事务的:持久性就是靠redo log来实现的(如果写入内存胜利,但数据还没真正刷到磁盘,如果此时的数据库挂了,咱们能够靠redo log来复原内存的数据,这就实现了持久性)
采纳redo log的益处是将redo log进行刷盘比对数据页刷盘效率高,具体表现如下:
1.redo log体积小,毕竟只记录了哪一页批改了啥,因而体积小,刷盘快。
2.redo log是始终往开端进行追加,属于程序IO。效率显然比随机IO来的快。