Ошибка ведомого сервера репликации MySQL 22


У меня возникли проблемы с репликацией MySQL на стороне slave с ошибкой 22, в частности, об ошибке charset.

Ошибка заявила, что она не может найти кодировку '#45', которую я нахожу странной, так как используемый запрос утверждает DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci, и я проверил на charsetIndex.xml, и она действительно существует.

Мастер: Server version: 5.5.30-log

Ведомое устройство: Server version: 5.1.66-log

Текущее состояние репликации:

mysql> show slave status G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.10.2.21
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000024
          Read_Master_Log_Pos: 1065715871
               Relay_Log_File: mysqld-relay-bin.000029
                Relay_Log_Pos: 86980698
        Relay_Master_Log_File: mysql-bin.000024
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 22
                   Last_Error: Error 'Character set '#45' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file' on query. Default database: 'db_businesslounge-backup'. Query: 'CREATE DATABASE IF NOT EXISTS `db_businesslounge-backup` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 86980553
              Relay_Log_Space: 1065720589
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 22
               Last_SQL_Error: Error 'Character set '#45' is not a compiled character set and is not specified in the '/usr/share/mysql/charsets/Index.xml' file' on query. Default database: 'db_businesslounge-backup'. Query: 'CREATE DATABASE IF NOT EXISTS`db_businesslounge-backup` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci'

Кодировкаиндекс MySQL.xml:

<?xml version='1.0' encoding="utf-8"?>

<charsets max-id="99">

<copyright>
  Copyright (c) 2003, 2012,  Oracle and/or its affiliates. All rights reserved.

  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; version 2 of the License.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
</copyright>

<description>
This file lists all of the available character sets.
To make maintaining easier please:
 - keep records sorted by collation number.
 - change charsets.max-id when adding a new collation.
</description>
........
<charset name="latin1">
  <family>Western</family>
  <description>cp1252 West European</description>
  <alias>csisolatin1</alias>
  <alias>iso-8859-1</alias>
  <alias>iso-ir-100</alias>
  <alias>iso_8859-1</alias>
  <alias>iso_8859-1:1987</alias>
  <alias>l1</alias>
  <alias>latin1</alias>
  <collation name="latin1_german1_ci"   id="5"  order="German Duden"/>
  <collation name="latin1_swedish_ci"   id="8"  order="Finnish, Swedish">
    <flag>primary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="latin1_danish_ci"    id="15" order="Danish"/>
  <collation name="latin1_german2_ci"   id="31" order="German Phonebook"        flag="compiled"/>
  <collation name="latin1_spanish_ci"   id="94" order="Spanish"/>
  <collation name="latin1_bin"          id="47" order="Binary">
    <flag>binary</flag>
    <flag>compiled</flag>
  </collation>
  <collation name="latin1_general_ci"   id="48">
    <order>Dutch</order>
    <order>English</order>
    <order>French</order>
    <order>German Duden</order>
    <order>Italian</order>
    <order>Latin</order>
    <order>Portuguese</order>
    <order>Spanish</order>
  </collation>
  <collation name="latin1_general_cs"   id="49">
    <order>Dutch</order>
    <order>English</order>
    <order>French</order>
    <order>German Duden</order>
    <order>Italian</order>
    <order>Latin</order>
    <order>Portuguese</order>
    <order>Spanish</order>
  </collation>
</charset>
....
</charsets>

Кто-нибудь когда-либо испытывал эту особенность ошибка?

Нужны предложения, спасибо!

1 2

1 ответ:

Вы управляете новым хозяином и старым рабом. Это не поддерживаемая конфигурация.

Http://dev.mysql.com/doc/refman/5.5/en/replication-compatibility.html

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

I не думайте, что эта возможность (utf8mb4) существует в MySQL 5.1, о чем свидетельствует запрос ниже, что делает это еще одной причиной, почему вы никогда не запускаете версию на ведомом устройстве, которая ниже, чем версия на ведущем устройстве, и при выполнении обновлений вы всегда хотите обновить ведомое устройство в первую очередь.

SELECT * FROM information_schema.collations WHERE id = 45 возвращает значение, когда я запускаю его на MySQL 5.5 и 5.6, но не на 5.1.

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

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
START SLAVE SQL_THREAD;
Это деликатная операция, применимая только тогда, когда вы точно знаете, что делаете, и, вероятно, вы увидите последующие ошибки из-за этой же проблемы, поэтому вряд ли будет много пользы, если это не изолированный инцидент.

На светлой стороне, хотя это не идеально, чтобы обновить ведомое устройство, пока оно остановлено из-за ошибки репликации, шансы на то, что это действительно удастся, и вы сможете продолжить репликацию с точки, где она остановлена, довольно хороши.