mysql ERROR 1071 (Specified key was too long; max key length is 1000 bytes) in simple dump-import se

Posted

技术标签:

【中文标题】mysql ERROR 1071 (Specified key was too long; max key length is 1000 bytes) in simple dump-import setting【英文标题】: 【发布时间】:2012-06-08 02:05:45 【问题描述】:

在服务器 1 上转储 mysql 数据库

$ mysql --version
mysql  Ver 14.14 Distrib 5.1.54, for debian-linux-gnu (x86_64) using readline 6.2
$ mysqldump -u root -p db > db.sql

在服务器 2 上导入

$ mysql --version
mysql  Ver 14.12 Distrib 5.0.95, for unknown-linux-gnu (x86_64) using readline 5.1
$ mysql -u root -p db < db.sql
ERROR 1071 (42000) at line 807: Specified key was too long; max key length is 1000 bytes

我知道关于这个错误有很多问题和答案,但它仍然让我感到困惑。

会不会是版本问题?我怀疑没有。

如果我使用 --force 选项运行它,它会变得更加怪异:

ERROR 1071 (42000) at line 807: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 847: Table 'db.users' doesn't exist
ERROR 1146 (42S02) at line 848: Table 'db.users' doesn't exist
ERROR 1146 (42S02) at line 849: Table 'db.users' doesn't exist
ERROR 1146 (42S02) at line 850: Table 'db.users' doesn't exist

发生了什么事?

我的意思是除了解决这个问题之外,我想了解哪些设置会影响简单的转储导入操作,以及为什么这些设置不能在我的转储文件中明确显示并设置为导入。

我宁愿不必调试实际错误,这必须在高层次上解决。

更新:解决方案 弗雷德里克为我指出了正确的方向。基本上我的转储试图用 INNODB 引擎设置 db,但服务器 2 上的 mysql 在 /etc/my.cnf 中

[mysqld]
skip-innodb

只需删除此选项并重新启动 mysqld,我的导入运行就不会发出呱呱声。 我很伤心这样一个简单的事情,比如一个不可用的引擎不值得警告或错误,而不是因为默默地退回到 myISAM 而导致的密钥长度问题。唔。那么是时候切换到 posgresql 了吗?蒙哥? :)

【问题讨论】:

你在使用innodb吗?两台机器上都启用了innodb吗? (检查 show variables 输出中的 has_innodb 变量) @FrederickCheung 在服务器 1 上是,在服务器 2 上禁用。 【参考方案1】:

听起来 innodb 在第二台机器上被禁用了,所以 mysql 默默地回退到具有不同限制的 myisam:每个键 1000 字节而不是 3500 字节

我上次看到这样的事情是因为配置问题:mysql 无法在启动时设置 innodb,因此它禁用了 innodb。检查你的 mysql 错误日志,它应该标记在启动过程中遇到的任何问题。例如,如果innodb_log_file_size 设置与日志文件的大小不匹配(ib_logfile0ib_logfile1,...),innodb 将拒绝初始化

【讨论】:

如果禁用了innodb,为什么会出现问题?根据消息来源,它的限制是 767 字节而不是 1000。我检查了 mysqld 日志但没有给出任何投诉。感谢您的帮助 Innodb 限制为每列 767,总密钥长度为 3500(例如,2 765 字节列上的密钥(例如 UTF8 varchar(255) 很好。Myisam 限制为所有列 1000,所以 2 UTF8 varchar(255) 上的一个键会达到 1000 字节的限制。MySQL 可以将其错误分散到多个错误日志中 - 确保你检查了所有这些 感谢您的帮助弗雷德。除了 /var/lib/mysql/domain.err 之外,我找不到其他日志,即使是这个,我也必须通过查看 /usr/bin/mysqld_safe 脚本代码才能找到。所以如果你认为这是一个 innodb 问题,你能告诉我如何为我的数据库启用它。【参考方案2】:

此外,如果您的系统是 64 位并且您正在从 yum(存储库默认)运行 MySQL,当您尝试从其他系统恢复数据库时会看到此错误。我不知道为什么“yum install mysql mysql-devel mysql-server”,他们只是用32位运行。

所以,在这种情况下,请从 Percona 或 Marina 安装和使用 MySQL(当然是 64 位版本)

【讨论】:

【参考方案3】:

这对我有用。

mysql -u USERNAME -p

use DATABASENAME;

set global innodb_large_prefix=on;
set global innodb_file_format=Barracuda;
set global innodb_file_per_table=true;

Error: “#1071 – Specified key was too long; max key length is 767 bytes” when import mysql db

【讨论】:

以上是关于mysql ERROR 1071 (Specified key was too long; max key length is 1000 bytes) in simple dump-import se的主要内容,如果未能解决你的问题,请参考以下文章

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes

错误:#1071 - 指定的密钥太长;最大密钥长度为 1000 字节 - mysql 5.0.91

laravel5.5 Syntax error or access violation: 1071 Specified key was too long

Error in library(e1071) : there is no package called 'e1071'

Laravel: Mediable migration error 语法错误或访问冲突:1071 Specified key was too long;最大密钥长度为 1000 字节

ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes