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 / 问题 / 345532
Accepted
peppy
peppy
Asked: 2025-03-03 07:48:55 +0800 CST2025-03-03 07:48:55 +0800 CST 2025-03-03 07:48:55 +0800 CST

如何在 mysqldump 运行时截断 cron 作业中的表?防止出现错误 1412“表定义已更改”

  • 772

我有一个维护 cron 作业脚本,每 5 分钟运行一次,它会截断一个表,用维护数据重新填充它,然后在最后截断它。我还每天运行一个 mysqldump 脚本来备份我的所有表。我最近注意到备份中缺少一些表。经过进一步调查,我发现 mysqldump 抛出了这个错误:

Error 1412 "Table Definition Has Changed"

进一步研究之后,显然是因为我的 cron 作业脚本在 mysqldump 备份中间使用 TRUNCATE 清空表造成的。

我正在使用 --single-transaction 选项,但没有什么区别。

是否有某种方法可以让 mysqldump 继续运行,即使表在 mysqldump 运行时被截断(并且仍然备份该表)?这需要在没有 --ignore-table 选项的情况下完成。我知道如何做到这一点,但宁愿将所有维护表都包含在备份中,以防数据库必须从备份中完全恢复。

我能想到的唯一其他事情是使用“DELETE FROM table”而不是“TRUNCATE table”,但我必须检查所有网站上的所有脚本才能改变这一点。

mysql
  • 1 1 个回答
  • 37 Views

1 个回答

  • Voted
  1. Best Answer
    Bill Karwin
    2025-03-05T02:34:33+08:002025-03-05T02:34:33+08:00

    当使用时mysqldump --single-transaction,有记录表明其他会话不应使用TRUNCATE TABLE或其他 DDL。

    https://dev.mysql.com/doc/refman/8.4/en/mysqldump.html说:

    在转储过程中--single-transaction,为了确保转储文件有效(正确的表内容和二进制日志坐标),其他任何连接都不应使用以下语句:,,,,,。ALTER TABLE一致性读取与这些语句并不隔离,因此在要转储的表上使用它们可能会导致mysqldump 执行的检索表内容的操作获得不正确的内容或失败。CREATE TABLEDROP TABLERENAME TABLETRUNCATE TABLESELECT

    https://dev.mysql.com/doc/refman/8.4/en/innodb-consistent-read.html说:

    一致性读取对某些 DDL 语句不起作用:

    • 一致性读取不适用于ALTER TABLE创建原始表的临时副本并在临时副本创建后删除原始表的操作。当您在事务中重新发出一致性读取时,新表中的行不可见,因为在创建事务快照时这些行并不存在。在这种情况下,事务将返回错误:ER_TABLE_DEF_CHANGED“表定义已更改,请重试事务”。

    本文档指定了创建临时副本的 DDL,但对于其他更改或截断表而不创建临时副本的 DDL,也会出现同样的错误。参见https://bugs.mysql.com/bug.php?id=116132

    使用 mysqldump 时有两种方法可以解决这个问题。

    1. 第一个解决方案是运行mysqldump --skip-lock-tables,而不使用--single-transaction选项。这会将每个表转储到其自己的快照中,因此如果另一个会话截断该表,则不会与 创建的较大快照发生冲突--single-transaction。

      此解决方案的缺点是您的备份将不一致。也就是说,您无法保证引用完整性,因为在转储期间表可能会被修改,并且转储中输出的一个表中的行可能会引用转储中不存在的另一个表中的行。

    2. 第二种解决方案是使用全局锁来阻止 DDL,就像TRUNCATE TABLE在转储运行时一样。您可以使用mysqldump --lock-all-tables来执行此操作。如果另一个会话尝试TRUNCATE TABLE,它将等到转储完成后全局锁被释放。

      此解决方案的缺点是所有其他 DDL 和 DML 也将被阻止。在转储运行时,您的数据库基本上处于停止服务状态(至少对于写入而言)。

    其他解决方案涉及使用不同的备份工具,或者需要一些代码更改,而您说您不想这样做。

    • 1

相关问题

  • 是否有任何 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