卧龙区2015网站建设口碑,谷歌seo网络公司,东莞排名推广,荷塘网站建设文章目录 1. 慢查询日志#xff08;Slow Query Log#xff09;1.1 是否开启慢查询日志1.2 开启慢查询日志#xff0c;设置时间阈值1.2.1 修改文件my.ini1.2.2 重启mysql后配置生效 1.3 查看慢查询日志1.3.1 直接用文本编辑器打开1.3.2 使用mysqldumpslow进行分析 2. InnoDB … 文章目录 1. 慢查询日志Slow Query Log1.1 是否开启慢查询日志1.2 开启慢查询日志设置时间阈值1.2.1 修改文件my.ini1.2.2 重启mysql后配置生效 1.3 查看慢查询日志1.3.1 直接用文本编辑器打开1.3.2 使用mysqldumpslow进行分析 2. InnoDB 重做日志Redo Logs3. 二进制日志Binary Log / Binlog3.1 MySQL整体来看其实就有两块server 存储引擎3.2 为什么redolog、binlog同时存在3.3 redolog、binlog日志有以下三点不同3.4 有了对这两个日志的概念性理解我们再来看执行器和InnoDB引擎在执行update语句时的内部流程3.5 两阶段提交3.6 redo log、binlog的其他一些知识点 4. InnoDB 回滚日志Undo Log5. Mysql各种日志简介 1. 慢查询日志Slow Query Log
1.1 是否开启慢查询日志
查询命令SHOW VARIABLES LIKE ‘slow_query_log’;
1.2 开启慢查询日志设置时间阈值
1.2.1 修改文件my.ini
[mysqld]
basedirD:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\
datadirD:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\data\
port3306
slow_query_log 1 # 开启慢查询日志
long_query_time 2 # 设置慢查询阈值默认为10秒这里设置为2秒
slow_query_log_file D:\javasoft\mysql8\mysql-8.0.27-winx64\mysql-8.0.27-winx64\slow_log\slow-query.log # 指定慢查询日志存放路径及文件名1.2.2 重启mysql后配置生效
以管理员身份打开cmd启动net start mysql登录mysql -u root -p -h localhost查看慢查询开关 show variables like ‘slow_query_log’; 这里复制直接粘贴执行会出错不知道为啥大家可以手敲 1.3 查看慢查询日志
1.3.1 直接用文本编辑器打开 1.3.2 使用mysqldumpslow进行分析
mysqldumpslow -t 10 /data/mysql/mysql-slow.log #显示出慢查询日志中最慢的10条sql
2. InnoDB 重做日志Redo Logs redo log主要用于崩溃恢复主要是mysql崩溃时 而binlog主要用于归档有了归档若数据误删除就可以将数据恢复到某个节点主从同步也依赖binlog主要解决人为造成的数据问题及数据同步 数据库崩溃恢复使用redo logbinlog没有被用来做崩溃恢复。操作上的原因是binlog是可以关的你如果有权限可以set sql_log_bin0关掉本线程的binlog日志。 所以只依赖binlog来恢复就靠不住。 redo log用于保证crash-safe能力。innodb_flush_log_at_trx_commit这个参数设置成1的时候表示每次事务的redo log都直接持久化到磁盘。这个参数我建议你设置成1这样可以保证MySQL异常重启之后数据不丢失。 物理日志 是InnoDB存储引擎独有的 在MySQL里有个问题如果每一次的更新操作都需要写进磁盘然后磁盘也要找到对应的那条记录然后再更新整个过程IO成本、查找成本都很高。为了解决这个问题MySQL的设计者就用redo日志来提供效率其实就是WAL技术WAL的全称是Write-Ahead Logging它的关键点就是先写日志再写磁盘 当有一条记录需要更新的时候InnoDB引擎就会先把记录写到redo log粉板里面并更新内存这个时候更新就算完成了。同时InnoDB引擎会在适当的时候将这个操作记录更新到磁盘里面而这个更新往往是在系统比较空闲的时候做 InnoDB的redo log是固定大小的比如可以配置为一组4个文件每个文件的大小是1GB那么这块“粉板”总共就可以记录4GB的操作。从头开始写写到末尾就又回到开头循环写如下面这个图所示。 write pos是当前记录的位置一边写一边后移写到第3号文件末尾后就回到0号文件开头。checkpoint是当前要擦除的位置也是往后推移并且循环的擦除记录前要把记录更新到数据文件。 write pos和checkpoint之间的是空着的部分可以用来记录新的操作。如果write pos追上checkpoint这时候不能再执行新的更新得停下来先擦掉一些记录把checkpoint推进一下。 有了redo logInnoDB就可以保证即使数据库发生异常重启之前提交的记录都不会丢失这个能力称为crash-safe。
3. 二进制日志Binary Log / Binlog
3.1 MySQL整体来看其实就有两块server 存储引擎
一块是Server层它主要做的是MySQL功能层面的事情redo log是InnoDB引擎特有的日志还有一块是引擎层负责存储相关的具体事宜。Server层也有自己的日志称为binlog归档日志。
3.2 为什么redolog、binlog同时存在
因为最开始MySQL里并没有InnoDB引擎。MySQL自带的引擎是MyISAM但是MyISAM没有crash-safe的能力binlog日志只能用于归档。而InnoDB是另一个公司以插件形式引入MySQL的既然只依靠binlog是没有crash-safe能力的所以InnoDB使用另外一套日志系统——也就是redo log来实现crash-safe能力。
3.3 redolog、binlog日志有以下三点不同 redo log是InnoDB引擎特有的binlog是MySQL的Server层实现的所有引擎都可以使用。 redo log是物理日志记录的是“在某个数据页上做了什么修改”binlog是逻辑日志记录的是这个语句的原始逻辑比如“给ID2这一行的c字段加1 ”。 redo log是循环写的空间固定会用完binlog是可以追加写入的。“追加写”是指binlog文件写到一定大小后会切换到下一个并不会覆盖以前的日志。
3.4 有了对这两个日志的概念性理解我们再来看执行器和InnoDB引擎在执行update语句时的内部流程 执行器先找引擎取ID2这一行。ID是主键引擎直接用树搜索找到这一行。如果ID2这一行所在的数据页本来就在内存中就直接返回给执行器否则需要先从磁盘读入内存然后再返回。 执行器拿到引擎给的行数据把这个值加上1比如原来是N现在就是N1得到新的一行数据再调用引擎接口写入这行新数据。 引擎将这行新数据更新到内存中同时将这个更新操作记录到redo log里面此时redo log处于prepare状态。然后告知执行器执行完成了随时可以提交事务。 执行器生成这个操作的binlog并把binlog写入磁盘。 执行器调用引擎的提交事务接口引擎把刚刚写入的redo log改成提交commit状态更新完成。
这里我给出这个update语句的执行流程图图中浅色框表示是在InnoDB内部执行的深色框表示是在执行器中执行的。 你可能注意到了最后三步看上去有点“绕”将redo log的写入拆成了两个步骤prepare和commit这就是两阶段提交。
3.5 两阶段提交
两阶段提交是为了让两份日志之间的逻辑一致两阶段提交是跨系统维持数据逻辑一致性时常用的一个方案 怎样让数据库恢复到半个月内任意一秒的状态 前面我们说过了binlog会记录所有的逻辑操作并且是采用“追加写”的形式。如果你的DBA承诺说半个月内可以恢复那么备份系统中一定会保存最近半个月的所有binlog同时系统会定期做整库备份。这里的“定期”取决于系统的重要性可以是一天一备也可以是一周一备。
当需要恢复到指定的某一秒时比如某天下午两点发现中午十二点有一次误删表需要找回数据那你可以这么做
首先找到最近的一次全量备份如果你运气好可能就是昨天晚上的一个备份从这个备份恢复到临时库然后从备份的时间点开始将备份的binlog依次取出来重放到中午误删表之前的那个时刻。
这样你的临时库就跟误删之前的线上库一样了然后你可以把表数据从临时库取出来按需要恢复到线上库去。
好了说完了数据恢复过程我们回来说说为什么日志需要“两阶段提交”。这里不妨用反证法来进行解释。
由于redo log和binlog是两个独立的逻辑如果不用两阶段提交要么就是先写完redo log再写binlog或者采用反过来的顺序。我们看看这两种方式会有什么问题。
仍然用前面的update语句来做例子。假设当前ID2的行字段c的值是0再假设执行update语句过程中在写完第一个日志后第二个日志还没有写完期间发生了crash会出现什么情况呢 先写redo log后写binlog。假设在redo log写完binlog还没有写完的时候MySQL进程异常重启。由于我们前面说过的redo log写完之后系统即使崩溃仍然能够把数据恢复回来所以恢复后这一行c的值是1。 但是由于binlog没写完就crash了这时候binlog里面就没有记录这个语句。因此之后备份日志的时候存起来的binlog里面就没有这条语句。 然后你会发现如果需要用这个binlog来恢复临时库的话由于这个语句的binlog丢失这个临时库就会少了这一次更新恢复出来的这一行c的值就是0与原库的值不同。 先写binlog后写redo log。如果在binlog写完之后crash由于redo log还没写崩溃恢复以后这个事务无效所以这一行c的值是0。但是binlog里面已经记录了“把c从0改成1”这个日志。所以在之后用binlog来恢复的时候就多了一个事务出来恢复出来的这一行c的值就是1与原库的值不同。
可以看到如果不使用“两阶段提交”那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。
你可能会说这个概率是不是很低平时也没有什么动不动就需要恢复临时库的场景呀
其实不是的不只是误操作后需要用这个过程来恢复数据。当你需要扩容的时候也就是需要再多搭建一些备库来增加系统的读能力的时候现在常见的做法也是用全量备份加上应用binlog来实现的这个“不一致”就会导致你的线上出现主从数据库不一致的情况。
简单说redo log和binlog都可以用于表示事务的提交状态而两阶段提交就是让这两个状态保持逻辑上的一致。
3.6 redo log、binlog的其他一些知识点 Redo log不是记录数据页“更新之后的状态”而是记录这个页 “做了什么改动”。 Binlog有两种模式statement 格式的话是记sql语句 row格式会记录行的内容记两条更新前和更新后都有。 binlog还不能去掉。 一个原因是redolog只有InnoDB有别的引擎没有。 另一个原因是redolog是循环写的不持久保存binlog的“归档”这个功能redolog是不具备的。 两阶段提交 1 prepare阶段 2 写binlog 3 commit 当在2之前崩溃时 重启恢复后发现没有commit回滚。备份恢复没有binlog 。 一致 当在3之前崩溃 重启恢复虽没有commit但满足prepare和binlog完整所以重启后会自动commit。备份有binlog. 一致
4. InnoDB 回滚日志Undo Log
用于事务处理和多版本并发控制MVCC记录了对数据修改前的原始值当事务回滚时可以用来恢复数据至修改前的状态。是InnoDB存储引擎内部用于事务回滚和MVCC多版本并发控制的重要机制它并不直接提供给用户查看其内容。Undo日志以页为单位存储在系统表空间或独立的Undo表空间中并且由数据库管理系统自动维护。
undo log引用
5. Mysql各种日志简介
每种日志都有其特定用途并且在不同情况下分别提供关于MySQL服务器行为的不同视角。根据实际需求和运维要求管理员可以选择启用或禁用不同的日志并调整相应的配置选项。 错误日志Error Log 记录MySQL服务器启动、运行时出现的任何严重错误、警告和其他重要消息。这是调试和解决MySQL服务器问题的重要资源。 查询日志General Query Log / General Log 记录所有连接到MySQL服务器的客户端执行的所有SQL语句包括成功的查询、失败的查询以及连接断开等信息。启用此日志可能会对性能产生影响因为它记录了大量的详细数据。 慢查询日志Slow Query Log 仅记录执行时间超过特定阈值的SQL查询有助于识别并优化性能低下的SQL语句。可以通过设置long_query_time参数来控制记录哪些查询为“慢查询”。 二进制日志Binary Log / Binlog 记录了对数据库进行更改的所有操作如INSERT、UPDATE、DELETE、CREATE TABLE等但不包括SELECT操作。二进制日志是基于事件的主要用于MySQL主从复制以及其他数据恢复场景。 InnoDB事务日志Redo Logs 对于使用InnoDB存储引擎的表存在两组重做日志文件Redo Log。这些日志用于确保事务的持久性在系统崩溃时能够通过回放日志恢复未写入磁盘的数据。 审计日志Audit Log MySQL支持审计插件可以用来记录用户登录、权限变更、SQL语句执行等安全相关的操作。不过这需要额外安装和配置审计插件。 Relay Log中继日志 在MySQL主从复制架构中从库接收到主库二进制日志的事件后会将这些事件写入到自身的Relay Log中并按顺序执行。这是实现主从数据同步的关键步骤。 InnoDB Undo Log回滚日志 用于事务处理和多版本并发控制MVCC记录了对数据修改前的原始值当事务回滚时可以用来恢复数据至修改前的状态。 Performance Schema Event and Stage Statistics性能模式事件与阶段统计信息 虽然严格意义上并非日志文件但Performance Schema提供了详细的服务器内部运行状况和资源使用情况的实时监控数据包括锁、线程状态、内存分配等。 Thread-Specific Error Logs线程特定错误日志 MySQL支持为每个客户端连接创建单独的错误日志文件但这需要特殊的配置来启用。 Tablespaces Disk Image Log (DDL Log) MySQL 8.0引入了一个新的特性称为DDL日志它记录了关于表空间管理的DDL操作有助于在崩溃恢复期间重建表空间元数据。 Purge Log清除日志 在InnoDB存储引擎中当事务被提交并持久化后其对应的Undo页可以被标记为可回收。Purge线程负责检查这些已提交事务的Undo页并将其从Undo表空间中删除。虽然没有专门的purge log文件但这个过程在后台进行对于数据库性能和空间管理至关重要。 Replication Event Logs复制事件日志 MySQL Replication基于GTID全局事务标识符时会生成与GTID相关的事件记录。这些信息有助于管理和监控复杂的复制拓扑结构。 Performance Schema Trace and Slow Query Events性能模式跟踪与慢查询事件 性能模式除了统计信息之外还可以配置为记录SQL语句执行的详细跟踪信息以及更详细的慢查询数据。 CSV or JSON Audit PluginsCSV或JSON格式审计插件日志 MySQL提供了多种审计插件实现如audit_log、audit_null等可以根据需求将审计日志输出为CSV或JSON格式便于后续分析处理。 Proxy Protocol Log代理协议日志 当MySQL服务器通过支持Proxy Protocol的负载均衡器接收连接时可能会有专门的日志记录客户端原始IP地址等信息。