將 mysql 5.1 轉儲導入 5.5 時出現“列的顯示寬度超出範圍”錯誤
我正在遷移到新伺服器,並嘗試將我的數據庫從 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` ...