【问题标题】:(42000) Row size too large, from an Oracle dump to a MySQL dump(42000) 行大小太大,从 Oracle 转储到 MySQL 转储
【发布时间】:2022-10-17 22:56:17
【问题描述】:

我看过很多关于这个错误的帖子,但我发现的解决方案似乎不适用于我的情况。

我从 Oracle 数据库收到了一个相当大的(~150Go)转储文件。 我使用 OraDump 将其转换为 MySQL。但是,当我尝试在我的 MySQL 服务器中导入它时,我得到了臭名昭著的错误:

ERROR 111 (42000) at line 162936 : Row size too large. The maximum row size for the used table, not counting BLOBs, is 65535.
This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs.

我尝试增加 innodb_log_file_size 参数,删除严格模式,从 ImmoDB 切换到 myISAM,没有任何效果。

在我最后一次尝试中,我尝试将 -f 参数添加到转储导入中,希望只是挤过错误,但现在它似乎卡住了。

我不认为我可以更改表模式,因为它们是在 150Go 转储文件中创建的,我什至不知道哪些表/列有问题。

有什么办法吗?

编辑:我设法找到导致该错误的表,并发现它在我尝试声明它时发生:

#
# Table structure for table 'F_TABLE_EXAMPLE'
#

DROP TABLE IF EXISTS `F_TABLE_EXAMPLE`;
CREATE TABLE `F_TABLE_EXAMPLE` (
  `COL_1` BIGINT,
  `COL_2` VARCHAR(10) CHARACTER SET utf8,
  `COL_3` BIGINT,
  `COL_4` BIGINT,
  `COL_5` DECIMAL(16,2),
  `COL_6` DECIMAL(16,2),
  `COL_7` VARCHAR(5) CHARACTER SET utf8,
  `COL_8` DATETIME,
  `COL_9` VARCHAR(50) CHARACTER SET utf8,
  `COL_10` VARCHAR(4000) CHARACTER SET utf8,
  `COL_11` VARCHAR(4000) CHARACTER SET utf8,
  `COL_12` VARCHAR(4000) CHARACTER SET utf8,
  `COL_13` VARCHAR(4000) CHARACTER SET utf8,
  `COL_14` VARCHAR(4000) CHARACTER SET utf8,
  `COL_15` VARCHAR(4000) CHARACTER SET utf8
) ENGINE=InnoDB;

如果我删除 COL_15,则没有错误,但包含它我会得到通常的错误。 (因为错误从那里开始,我只包括了 COL_15,但我的声明中有很多其他列)

【问题讨论】:

    标签: mysql oracle innodb dump myisam


    【解决方案1】:

    找出哪个表有问题的方法是一次转储和恢复一个表。这将确定哪些表有问题。然后,如有必要,从导致错误的表中转储和恢复较小的行子集。继续细分问题,直到将问题缩小到罪魁祸首。

    此过程可能需要多次尝试。

    不要更改存储引擎。这个特殊的错误一般是关于 MySQL 的,而不是任何特定的存储引擎。

    此错误与 innodb_log_file_size 无关。 (一旦你克服了这个错误,你可能会收到一个关于 innodb_log_file_size 的后续错误——它必须是最大的单个 BLOB 或 TEXT 值的大小的 10 倍)。

    不要试图通过“强制”它或禁用严格模式来绕过错误。如果它确实允许这样做,它只会破坏您的数据。

    错误消息准确地告诉您需要做什么:

    您必须将某些列更改为 TEXT 或 BLOB。

    这意味着更改 MySQL 中的表定义。您可能不必在 Oracle 中更改它。

    如果你不能改变表定义,那么对不起,你不能把这个数据导入 MySQL。

    如果您需要有关如何解决此问题的任何建议,请发布来自 Oracle 的原始表的 DDL,以及您尝试在 MySQL 中导入的表的 DDL。请在 Oracle 中使用 DBMS_METADATA.GET_DDL() 和在 MySQL 中使用 SHOW CREATE TABLE 以获取文本形式的 DDL,而不是屏幕截图。

    【讨论】:

    • 谢谢,我将首先重新进行 Oracle -> MySQL 转换,只保留我感兴趣的少数表,以减少转储的大小。然后我会一一导入,直到找到罪魁祸首。
    • 我刚刚添加了表格声明,如果这可以帮助你
    【解决方案2】:

    看到有问题的表的CREATE TABLE 可能足以确定下一步该做什么。

    如果加载加载了一些但不是全部的表,你能确定哪个表是“最后一个”(而不是完全重新加载)或“下一个”要重新加载的吗?

    关于“行大小”的错误,关于BLOB 等的讨论可能不那么相关,因为列有一个数据类型。特别是,将 Engine=InnoDB 表中的列从 VARCHAR 更改为 TEXT 将无济于事。

    问题可能在于列太多和/或“行格式”对很多列的宽容度较低。

    更多关于限制:http://mysql.rjweb.org/doc.php/limits

    更多的

    似乎“第 162936 行”比大多数都大。为了加载大排...

    检查net_buffer_lengthmax_allowed_packet的当前值,然后...在配置文件中增加net_buffer_lengthmax_allowed_packet(或者在调用服务器时)。

    【讨论】:

    • 我刚刚添加了导致错误的 CREATE TABLE
    • @Alan - 为该表分配了什么行格式?你能提供“162936行”吗? (目前尚不清楚导致错误消息的原因。)
    • 对不起,我忘了补充;只有表定义,我得到了同样的错误,但是关于第 6 行(以“CREATE TABLE”开头的那个)
    • 我又捅了一刀。
    猜你喜欢
    • 2014-09-29
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多