web-dev-qa-db-fra.com

La colonne ne peut pas être convertie de type 'int' to Tape 'Bigint (20) non signé'?

J'ai un cluster de Percona MySQL, avec un maître et quelques esclaves. Chacun d'entre eux est en cours d'exécution "VER 14.14 DISTRIC 5.5.40-36.1" de MySQL. La réplication est basée sur la ligne.

J'ai dirigé une requête d'alter sur l'une des tables de l'esclave uniquement. Le plan consiste à exécuter cette requête sur tous les esclaves, puis à effectuer un commutateur principal car nous ne pouvons pas nous permettre de verrouiller des tables en maître.

La requête est:

ALTER TABLE order_item_units 
MODIFY parent_id BIGINT(20) unsigned ;

Et postez ceci quand j'ai vérifié l'esclave en utilisant show slave status, Je vois que la réplication est cassée avec l'erreur suivante:

Colonne 3 de Table 'Basey_Name.Order_Item_units' ne peut pas être converti de type 'int' to Tape 'Bigint (20) non signé'

Et quand j'ai vérifié la colonne, il s'est converti en BIGINT.

Et maintenant je ne suis pas capable de résoudre ce problème. J'ai arrêté d'arrêter l'esclave et de commencer l'esclave, n'aide pas. Atté l'esclave et le redémarrage de MySQL, n'a pas aidé. A fait un compteur de saut, n'a pas aidé non plus.

Soit la colonne ne doit pas avoir converti, alors l'erreur aurait d'être juste, mais peut-être peut-être n'aurait pas dû être une erreur du tout.

Et si la colonne est convertie, alors pourquoi l'erreur?

Toute idée de ce que je manque ici?

4
Gautam Somani

Je ne sais pas pourquoi vous obtenez cette erreur. J'ai 2 solutions. Les solutions vous donneront une erreur si vos données ne peuvent vraiment pas être converties en Bigint non signé.

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;

Vérifiez les données de la 3ème requête. Une fois que vous êtes à l'aise que les données sont en place, laissez tomber l'ancienne colonne. Puis renommez la nouvelle colonne sur le nom de la colonne ancien. Il est impératif que vous vérifiez vos données avant de tomber.

ALTER TABLE `order_item_units` DROP COLUMN `parent_id`;
ALTER TABLE `order_item_units` CHANGE `parent_id2` `parent_id` BIGINT(255) UNSIGNED;

N'oubliez pas d'ajouter des contraintes à la nouvelle colonne.

Vous pouvez également faire le même processus avec une table temporaire OR Création d'une nouvelle table avec la nouvelle définition de colonne. Ensuite, sélectionnez votre ancienne table. Vérifiez vos données. Renommez votre table d'origine en ajoutant "_OLD". Puis renommez votre table corrigée au nom de la table d'origine

1
Nathan

Dans votre cas spécifique réglage 'esclave_conversion_type = all_non_lossy' aiderait. Exécuter sur l'esclave:

STOP SLAVE; SET GLOBAL SLAVE_TYPE_CONVERSIONS=ALL_NON_LOSSY; START SLAVE; SHOW SLAVE STATUS\G

Pour plus d'informations, lisez ici: https://dev.mysql.com/doc/mysql-replication-excerpt/5.5/fr/replication-features-Different-Data-Types.html

0
Nopius