Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Odzyskiwanie po nieprawidłowym zapytaniu o aktualizację MySQL?

Można tutaj wyciągnąć dwie lekcje:

  1. Dane kopii zapasowej
  2. Wykonywanie instrukcji UPDATE/DELETE w ramach transakcji, dzięki czemu możesz użyć ROLLBACK jeśli sprawy nie idą zgodnie z planem

Świadomość obsługi transakcji (autocommit, jawna i niejawna) dla Twojej bazy danych może oszczędzić Ci konieczności przywracania danych z kopii zapasowej.

Transakcje kontrolują instrukcje manipulacji danymi, aby upewnić się, że są niepodzielne. Bycie „atomowym” oznacza, że ​​transakcja albo występuje, albo nie. Jedynym sposobem zasygnalizowania zakończenia transakcji do bazy danych jest użycie COMMIT lub ROLLBACK oświadczenie (zgodnie z ANSI-92, które niestety nie zawierało składni tworzenia/rozpoczynania transakcji, więc jest zależne od dostawcy). COMMIT stosuje zmiany (jeśli występują) wprowadzone w ramach transakcji. ROLLBACK pomija wszelkie działania, które miały miejsce w ramach transakcji - wysoce pożądane, gdy instrukcja UPDATE/DELETE robi coś niezamierzonego .

Zazwyczaj pojedyncze instrukcje DML (Insert, Update, Delete) są wykonywane w transakcji autocommit — są one zatwierdzane, gdy tylko instrukcja zostanie pomyślnie zakończona. Co oznacza, że ​​nie ma możliwości przywrócenia bazy danych do stanu sprzed uruchomienia instrukcji w przypadkach takich jak twój. Gdy coś pójdzie nie tak, jedyną dostępną opcją przywrócenia jest zrekonstruowanie danych z kopii zapasowej (o ile taka istnieje). W MySQL autocommit to na domyślnie dla InnoDB - MyISAM nie obsługuje transakcji. Można go wyłączyć za pomocą:

SET autocommit = 0

Transakcja jawna ma miejsce, gdy wyciągi są opakowane w wyraźnie zdefiniowany blok kodu transakcji - dla MySQL jest to START TRANSACTION . Wymaga również jawnie wykonanego COMMIT lub ROLLBACK oświadczenie na koniec transakcji. Transakcje zagnieżdżone wykraczają poza zakres tego tematu.

Transakcje niejawne różnią się nieco od transakcji jawnych. Transakcje niejawne nie wymagają jawnego definiowania transakcji. Jednak, podobnie jak transakcje jawne, wymagają COMMIT lub ROLLBACK oświadczenie, które należy dostarczyć.

Wniosek

Transakcje jawne są najbardziej idealnym rozwiązaniem - wymagają oświadczenia, COMMIT lub ROLLBACK , aby sfinalizować transakcję, a to, co się dzieje, jest jasno określone, aby inni mogli je przeczytać, jeśli zajdzie taka potrzeba. Transakcje niejawne są w porządku, jeśli interaktywnie pracujesz z bazą danych, ale COMMIT Oświadczenia należy podawać dopiero po przetestowaniu wyników i dokładnym ustaleniu ich poprawności.

Oznacza to, że powinieneś użyć:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...i używaj tylko COMMIT; kiedy wyniki są prawidłowe.

To powiedziawszy, instrukcje UPDATE i DELETE zazwyczaj zwracają tylko liczbę wierszy, których to dotyczy, a nie konkretne szczegóły. Przekształć takie stwierdzenia w wyrażenia SELECT i przejrzyj wyniki, aby upewnić się, że są one poprawne wcześniej do próby wykonania instrukcji UPDATE/DELETE.

Uzupełnienie

Instrukcje DDL (Data Definition Language) są zatwierdzane automatycznie — nie wymagają instrukcji COMMIT. IE:Tabela, indeks, procedura składowana, baza danych i instrukcje tworzenia lub zmiany widoku.



  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 UPDATE z SELECT SUM z innej tabeli

  2. Normy dotyczące dodawania daty/godziny?

  3. Różnice między MySQL i SQLite w SQL

  4. PHP PDO bindParam() i MySQL BIT

  5. Odbudowa niewolnika replikacji MySQL 8.0 za pomocą wtyczki do klonowania