Восстановление после неправильного запроса на обновление MySQL?

Я сделал неправильный запрос на обновление в своей таблице.

Я забыл сделать поле id в предложении WHERE.

Так что обновил все мои строки.

Как это восстановить?

У меня не было резервной копии....


person assaqqaf    schedule 31.01.2010    source источник
comment
Усвоенный урок: резервное копирование, резервное копирование, резервное копирование.   -  person BalusC    schedule 31.01.2010
comment
Спасибо всем, я начну с нуля.   -  person assaqqaf    schedule 01.02.2010


Ответы (4)


Извините, но шансы восстановить перезаписанную базу данных MySQL обычно близки к нулю. В отличие от удаления файла, перезапись записи фактически и физически перезаписывает существующие данные в большинстве случаев.

Чтобы быть готовым, если что-то случится здесь, вы должны остановить свой сервер MySQL и сделать копию физического каталога, содержащего базу данных, чтобы ничего не могло быть перезаписано в дальнейшем: достаточно простого копирования + вставки папки данных в другое место.

Но не надейтесь - я думаю, что на самом деле ничего нельзя сделать.

Возможно, вы захотите настроить частое резервное копирование базы данных на будущее. Вокруг много решений; одним из самых простых, надежных и легко автоматизируемых (с использованием at или cron в Linux или планировщика задач в Windows) является собственный mysqldump.

person Pekka    schedule 31.01.2010

Здесь следует усвоить два урока:

  1. Резервные данные
  2. Выполняйте операторы UPDATE/DELETE внутри транзакции, чтобы вы могли использовать ROLLBACK, если что-то пойдет не так, как планировалось.

Знание обработки транзакций (автоматическая, явная и неявная) для вашей базы данных может избавить вас от необходимости восстанавливать данные из резервной копии.

Транзакции контролируют оператор(ы) манипулирования данными, чтобы гарантировать их атомарность. Быть «атомарным» означает, что транзакция либо происходит, либо нет. Единственный способ подать сигнал о завершении транзакции в базу данных — это использовать оператор COMMIT или ROLLBACK (согласно ANSI-92, который, к сожалению, не включает синтаксис для создания/начала транзакции, поэтому он зависит от поставщика). COMMIT применяет изменения (если есть), сделанные в рамках транзакции. ROLLBACK игнорирует любые действия, имевшие место в рамках транзакции, что очень желательно, когда инструкция UPDATE/DELETE делает что-то непреднамеренное.

Обычно отдельные операторы DML (вставка, обновление, удаление) выполняются в транзакции автоматической фиксации — они фиксируются, как только оператор успешно завершается. Это означает, что в таких случаях, как ваш, нет возможности откатить базу данных до состояния, предшествующего выполнению инструкции. Когда что-то пойдет не так, единственный доступный вариант восстановления — восстановить данные из резервной копии (при условии, что она существует). В MySQL автоматическая фиксация включена< /em> по умолчанию для 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: таблица, индекс, хранимая процедура, база данных и операторы создания или изменения представления.

person OMG Ponies    schedule 31.01.2010

Извините, но нет возможности восстановить старые значения полей без резервной копии.

Не стреляйте в вестника...

person Dan Soap    schedule 31.01.2010

У вас включены бинлоги? Вы можете восстановить, обратившись к binlogs.

person user3299633    schedule 08.10.2016