列不能從“int”類型轉換為“bigint(20) unsigned”類型?
我有一個 Percona MySQL 集群,有一個 master 和幾個 slave。他們每個人都執行 MySQL 的“Ver 14.14 Distrib 5.5.40-36.1”。複製是基於行的。
我只在從屬的一張表上執行了一個更改查詢。計劃是在所有從屬伺服器上執行此查詢,然後進行主切換,因為我們無法將表鎖定在主伺服器上。
查詢是:
ALTER TABLE order_item_units MODIFY parent_id BIGINT(20) unsigned ;
當我使用 檢查從屬伺服器時發布此資訊
show slave status
,我看到複製被破壞並出現以下錯誤:表“database_name.order_item_units”的第 3 列無法從“int”類型轉換為“bigint(20) unsigned”類型
當我檢查該列時,它確實轉換為
BIGINT
.現在我無法解決這個問題。我確實停止了奴隸並啟動了奴隸,沒有幫助。確實停止了從站和 MySQL 重新啟動,沒有幫助。做了一個跳過計數器,也沒有幫助。
要麼該列不應該被轉換,那麼錯誤就會是公正的,但可能根本不應該有任何錯誤。
如果該列確實得到了轉換,那麼為什麼會出現錯誤?
任何線索我在這裡想念什麼?
在您的特定情況下設置
slave_conversion_type=ALL_NON_LOSSY
會有所幫助。在從站上執行這些命令:STOP SLAVE; SET GLOBAL SLAVE_TYPE_CONVERSIONS=ALL_NON_LOSSY; START SLAVE; SHOW SLAVE STATUS\G
從文件中:
此模式允許進行不需要截斷或對源值進行其他特殊處理的轉換;也就是說,它允許在目標類型的範圍比源類型更寬的情況下進行轉換。
我不確定您為什麼會收到該錯誤。我有 2 個解決方案。如果您的數據確實無法轉換為無符號 bigint,則該解決方案會給您一個錯誤。
ALTER TABLE `order_item_units` ADD COLUMN `parent_id2` BIGINT(255) UNSIGNED AFTER `parent_id`; UPDATE `order_item_units` SET `parent_id2` = `parent_id`; SELECT * FROM `order_item_units` WHERE `parent_id2` != `parent_id` OR `parent_id` IS NULL;
驗證來自第三個查詢的數據。一旦您對數據到位感到滿意,請刪除舊列。然後將新列重命名為舊列名。您必須在刪除之前驗證您的數據。
ALTER TABLE `order_item_units` DROP COLUMN `parent_id`; ALTER TABLE `order_item_units` CHANGE `parent_id2` `parent_id` BIGINT(255) UNSIGNED;
不要忘記向新列添加任何約束。
您也可以對臨時表執行相同的過程,或者使用新列定義創建新表。然後選擇你的舊表。驗證您的數據。通過將“_old”附加到原始表來重命名它。然後將更正後的表重命名為原始表名