2

在服务器 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 了吗?蒙哥?:)

4

3 回答 3

8

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

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

于 2012-06-03T21:29:18.653 回答
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;

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

于 2017-06-13T15:46:21.740 回答
0

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

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

于 2014-08-06T11:44:37.140 回答