кодировки в репликации MySQL - PullRequest
2 голосов
/ 15 июня 2010

Что я могу сделать, чтобы при репликации использовался latin1 вместо utf-8?

Я выполняю миграцию между сервером MySQL 5.1.22 (ведущим) в системе Linux и сервером MySQL 5.1.42 (ведомым) в системе FreeBSD.Моя репликация работает хорошо, но когда символы не ascii находятся в моих varchars, они становятся "странными".Linux / MySQL-5.1.22 показывает следующие переменные набора символов:

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

В то время как FreeBSD показывает

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

Установка любой из этих переменных из CLI MySQL не имеет никакого эффекта,и установка их в my.cnf или в командной строке приводит к тому, что сервер не запускается.

Конечно, на обоих серверах соответствующие таблицы созданы одинаково, в данном случае с DEFAULT CHARSET = latin1.Позвольте мне привести пример:

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

Когда я выполняю на мастере, в терминале Latin1, «INSERT INTO test VALUES ('æøå')», это становится на ведомом устройстве, когда я выбираю егос терминала на основе Latin1

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

На терминале на основе UTF-8 на ведомом устройстве репликации тест содержит:

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

Итак, я пришел к выводу, что он преобразуется в utf8, дажехотя определение таблицы - латинский.Это правильный вывод?

Конечно, на мастере, в терминале latin1, он по-прежнему говорит:

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

Так как оба системных набора символов являются utf-8, если я установлюоба терминала для utf-8 и снова выполните "INSERT INTO test VALUES (''øå')" на ведущем устройстве с терминалом utf-8, на ведомом устройстве с utf-8 я получаю:

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

Еслимой вывод верен, все мои реплицированные данные преобразуются в utf8 (если это utf8, они обрабатываются как latin1 и преобразуются в utf8), в то время как все старые данные в таблице, как предполагает CREATE TABLE, latin1.Я хотел бы преобразовать все это в utf-8, если бы не тот факт, что устаревшие приложения полагаются на то, что он является латиноамериканским1, поэтому мне нужно держать его в латиноамериканском1, пока они еще существуют.

Что можетЯ делаю так, чтобы репликация считывала латиницу 1, обрабатывает ее как латиницу 1 и записывает на ведомом устройстве как латынь 1?

Cheers

Nik

Ответы [ 2 ]

1 голос
/ 24 декабря 2014

репликация между серверами, где глобальные параметры character_set_% и параметры сортировки% различаются, не поддерживается.

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%';

не только может произойти сбой репликации, если наборы и параметры сортировки различаются, но это может привести к различным порядкам сортировки и потере символов во время наборов / сопоставлений преобразования.Порядок сортировки может влиять на такие вещи, как вставка / обновление, если используется репликация на основе операторов.

Лучше всего настроить новый сервер для использования тех же наборов и параметров сортировки, что и для старого сервера.это обеспечит правильную работу репликации.Вы также захотите убедиться, что база данных, таблицы и столбцы имеют одинаковые сопоставления между главным и подчиненным.после перехода на новый сервер вы можете изменить set & collation с помощью таких инструментов, как 5.6 онлайн-изменение схемы или pt-online-schema-change из percona toolkit.

Я также рекомендую запустить pcon-table-checkum для percona, чтобы сделатьубедитесь, что ваши таблицы не расходились во время репликации или первоначального экспорта / импорта.

см. здесь дополнительную информацию о влиянии различий:

для всехкто использует Amazon RDS, имейте в виду, что в настройках mysql 5.6 по умолчанию используется смешанный utf8 (mb3) и latin1 (для сервера и базы данных).Вы должны переопределить те, у которых есть пользовательская группа параметров, если репликация из не-RDS в / из RDS (соответствует исходному / целевому серверу).

0 голосов
/ 15 июня 2010

В общем случае вы должны использовать точно такой же файл конфигурации и версию mysql на ведомом устройстве (за исключением случаев, когда выполняются обновления / сценарии миграции, и некоторые вещи, которые должны отличаться на ведомых устройствах, например server_id).

Вы захотите написать скрипт для настройки базы данных, чтобы серверы БД были частью вашего программного развертывания.Очень важно, чтобы все серверы баз данных, в том числе и в непроизводственных средах, использовали одну и ту же конфигурацию.

Ошибка синхронизации настроек приведет к непредвиденным ошибкам.

Я не знаю, почему вы чувствуете необходимость запускать разные ОС на своих разных серверах, но если вы сделаете это, вы усложните жизнь своему персоналу.

...