Mysql
 sql >> база данни >  >> RDS >> Mysql

Възстановяване след грешна заявка за актуализиране на MySQL?

Тук трябва да научите два урока:

  1. Резервно копие на данни
  2. Изпълнете оператори UPDATE/DELETE в рамките на транзакция, за да можете да използвате ROLLBACK ако нещата не вървят по план

Да сте наясно с обработката на транзакциите (автоматично извършване, изрично и неявно) за вашата база данни може да ви спести от необходимостта да възстановявате данни от резервно копие.

Транзакциите контролират израза(ите) за манипулиране на данни, за да гарантират, че са атомарни. Да бъдеш „атомен“ означава, че транзакцията или се случва, или не. Единственият начин да сигнализирате за завършването на транзакцията в базата данни е чрез COMMIT или ROLLBACK оператор (съгласно ANSI-92, който за съжаление не включва синтаксис за създаване/започване на транзакция, така че е специфичен за доставчика). COMMIT прилага промените (ако има такива), направени в рамките на транзакцията. ROLLBACK пренебрегва всички действия, извършени в рамките на транзакцията – много желателно, когато оператор UPDATE/DELETE направи нещо непреднамерено .

Обикновено отделните оператори на DML (вмъкване, актуализиране, изтриване) се изпълняват в транзакция за автоматично извършване - те се ангажират веднага щом операторът завърши успешно. Което означава, че няма възможност за връщане на базата данни до състоянието преди изявлението да е било стартирано в случаи като вашия. Когато нещо се обърка, единствената налична опция за възстановяване е да се реконструират данните от резервно копие (при условие, че съществува). В MySQL автоматичното завършване е на по подразбиране за InnoDB - MyISAM не поддържа транзакции. Може да се деактивира с помощта на:

SET autocommit = 0

Изрична транзакция е, когато изявление(и) са обвити в изрично дефиниран блок с код на транзакция - за MySQL това е START TRANSACTION . Той също така изисква изрично направен COMMIT или ROLLBACK извлечение в края на сделката. Вложените транзакции са извън обхвата на тази тема.

Неявните транзакции са малко по-различни от явните. Неявните транзакции не изискват изрично дефиниране на транзакция. Въпреки това, подобно на изричните транзакции, те изискват COMMIT или ROLLBACK изявление, което трябва да бъде предоставено.

Заключение

Изричните транзакции са най-идеалното решение - те изискват изявление, COMMIT или ROLLBACK , за финализиране на транзакцията и какво се случва е ясно посочено, за да могат другите да прочетат, ако има нужда. Неявните транзакции са ОК, ако се работи с базата данни интерактивно, но COMMIT твърденията трябва да се посочват само след като резултатите са тествани и щателно установени като валидни.

Това означава, че трябва да използвате:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...и използвайте само COMMIT; когато резултатите са правилни.

Въпреки това, операторите UPDATE и DELETE обикновено връщат само броя на засегнатите редове, а не конкретни подробности. Преобразувайте такива изрази в SELECT изрази и прегледайте резултатите, за да се уверите, че преди да опитате израза UPDATE/DELETE.

Допълнение

DDL (език за дефиниране на данни) оператори се записват автоматично - те не изискват оператор COMMIT. IE:Таблица, индекс, съхранена процедура, база данни и изрази за създаване или промяна.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да съхранявате резултата от заявката в променлива с помощта на mysql

  2. MySQL репликация:Грешни транзакции в GTID базирана репликация

  3. Каква е разликата в производителността между вмъкване игнориране и замяна в MySQL?

  4. MySqlCommand Command.Parameters.Add е остарял

  5. Ограничаване на колона за приемане само на 2 стойности