2010-09-06 26 views
1

J'ai une base de données en cours d'exécution sur un serveur 5.0.27. Je veux passer à un nouveau serveur 5.1.41.Conversion de 5.0.27 à 5.1.41, obtention d'erreurs de clé en double (1062)

J'ai mysqldump'd tous les fichiers. Lors de la restauration, je reçois une erreur

ERROR 1062 (23000) at line 21: Duplicate entry 'weiÃ' for key 'title' 

Je l'ai réduit l'échec jusqu'à ce script, que je peux courir et il échoue:

-- 
-- Table structure for table `word` 
-- 

set names utf8; 

DROP TABLE IF EXISTS `word`; 
CREATE TABLE `word` 
(
    `wordid` int (10) unsigned NOT NULL auto_increment, 
    `title` char (50) NOT NULL default '', 
    PRIMARY KEY (`wordid`), 
    UNIQUE KEY `title` (`title`) 
) ENGINE=MyISAM AUTO_INCREMENT=280707 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; 

-- 
-- Dumping data for table `word` 
-- 

LOCK TABLES `word` WRITE; 
INSERT INTO `word` VALUES 
(198036,'weis'), 
(241473, unhex('776569C39F')); 
UNLOCK TABLES; 

EDIT - changé UNHEX.

J'ai vérifié et revérifié tous les charset et les variables de classement entre les deux serveurs, et ils semblent identiques. Même s'ils ne l'étaient pas, je spécifie la collation moi-même.

Des indices quant à ce que je fais mal ici?

EDIT: voici la commande que je utilise pour vider la base de données:

mysqldump --add-drop-table --add-locks --disable-keys --lock-tables --quick -uusername -ppassword database > filename 

et charger

mysql -D$MYSQL_DB -u$MYSQL_USER -p$MYSQL_PASSWD < filename 

Comment puis-je vérifier les connexions de classement pour la client?

+0

Comment lancez-vous le vidage? Je me demande si c'est la collation pour la connexion client ... –

+0

édité pour ajouter mes commandes de sauvegarde/restauration. –

+0

Je viens de l'essayer et ça a bien fonctionné. J'utilise 5.1.41-3ubuntu12.6. Et vous? –

Répondre

1

D'un pote sur LiveJournal, j'ai découvert qu'il s'agissait d'un bug "correctif" entre 5.0 et 5.1: Ils ont changé le classement. Si vous lisez le rapport de bug, ils ont effectivement cassé il (weis et weiss ne devrait pas être équivalent). Mais ils ne vont pas le briser. Donc je devrai soit changer de collation (comme le suggère Dave Orr), soit éditer manuellement mes données.

http://bugs.mysql.com/bug.php?id=27877

0

Utilisez-vous le mysqldump & mysql de 5.1 de 5.0?
vous pouvez essayer différents combos.

La sourceDB peut-elle contenir des valeurs en double dans la colonne "unique"?
Supprimez la contrainte "UNIQUE KEY" et vérifiez quels enregistrements sont dupliqués dans le targetDB.
Cela pourrait donner un aperçu du problème.

1

Le problème spécifique est que dans utf8_general_ci, 'weis' et 'weiß' sont équivalents. Si vous voulez que 'weiß' soit égal à 'weiss', alors vous devriez utiliser utf8_unicode_ci. Cela réglera le problème du côté de l'importation (à moins que vous n'ayez «weiss» dans la base de données, mais que vous ayez vraiment un double). En supposant que la table d'origine est définie sur utf8_unicode_ci, vous n'avez pas remarqué la différence. Si ce n'est pas vrai, je n'ai aucune idée de la façon dont votre table est dans l'état dans lequel elle se trouve - mais passer au bon classement devrait résoudre votre problème.

0

Indiquez le jeu de caractères par l'option --default-character-set. C'est important.