Восстановление после неправильного запроса на обновление MySQL? - PullRequest
11 голосов
/ 31 января 2010

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

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

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

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

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

Ответы [ 4 ]

14 голосов
/ 01 февраля 2010

Здесь можно выучить два урока:

  1. Резервное копирование данных
  2. Выполнение операторов UPDATE / DELETE в транзакции, поэтому вы можете использовать ROLLBACK, если все идет не так, как планировалось

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

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

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

11 голосов
/ 31 января 2010

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

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

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

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

3 голосов
/ 31 января 2010

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

Не стреляйте в курьера ...

0 голосов
/ 08 октября 2016

У вас есть включенные binlogs? Вы можете восстановить, получив доступ к binlogs.

...