Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Recuperação após consulta de atualização incorreta do MySQL?


Há duas lições a serem aprendidas aqui:
  1. Dados de backup
  2. Execute instruções UPDATE/DELETE em uma transação, para que você possa usar ROLLBACK se as coisas não saírem como planejado

Estar ciente do tratamento da transação (autocommit, explícito e implícito) para seu banco de dados pode evitar que você precise restaurar dados de um backup.

As transações controlam a(s) instrução(ões) de manipulação de dados para garantir que sejam atômicas. Ser "atômica" significa que a transação ocorre ou não. A única maneira de sinalizar a conclusão da transação para o banco de dados é usando um comando COMMIT ou ROLLBACK instrução (por ANSI-92, que infelizmente não inclui sintaxe para criar/iniciar uma transação, portanto, é específico do fornecedor). COMMIT aplica as alterações (se houver) feitas na transação. ROLLBACK desconsidera quaisquer ações que ocorreram dentro da transação - altamente desejável quando uma instrução UPDATE/DELETE faz algo não intencional .

Normalmente, as instruções DML (Insert, Update, Delete) são executadas em uma transação de confirmação automática - elas são confirmadas assim que a instrução for concluída com êxito. O que significa que não há oportunidade de reverter o banco de dados para o estado anterior à execução da instrução em casos como o seu. Quando algo der errado, a única opção de restauração disponível é reconstruir os dados de um backup (desde que exista). No MySQL, autocommit é em por padrão para InnoDB - MyISAM não suporta transações. Ele pode ser desabilitado usando:
SET autocommit = 0

Uma transação explícita ocorre quando as instruções são agrupadas em um bloco de código de transação definido explicitamente - para MySQL, é START TRANSACTION . Também requer um COMMIT feito explicitamente ou ROLLBACK extrato no final da transação. As transações aninhadas estão além do escopo deste tópico.

As transações implícitas são ligeiramente diferentes das explícitas. As transações implícitas não requerem a definição explícita de uma transação. No entanto, como transações explícitas, elas exigem um COMMIT ou ROLLBACK declaração a ser fornecida.

Conclusão


As transações explícitas são a solução ideal - elas exigem uma declaração, COMMIT ou ROLLBACK , para finalizar a transação, e o que está acontecendo é claramente indicado para que outros leiam caso haja necessidade. As transações implícitas são aceitáveis ​​se estiver trabalhando com o banco de dados interativamente, mas COMMIT As declarações só devem ser especificadas depois que os resultados forem testados e completamente determinados como válidos.

Isso significa que você deve usar:
SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...e use apenas COMMIT; quando os resultados estão corretos.

Dito isso, as instruções UPDATE e DELETE normalmente retornam apenas o número de linhas afetadas, não detalhes específicos. Converta tais declarações em declarações SELECT e revise os resultados para garantir a exatidão antes para tentar a instrução UPDATE/DELETE.

Adendo


As instruções DDL (Data Definition Language) são confirmadas automaticamente - elas não exigem uma instrução COMMIT. IE:Tabela, índice, procedimento armazenado, banco de dados e instruções de criação ou alteração de exibição.