Mysql 尝试将表转换为InnoDB时出错

Mysql 尝试将表转换为InnoDB时出错,mysql,innodb,percona,Mysql,Innodb,Percona,我在生产中有一台Percona 5.1服务器,它在我们的生产数据库中使用MyISAM表。为了支持DB事务,我需要将表更新到InnoDB。我们目前正在开发中使用MySQL 5.5,迁移脚本在simpleALTER TABLE xyz ENGINE=InnoDB下运行良好查询。但是,在生产测试中(针对生产数据库的副本),我们得到了一个错误: mysql> ALTER TABLE `xyz` ENGINE=InnoDB; ERROR 1005 (HY000): Can't create tabl

我在生产中有一台Percona 5.1服务器,它在我们的生产数据库中使用MyISAM表。为了支持DB事务,我需要将表更新到InnoDB。我们目前正在开发中使用MySQL 5.5,迁移脚本在simple
ALTER TABLE xyz ENGINE=InnoDB下运行良好查询。但是,在生产测试中(针对生产数据库的副本),我们得到了一个错误:

mysql> ALTER TABLE `xyz` ENGINE=InnoDB;
ERROR 1005 (HY000): Can't create table 'InnoTest.#sql-644_dd133' (errno: 1478)
在开发服务器上,使用与生产测试相同的数据库转储:

mysql> ALTER TABLE `xyz` ENGINE=InnoDB;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 2

mysql> show warnings;
+---------+------+------------------------------------------------------------+
| Level   | Code | Message                                                    |
+---------+------+------------------------------------------------------------+
| Warning | 1478 | InnoDB: ROW_FORMAT=DYNAMIC requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=COMPACT.                       |
+---------+------+------------------------------------------------------------+
统计数据:

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+-------------------------------------------+
| Variable_name           | Value                                     |
+-------------------------+-------------------------------------------+
| innodb_version          | 5.1.73-14.11                              |
| protocol_version        | 10                                        |
| version                 | 5.1.73-rel14.11-log                       |
| version_comment         | Percona Server (GPL), 14.11, Revision 603 |
| version_compile_machine | x86_64                                    |
| version_compile_os      | unknown-linux-gnu                         |
+-------------------------+-------------------------------------------+

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+-------------------------+
| Variable_name           | Value                   |
+-------------------------+-------------------------+
| innodb_version          | 5.5.38                  |
| protocol_version        | 10                      |
| slave_type_conversions  |                         |
| version                 | 5.5.38-0ubuntu0.12.04.1 |
| version_comment         | (Ubuntu)                |
| version_compile_machine | x86_64                  |
| version_compile_os      | debian-linux-gnu        |
+-------------------------+-------------------------+
调试glowy.penguin:

mysql> ALTER TABLE `xyz` ENGINE=InnoDB;
ERROR 1005 (HY000): Can't create table 'InnoTest.#sql-644_df08c' (errno: 1478)
mysql> show errors;
+-------+------+------------------------------------------------------------+
| Level | Code | Message                                                    |
+-------+------+------------------------------------------------------------+
| Error | 1005 | Can't create table 'InnoTest.#sql-644_df08c' (errno: 1478) |
+-------+------+------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show create table visit;
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     | xyz | CREATE TABLE `xyz` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `some_field` int(11) DEFAULT NULL,
  `some_field` tinyint(2) DEFAULT '0',
  `some_field` enum('a','b') DEFAULT 'b',
  `some_field` varchar(200) DEFAULT NULL,
  `some_field` date DEFAULT NULL,
  `some_field` time DEFAULT NULL,
  `some_field` datetime DEFAULT NULL,
  `some_field` text,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC |
1 row in set (0.02 sec)

mysql> SELECT @@GLOBAL.sql_mode;
+-------------------+
| @@GLOBAL.sql_mode |
+-------------------+
|                   |
+-------------------+
1 row in set (0.00 sec)

mysql> SELECT @@SESSION.sql_mode;
+--------------------+
| @@SESSION.sql_mode |
+--------------------+
|                    |
+--------------------+
1 row in set (0.00 sec)

mysql> ALTER TABLE `xyz` ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
ERROR 1005 (HY000): Can't create table 'InnoTest.#sql-644_df08c' (errno: 1478)
mysql> ALTER TABLE `xyz` ENGINE=InnoDB ROW_FORMAT=COMPACT;
Query OK, 0 rows affected (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 0
开发服务器在my.cnf中没有任何InnoDB设置(默认Ubuntu 12.04 mysql服务器安装),生产服务器有以下设置:

innodb                         = FORCE
innodb_strict_mode             = 1
innodb_flush_method            = O_DIRECT
innodb_log_files_in_group      = 2
innodb_log_file_size           = 64M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 592M

k、 。。。所以OP没有反应。那很酷。这是关于该错误的mysql文档

  • 运行
    altertablexyzengine=InnoDB

  • 然后做
    显示错误

  • 执行
    显示创建表xyz

  • 查看您是否处于innodb严格模式。。。(我会在prod和non-prod中都这样做,以查看任何差异)
    SELECT@@GLOBAL.sql\u模式;选择@@SESSION.sql_模式

  • 从文档:如果您在InnoDB严格模式下运行,
    键块大小
    与除
    压缩
    以外的任何
    行格式
    相结合会生成错误,而不是警告,并且不会创建表

  • 使用您获得的信息和链接中的信息来确定您应该如何设置
    键块大小
    行格式
    ,以获取它

非prod db工作的原因是:

  • 使用任何其他
    行格式指定
    键块大小
    会生成一个警告,您可以使用
    显示警告
    查看该警告。但是,该表是非压缩的;指定的
    键块大小将被忽略)。(在非innodb严格模式下)
如果你想要更多的帮助,发布你得到的信息,我肯定可以提出建议。。。这可能是
altertablexyzengine=innodb ROW_FORMAT=COMPRESSED和/或使innodb模式设置与非prod db设置相同

但说真的。。。听起来prod处于innodb严格模式,而非prod则不是


innodb\u严格模式:
innodb_strict_mode选项控制innodb是否在strict mode下运行,
在通常被视为警告的情况下,会导致错误
(而基础陈述失败)。
此模式是MySQL 5.5.5及更高版本中的默认设置。

其中一个版本高于5.5.5,另一个版本低于5.5.5。默认值可能是不一致的

在“给我一个
显示创建表”
上问这个问题可能更好一些,请。。。你们。我们不需要dba。我想
ROW\u FORMAT=COMPACT
可能也是一个可行的选择。谢谢,我添加了更多信息。我无法从您要求的调试中看到太多信息,但COMPACT可以工作。不知道为什么,将开始阅读。
select@@GLOBAL.sql\u模式
对我有效。。。这里有一些关于检查它的更多信息:我真的认为Prod能够为您进行行格式转换b/c它不是在严格模式下。但是dev是这样的,所以它不能假设这种转换。@DaveO-您在'my.cnf'中的设置与innodb类似吗?添加了上述信息。这似乎是生产中设置的innodb_strict_模式导致的行格式问题。如上所述,它应该是开发中的默认值,因为它是5.5.38,但我只得到了警告。正如前面提到的,当innodb_strict_mode设置为OFF时,您会收到这些警告。