【MySQL技术内幕】2.7-启动关闭与恢复

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL技术内幕】2.7-启动关闭与恢复

InnoDB是 MySQL数据库的存储引擎之一,因此 InnoDB存储引擎的启动和关闭,更准确的是指在 MySQL实例的启动过程中对 InnoDB存储引擎的处理过程。

在关闭时,参数 innodb_fast_shutdown影响着表的存储引擎为 InnoDB的行为。该参数可取值为0、1、2,默认值为1。

  • 0表示在 MySQL数据库关闭时, InnoDB需要完成所有的 full purge和 merge insert buffer,并且将所有的脏页刷新回磁盘。这需要一些时间,有时甚至需要几个小时来完成。如果在进行 InnoDB升级时,必须将这个参数调为0,然后再关闭数据库。
  • 1是参数 innodb_fast_shutdown的默认值,表示不需要完成上述的 full purge和merge insert buffer操作,但是在缓冲池中的一些数据脏页还是会刷新回磁盘。
  • 2表示不完成 full purge和 merge insert buffer操作,也不将缓冲池中的数据脏页写回磁盘,而是将日志都写入日志文件。这样不会有任何事务的丢失,但是下次MySQL数据库启动时,会进行恢复操作(recovery)。

当正常关闭 MySQL数据库时,下次的启动应该会非常“正常”。但是如果没有正常地关闭数据库,如用kill命令关闭数据库,在 MySQL数据库运行中重启了服务器,或者在关闭数据库时,将参数 innodb_fast_shutdown设为了2时,下次 MySQL数据库启动时都会对 InnoDB存储引擎的表进行恢复操作。

参数 innodb_force_recovery影响了整个 InnoDB存储引擎恢复的状况。该参数值默认为0,代表当发生需要恢复时,进行所有的恢复操作,当不能进行有效恢复时,如数据页发生了 corruption, MySQL数据库可能发生宕机( crash),并把错误写入错误日志中去。

但是,在某些情况下,可能并不需要进行完整的恢复操作,因为用户自己知道怎么进行恢复。比如在对一个表进行 alter table操作时发生意外了,数据库重启时会对InnoDB表进行回滚操作,对于一个大表来说这需要很长时间,可能是几个小时。这时用户可以自行进行恢复,如可以把表删除,从备份中重新导入数据到表,可能这些操作的速度要远远快于回滚操作。

参数 innodb_force_recovery还可以设置为6个非零值:1~6。大的数字表示包含了前面所有小数字表示的影响。具体情况如下:

  • 1( SRV_FORCE_IGNORE_CORRUPT):忽略检查到的 corrupt页。
  • 2( SRV_FORCE_NO_BACKGROUND):阻止 Master Thread线程的运行,如 Master Thread线程需要进行 full purge操作,而这会导致 crash
  • 3( SRV_FORCE_NO_TRX_UNDO):不进行事务的回滚操作。
  • 4( SRV_FORCE_NO_IBUF_MERGE):不进行插入缓冲的合并操作。
  • 5( SRV_FORCE_NO_UNDO_LOG_SCAN):不查看撤销日志( Undo log), InnoDB存储引擎会将未提交的事务视为已提交。
  • 6( SRV_FORCE_NO_LOG_REDO):不进行前滚的操作。

需要注意的是,在设置了参数 innodb_force_recovery大于0后,用户可以对表进行select、 create和drop操作,但 Insert、 update和 delete这类DML操作是不允许的现在来做一个实验,模拟故障的发生。在第一个会话中( session),对一张接近1000万行的 InnoDB存储引擎表进行更新操作,但是完成后不要马上提交:

mysql>START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql>UPDATE profile set password='';
Query OK, 9587770 rows affected (7 min 55.73 sec)
Rows matched: 9999248 Changed: 9587770 Warnings: 0

START TRANSACTION语句开启了事务,同时防止了自动提交(auto commit)的发生, UPDATE操作则会产生大量的UNDO日志( undo log)。这时,人为通过kt命令杀掉 MySQL数据库服务器。

