我正在迁移到新服务器,并尝试将我的数据库从 5.1 移动到 5.5 服务器。
我创建了一个转储
mysqldump -u root -p --add-drop-database --triggers dbname > dbname.sql
当我尝试在新服务器上恢复它时,出现错误:
mysql -u root -p dbname < dbname.sql
ERROR 1439 (42000) at line nnnn: Display width out of range for column 'ID' (max = 255)
上校。定义为ID bigint(1536)
。
编辑:它试图恢复的表实际上是一个视图。
这很可能是您正在运行的 MySQL 5.1 版本中的一个错误,导致服务器在用于了解视图组成
mysqldump
时提供不正确的元数据。DESCRIBE
http://bugs.mysql.com/bug.php?id=65379
背景:每当您创建引用表的视图时,该表必须已经存在,然后您才能创建引用它的视图。因此,mysqldump 创建所有表,然后创建所有视图。这解决了“视图依赖于表”的问题......但是当视图引用其他视图时,被引用的视图也必须在创建引用它的视图之前存在。为了解决这些半圆形依赖关系而不必实际解决它们,mysqldump 为每个视图生成一个虚拟占位符表,首先使用视图具有的相同列...然后删除每个虚拟表并将其替换为实际看法。
CREATE TABLE
该错误导致 mysqldump为这些虚拟占位符表生成无效语句。您可以通过修复虚拟表定义来手动编辑现有转储文件,或者升级旧服务器并重新运行转储,或者 - 可能 - 使用 MySQL 的最新 GA 版本附带的 mysqldump 版本,其中(我是从内存工作,here)也可能包含一种解决方法,以避免在服务器返回无意义的元数据时尝试生成错误的语句。5.6 的 mysqldump 版本向后兼容 5.1 服务器,除非出现错误或回归。
如果您没有依赖于这些视图的任何视图,您应该能够简单地从转储文件中删除虚拟表定义,然后应该可以毫无问题地加载。
这是一个来自转储文件的示例,删除了一些噪音。
对于其他表,在删除目标上已存在的任何表或视图后,将创建虚拟表:
然后,在转储文件的更下方,删除占位符表并创建真实视图: