2010-06-15 5 views
2

Que puis-je faire pour m'assurer que la réplication utilisera latin1 au lieu de utf-8?charsets dans la réplication MySQL

Je migre entre un serveur MySQL 5.1.22 (maître) sur un système Linux et un serveur MySQL 5.1.42 (esclave) sur un système FreeBSD. Ma réplication fonctionne bien, mais quand des caractères non-ascii sont dans mes varchar, ils deviennent "bizarres". Linux/MySQL 5.1.22 montre les variables de jeu de caractères suivantes:

character_set_client=latin1 
character_set_connection=latin1 
character_set_database=latin1 
character_set_filesystem=binary 
character_set_results=latin1 
character_set_server=latin1 
character_set_system=utf8 
character_sets_dir=/usr/share/mysql/charsets/ 
collation_connection=latin1_swedish_ci 
collation_database=latin1_swedish_ci 
collation_server=latin1_swedish_ci 

Alors que FreeBSD montre

character_set_client=utf8 
character_set_connection=utf8 
character_set_database=utf8 
character_set_filesystem=binary 
character_set_results=utf8 
character_set_server=utf8 
character_set_system=utf8 
character_sets_dir=/usr/local/share/mysql/charsets/ 
collation_connection=utf8_general_ci 
collation_database=utf8_general_ci 
collation_server=utf8_general_ci 

la configuration de ces variables de la CLI MySQL n'a pas d'effet, et en les replaçant dans my.cnf ou à la ligne de commande fait que le serveur ne démarre pas.

Bien sûr, les deux serveurs ont créé les tables en question de la même manière, dans ce cas avec DEFAULT CHARSET = latin1. Permettez-moi de vous donner un exemple:

CREATE TABLE `test` (
    `test` varchar(5) DEFAULT NULL 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 

Quand je le maître ne, dans un terminal Latin1, « INSERT INTO de test (« æøå ») », cela devient l'esclave, quand je le sélectionner dans une terminal basé sur latin1

+--------+ 
| test | 
+--------+ 
| æøå | 
+--------+ 

sur un terminal basé UTF-8 sur l'esclave de réplication, test contient:

+--------+ 
| test | 
+--------+ 
| æøå | 
+--------+ 

donc, ma conclusion est qu'il est converti en UTF8, même si la définition de la table est latin 1. Est-ce une conclusion correcte?

Bien sûr, sur le maître, dans un terminal latin1, il dit encore:

+------+ 
| test | 
+------+ 
| æøå | 
+------+ 

Puisque les deux jeux de caractères du système sont utf-8, si je mets les deux bornes à utf-8 et de faire à nouveau " INSERT INTO de test ('æøå') » sur le maître avec un terminal utf-8, sur l'esclave avec utf-8 je reçois:

+------------+ 
| test  | 
+------------+ 
| æøà | 
+------------+ 

Si ma conclusion est correcte, toutes mes données répliquées est converti en utf8 (si c'est utf8, il est traité comme latin1 et converti en utf8), alors que toutes les anciennes données de la table sont, comme la CRE ATE TABLE suggère, latin1. J'adorerais tout convertir en utf-8 si ce n'était le fait que les applications héritées reposent sur latin1, donc je dois le garder en latin1 tant qu'elles existent.

Que puis-je faire pour m'assurer que la réplication lit latin1, le traite comme latin1 et l'écrit sur l'esclave comme latin1?

Vive

Nik

Répondre

0

En général, vous devez utiliser le même fichier de configuration exacte et la version de MySQL sur l'esclave (sauf pendant les mises à niveau/scénarios de migration, et un certain nombre de choses qui doivent être différentes sur esclaves comme server_id). Vous devrez programmer votre configuration de base de données pour que vos serveurs DB fassent partie de votre déploiement de logiciel. Il est essentiel que tous les serveurs de bases de données, y compris ceux situés dans des environnements hors production, utilisent exactement la même configuration.

L'échec de la synchronisation des configs entraînera des bogues inattendus. Je ne sais pas pourquoi vous ressentez le besoin d'exécuter différents systèmes d'exploitation sur vos différents serveurs, mais vous allez rendre la vie plus difficile pour votre personnel d'Ops si vous le faites.

1

La réplication entre des serveurs dont les paramètres globaux character_set_% et collation% sont différents n'est pas prise en charge.

http://dev.mysql.com/doc/refman/5.6/en/replication-features-charset.html

-- on both servers check the output of... 
SHOW VARIABLES LIKE 'char%'; 
SHOW VARIABLES LIKE 'collat%'; 

non seulement peut échouer si la réplication ensembles sont différents & classements, mais il peut en résulter différents ordres de tri et perte de caractères pendant ensembles de conversion/classements. L'ordre de tri peut avoir des conséquences sur l'insertion/la mise à jour si vous utilisez une réplication basée sur une instruction. Il est préférable de configurer le nouveau serveur pour utiliser les mêmes ensembles et classements que l'ancien serveur. Cela garantira que la réplication fonctionne correctement. Vous devez également vous assurer que la base de données, les tables et les colonnes ont toutes les mêmes classements entre maître et esclave. Une fois que vous avez migré vers le nouveau serveur, vous pouvez modifier le classement & avec des outils tels que 5.6 modification de schéma en ligne ou pt-online-schema-change depuis percona toolkit.

Je recommande également l'exécution de la table de contrôle pt-table de percona pour vous assurer que vos tables n'ont pas divergé lors de la réplication ou de l'exportation/importation initiale.

voir ici pour plus d'informations sur l'impact des différences:

à tous ceux qui utilisent Amazon RDS, gardez à l'esprit les paramètres par défaut de mysql 5.6 utilisent mixte utf8 (mb3) et latin1 (pour le serveur et la base de données). vous devez remplacer ceux avec un groupe de paramètres personnalisés si la réplication de non-RDS vers/depuis RDS (correspondant aux serveurs source/destination).

Questions connexes