Mysql

列不能從“int”類型轉換為“bigint(20) unsigned”類型?

  • February 4, 2022

我有一個 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”附加到原始表來重命名它。然後將更正後的表重命名為原始表名

引用自:https://dba.stackexchange.com/questions/107125