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 / 21369
Accepted
quanta
quanta
Asked: 2012-07-24 22:23:49 +0800 CST2012-07-24 22:23:49 +0800 CST 2012-07-24 22:23:49 +0800 CST

--replicate-wild-ignore-table não funciona?

  • 772

De acordo com o documento sobre replicação e tabelas temporárias , estou configurando --replicate-wild-ignore-tablea opção %.norep%para evitar que tabelas temporárias sejam replicadas:

*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.6.129
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000861
          Read_Master_Log_Pos: 332610533
               Relay_Log_File: mysqld-relay-bin.001578
                Relay_Log_Pos: 9061317
        Relay_Master_Log_File: mysql-bin.000861
             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: %.norep%
                   Last_Errno: 1146
                   Last_Error: Error 'Table 'reportingdb.norep_cp_banner_tvc_temp_' doesn't exist' on query. Default database: 'reportingdb'. Query: 'UPDATE `ox_banners` A
    SET A.`status` =1
    WHERE A.`bannerid` IN (SELECT bannerid FROM norep_cp_banner_tvc_temp_)'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 330271548
              Relay_Log_Space: 13544924166
              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: 1146
               Last_SQL_Error: Error 'Table 'reportingdb.norep_cp_banner_tvc_temp_' doesn't exist' on query. Default database: 'reportingdb'. Query: 'UPDATE `ox_banners` A
    SET A.`status` =1
    WHERE A.`bannerid` IN (SELECT bannerid FROM norep_cp_banner_tvc_temp_)'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 4

Mas, como você pode ver na show slave status\Gsaída acima, essa instrução ainda é replicada para o escravo e causa o erro.

Há algum problema com a minha consulta? Só tem efeito com as tabelas principais (quero dizer ox_bannersneste caso)?


Responder a @Aaron Brown:

Isso pode ser um tanto surpreendente, mas esse erro é a prova de que seu filtro de replicação está funcionando .

+1.

A primeira pergunta a se fazer é por que estou filtrando a replicação? Raramente há uma boa razão para isso e geralmente causa muito mais problemas do que resolve.

Devido ao problema com tabelas temporárias: Como tornar a replicação do MySQL confiável?

Definitivamente, você pode contornar o problema usando a replicação baseada em linha (RBR) em vez da replicação baseada em instrução (SBR). O RBR replica as alterações nos dados em vez da instrução.

Vou considerar mudar de baseado em misto para baseado em linha.

mysql replication
  • 2 2 respostas
  • 5439 Views

