Mysql 尝试将表转换为InnoDB时出错
我在生产中有一台Percona 5.1服务器,它在我们的生产数据库中使用MyISAM表。为了支持DB事务,我需要将表更新到InnoDB。我们目前正在开发中使用MySQL 5.5,迁移脚本在simpleMysql 尝试将表转换为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
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再次在prod中输入代码>
- 然后做
显示错误代码>
- 执行
显示创建表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时,您会收到这些警告。