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 / 6271
Accepted
geoaxis
geoaxis
Asked: 2011-09-29 08:33:02 +0800 CST2011-09-29 08:33:02 +0800 CST 2011-09-29 08:33:02 +0800 CST

Envenenamento do banco de dados MySQL: como recuperar rapidamente para um estado conhecido

  • 772

Se você deseja evitar o envenenamento do banco de dados (ou seja, deseja recuperar rapidamente um ponto no tempo), qual metodologia você prefere?

Deixe-me definir envenenamento de dados. Você insere algumas coisas em seu banco de dados que bagunçam totalmente a estrutura interna e as interdependências. Eu sei que isso significa que o design do banco de dados provavelmente também precisa ser revisto, mas o estrago está feito.

Os métodos que tenho em mente são

  1. De alguma forma, configure a replicação na qual o escravo é passivo e está X horas atrasado. Se eu tiver uma falha, tudo o que preciso fazer é redefinir o aplicativo e apontá-lo para o escravo como meu novo mestre. Eu suspeito que seja possível.
  2. Faça um hot backup do MySQL a cada poucas horas e quando a falha for detectada, restaure para um backup de X horas antes. Isso significaria um tempo de inatividade para o aplicativo, pois não posso permitir que o aplicativo atual continue em execução. Pode-se usar innobackup ou percona para etapas rápidas de backup e recuperação.
  3. Projete o aplicativo e o banco de dados especificamente para que os dados recém-adicionados sejam destruídos (ou arquivados). Isso significa que armazeno todos os eventos/estados (acho que essa é a solução mais difícil e teórica)

Se a primeira opção for possível e também armazenar todos os logs de retransmissão (ou seja, o que já aconteceu no mestre é transferido para o escravo no mesmo instante, mas é aplicado automaticamente em algumas horas), então seria uma solução perfeita. Talvez alguém possa configurar vários escravos em uma configuração para se recuperar de uma interrupção e envenenamento de dados

mysql replication
  • 4 4 respostas
  • 666 Views

4 respostas

  • Voted
  1. Best Answer
    user4939
    2011-09-29T15:16:49+08:002011-09-29T15:16:49+08:00

    Você pode usar a ferramenta pt-slave-delay do Percona Toolkit para manter uma réplica atrasada pelo tempo que você escolher.

    • 5
  2. Derek Downey
    2011-09-29T10:03:30+08:002011-09-29T10:03:30+08:00

    Eu normalmente configuro um slave especificamente para backups. Dessa forma eu posso STOP SLAVE, fazer backup e START SLAVE. Fazer esse método permitiria que você fizesse quantos backups desejasse durante o dia sem tempo de inatividade em seu mestre.

    Se você quiser, pode desligar o escravo manualmente depois que ele recuperar os logs. Você teria algum tempo de inatividade copiando-o de volta para o mestre, mas então você pode reproduzir os logs binários até o ponto em que seus dados foram 'envenenados'.

    • 2
  3. RolandoMySQLDBA
    2011-09-29T10:00:10+08:002011-09-29T10:00:10+08:00

    Você definitivamente precisará de Master/Master e o uso de um DBVIP

    Primeiro, vamos configurar a replicação circular

    Deixe db1: Mestre, db2: Escravo

    1. Use o db1 existente como mestre
    2. instale o mysql no db2 (mesma versão aon db1 e db2)
    3. verifique se o mysql não está sendo executado no db2
      • Adicionar server-id=1a db1:/etc/my.cnf
      • Adicionar log-bin=mysql-bina db1:/etc/my.cnf
      • Adicionar log-slave-updatesa db1:/etc/my.cnf
      • Adicionar skip-slave-starta db1:/etc/my.cnf
      • service mysql restartem db1
    4. copiar db1:/etc/my.cnf para db2:/etc/my.cnf
    5. mude server-id=1para server-id=2db2:/etc/my.cnf
    6. RESET MASTER;em db1
    7. service mysql stopem db1
    8. rm -f /var/lib/mysql/mysql-bin.* no db1
    9. rsync db1:/var/lib/mysql para db2:/var/lib/mysql
    10. service mysql startno db2
    11. CHANGE MASTER TO MASTER_HOST='HostIP of db1',MASTER_PORT=3306, MASTER_USER='replusername',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=<number>;no db2 (Nota: MASTER_LOG_POS é 98 antes do MySQL 5.1, 106 para MySQL 5.1 e 107 para MySQL 5.5)
    12. service mysql startno db2
    13. START SLAVE;no db2 e deixe a recuperação da replicação (Seconds_Behind_Master=0)
    14. CHANGE MASTER TO MASTER_HOST='HostIP of db2',MASTER_PORT=3306, MASTER_USER='replusername',MASTER_PASSWORD='replpassword', MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=<number>;em db1
    15. START SLAVE;no db1 e deixe a replicação recuperar (Seconds_Behind_Master=0)

    Depois de ter a replicação circular instalada, agora você pode congelar o db2 em um determinado ponto no tempo executando STOP SLAVE;no db2

    Em seguida, crie um DBVIP no db1 (Exemplo: 192.168.10.1)

    ip addr add 192.168.10.1/24 dev eth1
    

    Execute todas as leituras e gravações de banco de dados usando DBVIP

    Se você deseja que o db2 seja atualizado, simplesmente execute START SLAVE;no db2 e deixe a replicação recuperar.

    Se você quiser voltar no tempo para o ponto em que o DB2 estava, você pode executar as etapas

    • service mysql stopem db1
    • rm -f mysql-bin.*em db1
    • rm -f master.infoem db1
    • ip addr del 192.168.10.1/24 dev eth1em db1
    • ip addr add 192.168.10.1/24 dev eth1no db2
    • CHANGE MASTER TO MASTER_HOST='';no db2
    • RESET MASTERno db2 (logs binários de mangueiras)
    • service mysql stopno db2
    • rsync db2:/var/lib/mysql para db1:/var/lib/mysql
    • service mysql startno db2
    • service mysql startem db1

    O If poderia acelerar essas etapas ignorando o desligamento do mysql do servidor de banco de dados do qual você está sincronizando. Isso requer apenas uma pequena limpeza extra no servidor de destino do banco de dados.

    Essas etapas são simplesmente guias. Você pode achar alguns dos meus passos um pouco paranóicos. Fique à vontade para usar o que quiser.

    • 1
  4. dabest1
    2012-05-23T09:57:03+08:002012-05-23T09:57:03+08:00

    Outra opção, além de usar a ferramenta pt-slave-delay da Percona, é configurar a tabela de histórico/auditoria para cada tabela base, que rastrearia todas as alterações no conteúdo dos dados e conteria registros de inserção, atualização e exclusão e registros de data e hora e conteúdo real. Você precisaria criar gatilhos que disparassem em cada instrução de inserção, atualização e exclusão e, em seguida, insere na(s) tabela(s) de histórico/auditoria. Para reverter o dano, você leria as tabelas de histórico/auditoria e aplicaria as alterações nas tabelas básicas.

    Por exemplo, DBIx::Class::Journal é um módulo perl que implementa esse tipo de esquema automaticamente do lado do código. Se você visitar a URL, verá que este módulo se aprofunda bastante na captura de alterações de conteúdo de dados. O esquema do diário contém tabelas como:

    ChangeSet
    ChangeLog
    AuditLog
    AuditHistory
    

    Para sua configuração, você pode querer começar com apenas uma tabela de histórico para cada tabela base.

    • 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 você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

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

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 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
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +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
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +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
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +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