sql >> Database >  >> RDS >> Mysql

Herstel na verkeerde MySQL-updatequery?

Er zijn hier twee lessen te leren:

  1. Back-upgegevens
  2. Voer UPDATE/DELETE-instructies uit binnen een transactie, zodat u ROLLBACK kunt gebruiken als dingen niet gaan zoals gepland

Als u op de hoogte bent van de transactieverwerking (autocommit, expliciete en impliciete) voor uw database, hoeft u geen gegevens te herstellen vanaf een back-up.

Transacties controleren verklaring(en) voor gegevensmanipulatie om ervoor te zorgen dat ze atomair zijn. "Atomair" zijn betekent dat de transactie plaatsvindt of niet. De enige manier om de voltooiing van de transactie aan de database aan te geven, is door een COMMIT . te gebruiken of ROLLBACK verklaring (volgens ANSI-92, die helaas geen syntaxis bevatte voor het maken/beginnen van een transactie, dus het is leverancierspecifiek). COMMIT past de wijzigingen (indien van toepassing) toe die tijdens de transactie zijn aangebracht. ROLLBACK negeert alle acties die binnen de transactie hebben plaatsgevonden - zeer wenselijk wanneer een UPDATE/DELETE-instructie iets onbedoeld doet .

Doorgaans worden individuele DML-instructies (Insert, Update, Delete) uitgevoerd in een autocommit-transactie - ze worden vastgelegd zodra de instructie met succes is voltooid. Wat betekent dat er geen mogelijkheid is om de database terug te draaien naar de staat voordat de instructie werd uitgevoerd in gevallen zoals die van u. Als er iets misgaat, is de enige beschikbare hersteloptie het reconstrueren van de gegevens vanaf een back-up (op voorwaarde dat deze bestaat). In MySQL is autocommit op standaard voor InnoDB - MyISAM ondersteunt geen transacties. Het kan worden uitgeschakeld met behulp van:

SET autocommit = 0

Een expliciete transactie is wanneer statement(s) zijn verpakt in een expliciet gedefinieerd transactiecodeblok - voor MySQL is dat START TRANSACTION . Het vereist ook een expliciet gemaakte COMMIT of ROLLBACK verklaring aan het einde van de transactie. Geneste transacties vallen buiten het bestek van dit onderwerp.

Impliciete transacties zijn iets anders dan expliciete. Impliciete transacties vereisen geen expliciete definitie van een transactie. Echter, zoals expliciete transacties vereisen ze een COMMIT of ROLLBACK af te geven verklaring.

Conclusie

Expliciete transacties zijn de meest ideale oplossing - ze vereisen een verklaring, COMMIT of ROLLBACK , om de transactie af te ronden, en wat er gebeurt, wordt duidelijk vermeld zodat anderen het kunnen lezen als dat nodig is. Impliciete transacties zijn OK als interactief met de database wordt gewerkt, maar COMMIT verklaringen mogen alleen worden gespecificeerd nadat de resultaten zijn getest en grondig zijn vastgesteld om geldig te zijn.

Dat betekent dat je het volgende moet gebruiken:

SET autocommit = 0;

START TRANSACTION;
  UPDATE ...;

...en gebruik alleen COMMIT; wanneer de resultaten correct zijn.

Dat gezegd hebbende, UPDATE- en DELETE-instructies retourneren meestal alleen het aantal betrokken rijen, niet specifieke details. Zet dergelijke uitspraken om in SELECT-instructies en bekijk de resultaten om de juistheid te verzekeren vooraf om de UPDATE/DELETE-instructie te proberen.

Aanvulling

DDL-instructies (Data Definition Language) worden automatisch vastgelegd - ze vereisen geen COMMIT-instructie. IE:Tabel, index, opgeslagen procedure, database en instructies voor het maken of wijzigen van weergaven.



  1. PGLogical 1.1-pakketten voor PostgreSQL 9.6beta1

  2. MySQL-groep per uur

  3. Waarschuwing:mysqli::mysqli():(HY000/1045):Toegang geweigerd voor gebruiker 'database'@'localhost' (met wachtwoord:NO) in

  4. Verschillende waarde telt op dezelfde kolom