AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 61691
Accepted
Mark Amery
Mark Amery
Asked: 2014-03-26 05:57:59 +0800 CST2014-03-26 05:57:59 +0800 CST 2014-03-26 05:57:59 +0800 CST

Tabelas mestre e escrava com diferentes conjuntos de caracteres - a replicação será interrompida?

  • 772

Temos algumas tabelas enormes em nosso banco de dados MySQL 5.6 que têm latin-1 como conjunto de caracteres e queremos convertê-las todas para UTF-8 (junto com a conversão do conjunto de caracteres global do banco de dados). As ALTER TABLEdeclarações necessárias levam, entre elas, cerca de uma hora para serem executadas. Gostaríamos de minimizar nosso tempo de inatividade.

Nosso plano é configurar a replicação, fazer as alterações de codificação no banco de dados escravo, permitir que os bancos de dados sejam sincronizados e, em seguida, desativar brevemente nosso servidor da web e apontá-lo para o banco de dados escravo.

Isso funcionará ou há risco de causar corrupção de dados no escravo?

Minha preocupação sobre isso decorre de haver duas abordagens possíveis óbvias de como os valores de string (que estão sendo INSERTed ou UPDATEed) podem ser armazenados no binlog do MySQL e enviados para o escravo. Qualquer...

  1. Os valores são armazenados como sequências de caracteres unicode (ou seja, o log binário sabe em qual codificação eles estão codificados e envia essas informações ao escravo para que ele possa converter os valores para corresponder ao conjunto de caracteres da coluna de destino no escravo).

    ou...

  2. Os valores codificados são armazenados apenas como sequências de bytes, sem registro de qual era o conjunto de caracteres.

A documentação não esclarece qual dos modelos acima o MySQL usa.

Se o nº 1 for verdadeiro, nosso plano funcionará bem.

No entanto, se o nº 2 for verdadeiro, tentar replicar consultas do mestre para o escravo dará errado de alguma forma se uma das colunas envolvidas tiver um conjunto de caracteres diferente. Por exemplo, uma vez que convertemos nossas tabelas de latin-1 para UTF-8 no slave, o slave pode tentar armazenar strings codificadas em latin-1 transmitidas pelo master em uma coluna codificada em UTF-8, resultando em o texto armazenado não está sendo codificado de forma válida em UTF-8 ou representa os caracteres errados.

Os documentos do MySQL sobre replicação e conjuntos de caracteres lançam pouca luz sobre o problema; eles discutem possíveis problemas resultantes de diferenças no conjunto de caracteres globais de cada servidor, mas não abordam problemas potenciais causados ​​por diferenças em conjuntos de caracteres de tabela ou coluna.

Nosso plano é sólido ou corremos o risco de acabar com dados corrompidos no escravo?

mysql replication
  • 1 1 respostas
  • 2464 Views

1 respostas

  • Voted
  1. Best Answer
    Robby Morgan
    2016-05-03T06:54:47+08:002016-05-03T06:54:47+08:00

    https://dev.mysql.com/doc/refman/5.7/en/replication-features-differing-tables.html descreve as variações suportadas nas definições de tabela.

    Por um lado, parece que isso é compatível com a replicação baseada em instrução :

    Ao usar a replicação baseada em instrução, uma regra simples a seguir é: “Se a instrução executada no mestre também for executada com êxito no escravo, ela também deverá ser replicada com êxito”.

    Com a replicação baseada em linha, apenas certas conversões de tipo são suportadas, que são afetadas pela slave_type_conversionsvariável. As principais citações de acordo com a minha leitura são:

    [As conversões são suportadas entre] qualquer um dos tipos de string CHAR, VARCHAR e TEXT, incluindo conversões entre larguras diferentes.

    No entanto:

    [Baseado em linha] A replicação entre colunas usando diferentes conjuntos de caracteres não é suportada .

    • 4

relate perguntas

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve