Ошибка ведомого сервера репликации 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 ответ:
Вы управляете новым хозяином и старым рабом. Это не поддерживаемая конфигурация.
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;
На светлой стороне, хотя это не идеально, чтобы обновить ведомое устройство, пока оно остановлено из-за ошибки репликации, шансы на то, что это действительно удастся, и вы сможете продолжить репликацию с точки, где она остановлена, довольно хороши.