Mysql

將 mysql 5.1 轉儲導入 5.5 時出現“列的顯示寬度超出範圍”錯誤

  • April 23, 2014

我正在遷移到新伺服器,並嘗試將我的數據庫從 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 伺服器,除非出現錯誤或回歸。

如果您沒有依賴於這些視圖的任何視圖,您應該能夠簡單地從轉儲文件中刪除虛擬表定義,然後應該可以毫無問題地載入。

這是一個來自轉儲文件的範例,刪除了一些噪音。

對於其他表,在刪除目標上已存在的任何表或視圖後,將創建虛擬表:

--
-- 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