MySQL复制从属错误22

Sam*_*dam 2 mysql replication master-slave database-replication

我在从属端的MySQL复制有错误22,特别是关于charset错误.

该错误表明它找不到charset'#45',我发现它很奇怪,因为使用的查询是陈述的DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci,我确实检查了charset\Index.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'
Run Code Online (Sandbox Code Playgroud)

MySQL的charset\Index.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>
Run Code Online (Sandbox Code Playgroud)

有没有人遇到过这个特殊错误?

需要建议,谢谢!

Mic*_*bot 6

您正在运行较新的主服务器和较旧的服务器.这不是受支持的配置.

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

我怀疑这个错误实际上并不是关于latin1_swedish_ci,而是实际上是关于utf8mb4_general_ci,它可能在主服务器上的连接上处于活动状态,其中最初发出了无法复制的查询,因此从服务器正试图在该上下文中执行它.

我不认为这个功能(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;
Run Code Online (Sandbox Code Playgroud)

这是一个微妙的操作,仅当您完全知道自己在做什么时才适用,并且由于同样的问题,您可能会看到后续错误,因此除非这是一个孤立的事件,否则不太可能带来太多好处.

从好的方面来说,即使在复制错误停止时升级奴隶也不理想,但它实际上成功的几率并且能够从停止复制的位置继续复制是非常好的.