2 respostas

  • Voted
  1. Best Answer
    Aaron Brown
    2012-07-25T05:17:53+08:002012-07-25T05:17:53+08:00

    Isso pode ser um tanto surpreendente, mas esse erro é a prova de que seu filtro de replicação está funcionando . A instrução que parou de funcionar é um UPDATE para outra tabela, mas a atualização está usando dados da tabela que você disse para não replicar na cláusula SELECT. Observe que o erro é que a tabela norep_cp_banner_tvc_temp_não existe. Os filtros de replicação são respeitados apenas nas tabelas afetadas - não é apenas uma correspondência de padrão direta.

    Os filtros de replicação são um tanto complicados - sugiro que você leia Como os servidores avaliam as regras de filtro de replicação e Avaliação das opções de replicação em nível de tabela .

    A primeira pergunta a se fazer é por que estou filtrando a replicação? Raramente há uma boa razão para isso e geralmente causa muito mais problemas do que resolve.

    Definitivamente, você pode contornar o problema usando a replicação baseada em linha (RBR) em vez da replicação baseada em instrução (SBR). O RBR replica as alterações nos dados em vez da instrução.

    Também sugiro que você refatore seu UPDATE como uma junção. IN (SELECT...)é muito mal otimizado no MySQL pré-5.6 e isso terá muito mais desempenho:

    UPDATE `ox_banners` A
    JOIN norep_cp_banner_tvc_temp_ temp USING (bannerid)
    SET A.`status` = 1;
    

    Outra maneira de contornar esse problema é atualizando um campo fictício na tabela norep . Algo assim:

    UPDATE ox_banners A
    JOIN norep_cp_banner_tvc_temp_ temp USING (bannerid)
    SET A.`status` = 1, temp.dummy = 1;
    

    Isso pode enganar o MySQL para filtrar esta declaração, mas é um truque para dizer o mínimo. RBR é provavelmente sua melhor aposta.

    ATUALIZAÇÃO 2012-07-24

    Você mencionou que está fazendo isso para contornar alguns dos problemas com tabelas temporárias sendo usadas com replicação. Filtrá-los completamente é uma maneira terrível de lidar com esse problema. Considere fazer isso em vez disso, se estiver preocupado com isso.

    Crie um banco de dados separado para manter suas tabelas "temporárias"

    mysql> create database temptables;
    Query OK, 1 row affected (0.08 sec)
    
    mysql> use temptables;
    Database changed
    

    Namespace as tabelas usando seu CONNECTION_ID...

    mysql> SELECT CONNECTION_ID();
    +-----------------+
    | CONNECTION_ID() |
    +-----------------+
    |              52 |
    +-----------------+
    1 row in set (0.00 sec)
    
    mysql> CREATE TABLE 52_my_temp ( foo int ) ENGINE=InnoDB;
    Query OK, 0 rows affected (0.20 sec)
    

    Use a mesa normalmente, então DROPa mesa

    mysql> DROP TABLE IF EXISTS 52_my_temp;
    Query OK, 0 rows affected (0.05 sec)
    

    Por fim, crie um processo que limpe as tabelas de vez em quando, caso o DROP TABLE não tenha sido executado. Algo assim (sintaxe do Ruby Sequel aqui):

    # get a list of all the tables in the temp database
    query = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.PROCESSLIST WHERE TABLE_SCHEMA=?"
    db[query, 'temptables'].each do |row|
      # get the connection id
      id = row[:TABLE_NAME].split('_')[0].to_i
      # is the connection still active?
      query = "SELECT COUNT(*) AS cnt FROM INFORMATION_SCHEMA.PROCESSLIST WHERE id = ?"
      if db[query, id].first[:cnt] < 1
        db["DROP TABLE #{row[:TABLE_NAME]}"]
      end
    end
    
    • 1
  2. Mahesh Patil
    2012-07-24T23:29:50+08:002012-07-24T23:29:50+08:00
    • Blog para Why replication is bad for temporary tables: http://scale-out-blog.blogspot.in/2012/04/replication-is-bad-for-mysql-temp.html
    • Desligamento escravo seguro ao usar tabelas temporárias:

    Tabelas temporárias são replicadas, exceto no caso em que você para o servidor escravo (não apenas os encadeamentos escravos) e replica as tabelas temporárias que estão abertas para uso em atualizações que ainda não foram executadas no escravo. Se você parar o servidor escravo, as tabelas temporárias necessárias para essas atualizações não estarão mais disponíveis quando o escravo for reiniciado. Para evitar este problema, não desligue o slave enquanto ele estiver com as tabelas temporárias abertas. Para mais informações consulte:

    http://dev.mysql.com/doc/refman/5.1/en/replication-features-temptables.html

    • Log baseado em linha, replicação baseada em linha e tabelas temporárias:

    As tabelas temporárias não são replicadas ao usar o formato baseado em linha. Quando o formato misto está em vigor, as instruções “seguras” envolvendo tabelas temporárias são registradas usando o formato baseado em instrução. Para mais informações consulte

    http://dev.mysql.com/doc/refman/5.1/en/replication-sbr-rbr.html

    As tabelas temporárias não são replicadas ao usar o formato baseado em linha porque não há necessidade. Além disso, como as tabelas temporárias podem ser lidas apenas a partir do thread que as criou, raramente ou nunca há nenhum benefício obtido em replicá-las, mesmo ao usar o formato baseado em instrução.

    • 0

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 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

    Como selecionar a primeira linha de cada grupo?

    • 6 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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