AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 262566
Accepted
Googlebot
Googlebot
Asked: 2020-03-24 18:23:35 +0800 CST2020-03-24 18:23:35 +0800 CST 2020-03-24 18:23:35 +0800 CST

为什么 InnoDB 在恢复时会损坏表?

  • 772

设置时

innodb_fast_shutdown=0

MySQL 在关闭/崩溃之前丢弃所有不完整的事务。默认值为1,这对于保留不完整的事务是可以理解的。

然而,在恢复模式(例如,innodb_force_recovery = 6)中,MySQL 将所有未完成的事务视为已提交。由于事务不完整,这显然会损坏表。

当损坏整个表时保留不完整事务的目的是什么?

如果在某些情况下有必要,为什么不能像保存表innodb_force_recovery一样简单地删除所有未完成的事务(当它们无法提交时) ?innodb_fast_shutdown=0还是我错过了什么?

mysql innodb
  • 3 3 个回答
  • 513 Views

3 个回答

  • Voted
  1. Best Answer
    akuzminsky
    2020-03-25T14:20:27+08:002020-03-25T14:20:27+08:00

    innodb_fast_shutdown控制更改缓冲区,而不是重做日志。无论是什么值innodb_fast_shutdown,如果事务在关闭时未提交,它将无法在重新启动时存活。

    如果事务已提交,那么它是否会持续取决于 innodb_flush_log_at_trx_commit. 如果它是默认值 1,则事务将持续存在。如果 != 1,可能不会持续存在。

    现在,innodb_force_recovery. 这是可能的。当您在事务中运行 UPDATE 时,新记录将写入页面(在缓冲池中,页面变脏)。稍后,即使事务尚未提交,数据页也可以刷新到磁盘。当你不得不使用innodb_force_recovery这意味着你已经准备好牺牲数据一致性(这就是你所说的损坏的表吗?)只是为了取回一些数据。innodb_force_recovery=6InnoDB 试图挽救尽可能多的数据。它无法完成崩溃恢复过程,但新记录已写入页面 - 为什么不将其提供给用户?

    • 2
  2. Rick James
    2020-04-04T13:19:32+08:002020-04-04T13:19:32+08:00

    innodb_force_recovery在诉诸“6”之前,应该尝试 1 到 5 的值。他们做的“伤害”更少。

    Change Buffer 是一种用于更新索引块的“写缓存”。INSERTs/UPDATEs/DELETEs它通过延迟二级索引块的读取和写入来提供速度。更具体地说,在此类查询期间,非唯一索引不需要进行读取或写入。但它们最终必须完成。在某些情况下,“更改”可以显着“批量”以提高效率。

    关闭时刷新意味着执行所有读取-修改-写入操作以更新可能数千个索引块。但是启动会更快。

    等到重新启动后意味着找出丢失的内容并重建它。

    一些人使用的折衷方案是逐渐减少innodb_change_buffer_max_size(默认 = 25,表示 buffer_pool 的百分比),以便逐渐刷新更改缓冲区。这使得关机和启动都相对“快速”。

    • 1
  3. danblack
    2020-03-24T20:55:30+08:002020-03-24T20:55:30+08:00

    不完整事务的丢弃与innodb_fast_shutdown. 它仅影响它们是否在关闭之前回滚,或者在启动时恢复。

    >= 4 的 innodb_force_recovery 在手册中有注释“此值可能永久损坏数据文件” 。一旦你达到这个水平,如果你能得到任何回报,我将不胜感激:-)。

    • 0

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve