在简单转储导入设置中,mysql ERROR 1071(指定密钥太长;最大密钥长度为1000字节)

Vik*_*rón 1 mysql mysql-error-1071

在服务器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
Run Code Online (Sandbox Code Playgroud)

在服务器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
Run Code Online (Sandbox Code Playgroud)

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

可以是版本问题吗?我怀疑没有.

如果我使用--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
Run Code Online (Sandbox Code Playgroud)

到底是怎么回事?

我的意思是除了解决这个问题之外,我想了解哪些设置会影响简单的转储导入行为,以及为什么这些设置在我的转储文件中不显式并且设置为t import.

我不想调试实际错误,这必须在高级别上解决.

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

[mysqld]
skip-innodb
Run Code Online (Sandbox Code Playgroud)

通过简单地删除此选项并重新启动mysqld,我的导入运行没有呱呱叫.我很伤心,例如像不可用发动机一件简单的事情是不值得的警告或错误,而不是造成默默回落至MyISAM的密钥长度问题.嗯.那么时间切换到posgresql?蒙戈?:)

Fre*_*ung 8

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

我最后一次看到这样的东西是因为配置问题:mysql无法在启动时设置innodb,所以它禁用了innodb.检查你的mysql错误日志,它应该标记启动期间遇到的任何问题.例如,InnoDB的将拒绝初始化如果innodb_log_file_size设置不匹配的日志文件的大小(ib_logfile0,ib_logfile1,...)


FTR*_*RNX 7

这对我有用。

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;
Run Code Online (Sandbox Code Playgroud)

错误:“#1071 – 指定的键太长;导入 mysql db 时,最大密钥长度为 767 字节”