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 / 37015
Accepted
chris
chris
Asked: 2013-03-20 06:31:00 +0800 CST2013-03-20 06:31:00 +0800 CST 2013-03-20 06:31:00 +0800 CST

Replicar algumas tabelas sem transferir todo o log

  • 772

Eu tenho um banco de dados mysql que contém algumas tabelas com informações privadas e algumas tabelas com informações públicas.

Eu gostaria de replicar apenas as tabelas contendo informações públicas de um banco de dados para outro, garantindo que NENHUMA informação confidencial seja armazenada no escravo.

Eu sei que posso usar o replicate-do-tablepara especificar que apenas algumas tabelas são replicadas, mas meu entendimento é que todo o log do bin é transferido para o escravo.

Existe uma maneira de garantir que apenas as informações públicas sejam transferidas para o escravo?

Estou muito hesitante em adicionar outra cópia do banco de dados a um servidor existente - simplesmente não acho que o servidor existente tenha a capacidade disponível, em RAM ou CPU.

mysql replication
  • 5 5 respostas
  • 27039 Views

5 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2014-02-14T15:24:43+08:002014-02-14T15:24:43+08:00

    A única maneira de filtrar em um servidor de banco de dados é executar várias instâncias do MySQL em um servidor de banco de dados.

    SERVIDOR DB1

    A porta 3306 seria sua instância de banco de dados normal para seu aplicativo

    A porta 3307 seria uma escrava da porta 3306

    Há algumas coisas que você precisa fazer com a instância MySQL em execução no DB1

    • Habilite o seguinte em my.cnf para
      • log-bin=mysql-bin
      • atualizações de log-slave
      • replica-do-table=db1.public_tb1
      • replica-do-table=db2.public_tb2
      • ...
      • replica-do-table=dbn.public_tbn

    Como opção, converta todas as tabelas no DB1 3307 para o mecanismo de armazenamento BLACKHOLE .

    Dessa forma, o DB1 3307 possui apenas binlogs com informações. Sem dados reais.

    SERVIDOR DB2

    Configure a instância MySQL e torne-a escrava da instância 3307 do DB1. Por que isso é bom ?

    Porque os logs binários na instância do DB1 3307 devem conter apenas as informações públicas. Assim, todos os escravos do DB1 3307 verão apenas informações públicas.

    EMBARGO

    Por favor, veja meus outros posts sobre como usar tabelas BLACKHOLE na replicação

    • Apr 18, 2013: Escravo único - replicação MySQL mestre múltiplo
    • Feb 03, 2012: Um escravo, vários mestres MySql
    • Jun 01, 2011: O que podemos fazer no MySQL 5.0 Replication para resolver problemas de largura de banda?
    • May 16, 2011: O Multi Master Single Slave é possível no mySQL DB?
    • Mar 11, 2011: MySQL na topologia em estrela
    • 7
  2. atxdba
    2014-02-14T12:10:30+08:002014-02-14T12:10:30+08:00

    Como você afirmou, você não pode impedir que eventos sejam gravados nos logs binários com tabelas de replicação, no entanto, isso determinará o que será gravado nos logs binários dos escravos se você tiver atualizações de log-escravo ativadas.

    Considere configurar um escravo intermediário na mesma máquina confiável que seu mestre privado que é executado com o único propósito de filtragem de logs binários e, em seguida, faça com que seu banco de dados "público" se replique a partir disso.

    Se você se preocupou com os dados 'privados' sendo gravados no log binário, mesmo nesse ambiente, lembre-se de que as permissões do sistema de arquivos restringem o acesso de leitura apenas ao usuário do sistema mysql. Se você está preocupado com o comprometimento dessa conta para que eles possam ler seus logs binários, lembre-se de que nesse ponto você tem problemas maiores e eles podem simplesmente pegar todo o diretório de dados.

    • 2
  3. Cristian Porta
    2013-04-19T21:15:27+08:002013-04-19T21:15:27+08:00

    Se sua arquitetura permitir, você pode tentar uma abordagem inversa usando replicate-ignore-tableapenas para suas tabelas privadas

    replicate-ignore-table=<database>.pvt_table_name
    replicate-ignore-table=<database>.other_pvt_table_name
    ...
    

    combinando um comportamento como este:

    SET sql_log_bin = 0;
    
    INSERT INTO pvt_table_name () VALUES(); -- or UPDATES
    
    SET sql_log_bin = 1;
    

    Uma maneira mais gerenciada é criar seu próprio procedimento para:

    Escreva para vocêPROCEDURE

    DELIMITER |
    CREATE PROCEDURE write_my_private_data (`id` INT, `private_data` VARCHAR(255))
    BEGIN
      SET SESSION SQL_LOG_BIN = 0;
      INSERT INTO `pvt_table_name` (`id`, `private_data`) VALUES (id, private_data);
      SET SESSION SQL_LOG_BIN = 1;
    END
    |
    DELIMITER ;
    

    E substitua em seu software seu:

    INSERT INTO `pvt_table_name` (`id`, `private_data`) VALUES (id, private_data);
    

    Com o:

    CALL write_my_private_data (1,'privateData');
    

    Consulte o sql_log_bin para desativar o log da sessão atual

    Esta condição é verdadeira apenas se você tiver certeza de que existe um único ponto de inserção/atualização (seu software com a declaração dinâmica de sql_log_bin), caso contrário, essa condição falha se também houver intervenções de terceiros, como inserção manual direto na mesa.

    • 1
  4. Mathew
    2016-09-01T18:56:14+08:002016-09-01T18:56:14+08:00

    Você pode querer olhar MySQL::Replication - Replicação MySQL descentralizada, ponto a ponto, multi-mestre .

    [ Embora seja Perl, é um aplicativo independente. Não tenho certeza se ainda está sendo mantido. ]

    Simplificando, permite replicação seletiva, como:

    • replicar apenas algumas tabelas
    • apenas algumas colunas ou linhas
    • Replicação de nó de esquema em estrela

    Ele faz um pouco fora da caixa; sendo um aplicativo separado, você pode incorporar qualquer tipo de filtragem que desejar sem precisar reiniciar suas instâncias de banco de dados. E sendo Perl, você pode facilmente hackear.

    • 0
  5. TimG
    2013-03-20T07:19:47+08:002013-03-20T07:19:47+08:00

    Para algo especializado como esse, uma abordagem comum é copiar as linhas que você deseja mover para uma tabela/banco de dados temporária (ou buffer equiv) e, em seguida, fazer a replicação a partir daí. O termo da indústria para isso é ETL (Extrair, Transformar, Carregar). O intermediário/temp/buffer oferece a oportunidade de manipular (etapa Transformar) os dados antes de serem enviados (etapa Carregar). Pode ser um pouco tedioso, mas garante um resultado consistente.

    • -1

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

    Conceder acesso a todas as tabelas para um usuário

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

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