通过kill命令可以模拟数据库的宕机操作。下次 MySQL数据库启动时会对之前的UPDATE事务进行回滚操作,而这些信息都会记录在错误日志文件(默认后缀名为.err中。如果査看错误日志文件,可得如下结果:

image.png

可以看到,采用默认的策略,即将 innodb force recovery设为0, InnoDB会在每次启动后对发生问题的表进行恢复操作。通过错误日志文件,可知这次回滚操作需要回滚8867280行记录,差不多总共进行了9分钟。

再做一次同样的测试,只不过这次在启动 MySQL数据库前,将参数 innodb_force_recovery设为3,然后观察 InnoDB存储引擎是否还会进行回滚操作。查看错误日志文件,可得:

image.png

这里出现了“!!!" InnoDB警告已经将 innodb force recovery设置为3,不会进行回滚操作了,因此数据库很快启动完成了。但是用户应该小心当前数据库的状态,并仔细确认是否不需要回滚事务的操作。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
4月前
|
监控 关系型数据库 MySQL
10亿数据如何最快速插入MySQL:技术干货分享
【8月更文挑战第2天】在大数据时代,处理并快速插入数十亿条数据到MySQL数据库是许多企业面临的关键挑战。本文将深入分享一系列高效的技术策略和实战经验,帮助读者优化这一过程,确保数据能够快速、准确地进入数据库系统。
223 1
|
16天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。
|
1月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
116 3
|
2月前
|
XML 关系型数据库 MySQL
MySQL 导出某些数据的技术详解
MySQL 导出某些数据的技术详解
155 2
|
3月前
|
存储 关系型数据库 MySQL
技术解析:MySQL中取最新一条重复数据的方法
以上提供的两种方法都可以有效地从MySQL数据库中提取每个类别最新的重复数据。选择哪种方法取决于具体的使用场景和MySQL版本。子查询加分组的方法兼容性更好,适用于所有版本的MySQL;而窗口函数方法代码更简洁,执行效率可能更高,但需要MySQL 8.0及以上版本。在实际应用中,应根据数据量大小、查询性能需求以及MySQL版本等因素综合考虑,选择最合适的实现方案。
428 6
|
2月前
|
关系型数据库 MySQL 数据库
MySQL技术深度解析:每次最大插入条数探秘
MySQL技术深度解析:每次最大插入条数探秘
58 0
|
2月前
|
关系型数据库 MySQL 数据库管理
MySQL技术指南:如何更改数据字段的前几位数字
MySQL技术指南:如何更改数据字段的前几位数字
66 0
|
2月前
|
消息中间件 监控 关系型数据库
MySQL数据实时同步到Elasticsearch:技术深度解析与实践分享
在当今的数据驱动时代,实时数据同步成为许多应用系统的核心需求之一。MySQL作为关系型数据库的代表,以其强大的事务处理能力和数据完整性保障,广泛应用于各种业务场景中。然而,随着数据量的增长和查询复杂度的提升,单一依赖MySQL进行高效的数据检索和分析变得日益困难。这时,Elasticsearch(简称ES)以其卓越的搜索性能、灵活的数据模式以及强大的可扩展性,成为处理复杂查询需求的理想选择。本文将深入探讨MySQL数据实时同步到Elasticsearch的技术实现与最佳实践。
169 0
|
4月前
|
SQL 存储 关系型数据库
mysql加索引真的会锁表吗?揭秘背后的技术细节与规避策略
【8月更文挑战第16天】在数据库管理中,添加索引能大幅提升查询效率。MySQL执行此操作时的锁定行为常引起关注。文章详细解析MySQL中索引添加时的锁定机制及其原理。不同存储引擎及SQL语句影响锁定策略:MyISAM需全表锁定;InnoDB提供更灵活选项,如使用`ALTER TABLE... LOCK=NONE`可在加索引时允许读写访问,尽管可能延长索引构建时间。自MySQL 5.6起,在线DDL技术可进一步减少锁定时间,通过`ALGORITHM=INPLACE`和`LOCK=NONE`实现近乎无锁的表结构变更。合理配置这些选项有助于最小化对业务的影响并保持数据库高效运行。
534 4

推荐镜像

更多
下一篇
DataWorks