我正在迁移到一个新服务器,并试图将我的数据库从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)
。
编辑:它试图还原的表实际上是一个视图。
发布于 2014-04-23 11:53:18
这可能是您正在运行的MySQL 5.1版本中的一个bug,导致服务器在使用DESCRIBE
来了解视图的组合时向mysqldump
提供不正确的元数据。
http://bugs.mysql.com/bug.php?id=65379
背景:在创建引用表的视图时,必须先存在该表,然后才能创建引用该表的视图。因此,mysqldump创建所有表,然后创建所有视图。它解决了“视图依赖于表”的问题.但是,当视图引用其他视图时,引用的视图也必须存在于可以创建引用的视图之前。为了绕过这些半圆依赖关系而不必实际解决它们,mysqldump为每个视图生成一个虚拟占位符表,该视图首先具有相同的列.然后,删除每个虚拟表并用实际视图替换它。
错误导致mysqldump为这些虚拟占位符表生成无效的CREATE TABLE
语句。
您可以通过修复虚拟表定义来手动编辑现有的dumpfile,或者升级旧服务器并重新运行转储,或者--可能的话--使用最新的GA版本的MySQL附带的mysqldump版本,这个版本(我在内存中工作)还可能包含一个解决方案,避免在服务器返回无意义的元数据时生成错误的语句。版本的mysqldump为5.6是向后兼容的5.1服务器,排除错误或回归。
如果您没有依赖于这些视图的任何视图,您应该能够简单地从转储文件中移除虚拟表定义,然后这些文件应该没有问题地加载。
下面是一个垃圾文件中的一个例子,其中去除了一些噪音。
对于其他表,在删除目标上已经存在的任何表或视图后,将创建虚拟表:
--
-- Temporary table structure for view `staff_list`
--
DROP TABLE IF EXISTS `staff_list`;
/*!50001 DROP VIEW IF EXISTS `staff_list`*/;
...
/*!50001 CREATE TABLE `staff_list` (
`ID` tinyint NOT NULL,
...
) ENGINE=MyISAM */;
然后,在转储文件中,删除占位符表,创建真正的视图:
--
-- Final view structure for view `staff_list`
--
/*!50001 DROP TABLE IF EXISTS `staff_list`*/;
/*!50001 DROP VIEW IF EXISTS `staff_list`*/;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`mezzell`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `staff_list` AS select `s`.`staff_id` AS `ID` ...
https://dba.stackexchange.com/questions/63437
复制相似问题