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-table
para 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.
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
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últiploFeb 03, 2012
: Um escravo, vários mestres MySqlJun 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 estrelaComo 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.
Se sua arquitetura permitir, você pode tentar uma abordagem inversa usando
replicate-ignore-table
apenas para suas tabelas privadascombinando um comportamento como este:
Uma maneira mais gerenciada é criar seu próprio procedimento para:
Escreva para você
PROCEDURE
E substitua em seu software seu:
Com o:
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.
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:
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.
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.