2010-03-01 3 views
46

Я случайно удалил некоторые огромные нет. из строк из таблицы.Как я могу отменить мою последнюю команду удаления в mysql?

Как я могу отбросить его назад?

Я выполнил запрос, используя замазку ...

Я буду признателен, если любой из вас может вести меня благополучно из этого ..

ответ

78

, если вы не сделали резервную копию, вы в значительной степени подделаны.

+3

Таким образом, нет никакого способа, чтобы отменить, что .... К сожалению, я сделал это неправильно .. Я должен использовать запрос select, чтобы перечислить, что я должен удалить, прежде чем выполнять запрос. Хороший урок остыть, чтобы быть более осторожным – Vijay

+3

К сожалению, это так. и да, всегда рекомендуется проверять с помощью select перед использованием удаления или обновления. –

+5

Это один из недостатков стандартных баз данных: у них нет истории, просто огромная память о «сейчас». –

22

Если вы еще не совершили сделку, попробуйте rollback. Если вы уже совершили транзакцию (на commit или, покинув клиент командной строки), вы должны восстановить данные из последней резервной копии.

+0

как вызывать откат Я не вышел из клиента командной строки. – Vijay

+0

по умолчанию клиент командной строки использует автоматическую фиксацию после каждой команды. – stmax

+0

@Vijay: просто введите «откат»; + ENTER –

8

«Откат» работает только если вы использовали transactions. Таким образом, вы можете группировать запросы вместе и отменять все запросы, если только один из них терпит неудачу.

Но если вы уже совершили транзакцию (или использовали обычный DELETE-запрос), единственный способ вернуть ваши данные - восстановить его из ранее сделанной резервной копии.

0

Откат обычно не работает над этими функциями удаления, и, безусловно, резервная копия может спасти вас. Если резервной копии нет, тогда нет способа восстановить ее, поскольку запросы на удаление, запущенные при putty, дерби, использующие файлы .sql, автоматически включаются после запуска запроса удаления.

3

Принятый ответ не всегда правильный. Если вы настроите двоичный журнал на mysql, вы можете откатить базу данных до любой предыдущей точки, в которой все еще есть моментальный снимок и binlog. http://dev.mysql.com/doc/refman/5.0/en/point-in-time-recovery.html - хорошая отправная точка для изучения этого объекта.

+0

У меня есть сомнения. если двоичный журнал включен, я думаю, что он будет иметь базы данных обложек под сервером mysql. Итак, все, что мы должны рассмотреть, 1. Если мы воспользуемся этой возможностью для восстановления на один бит, мы закончим восстановление для всех 2. И я прав, хотя мы используем двоичный журнал для восстановления в определенный момент времени , это помогает, когда у нас есть резервная копия сервера/db, чтобы начать процесс восстановления. – Vijay

0

Если вам нужны данные отката во-первых, вам необходимо выполнить autocommit = 0, а затем выполнить запрос удалить, вставить или обновить. После выполнения запроса выполните откат ....

2

BEGIN TRANSACTION команда перед запуском запросов. Чтобы вы могли ROLLBACK вещи в любой момент времени.

НАПРИМЕР:

  1. начать транзакцию
  2. выберите * от Student
  3. удалить из Студента, где Id = 2
  4. выберите * от Student
  5. Откат
  6. выберите * от Student
0

Я также удалил некоторые значения из моей базы данных разработки, но у меня была такая же копия в базе данных QA, поэтому я сделал сценарий генерации и выбранную опцию «тип данных для скрипта» на «только данные» и выбрал мою таблицу, а затем Я получил инструкции вставки с одинаковыми данными, а затем запустил сценарий в своей базе данных разработки.

0

В оракула это будет не проблема

SQL> delete from Employee where id = '01'; 

1 row deleted. 

SQL> select id, last_name from Employee where id = '01'; 

no rows selected 

SQL> rollback; 

Rollback complete. 

SQL> select * from Employee where id = '01'; 

ID FIRST_NAME LAST_NAME START_DAT END_DATE  SALARY CITY  DESCRIPTION 
---- ---------- ---------- --------- --------- ---------- ---------- --------------- 
01 Jason  Martin  25-JUL-96 25-JUL-06 1234.56 Toronto Programmer 
+0

Вы можете сделать то же самое в любой базе данных SQL, которая поддерживает транзакции. Это не ясно из вопроса OP, но я предполагаю, что они уже совершили транзакцию, и слишком поздно откатываться. –