Take the 2-minute tour ×
Database Administrators Stack Exchange is a question and answer site for database professionals who wish to improve their database skills and learn from others in the community. It's 100% free, no registration required.

Is there a way to delete an InnoDB table or database with pending transactions in MySQL (preferably on file system level)?

What happened:

I use MySQL 5.5.28 and ran LOAD DATA INFILE… to import a huge data set (300M rows) into an InnoDB table. I did not use set autocommit = 0; before. Unfortunately, mysqld was stopped right in the middle of the import.

When I restart mysql, it tries to roll back the transaction filling the system log with messages like this:

mysqld_safe[4433]: 121212 16:58:52 InnoDB: Waiting for 1 active transactions to finish

The problem is that the roll back is running for more that 25 hours now during which mysqld is not accepting any socket connections.

I cannot just delete /var/lib/mysql/* and start from scratch because there are some other InnoDB databases/tables on this machine as well. However, the problematic table is the only table in a separate database. Deleting the entire table or the entire database is not a problem since I can re-import all data afterwards.

share|improve this question

1 Answer 1

up vote 6 down vote accepted

There is nothing you can really do because a rollback is being done via the UNDO tablespace inside ibdata1, which should have grown immensely.

If you kill the mysqld process and restart mysql, it will just pickup where it left off as part of the crash recovery cycle.

DISCLAIMER : Not Responsible for Data Loss

What you could do may result in data loss for other tables, but there is something you can do to circumvent InnoDB's normal crash recovery cycle.

There is a startup option called innodb_force_recovery, which allows you to bypass various stages of InnoDB crash recovery.

According to MySQL Documentation on Forcing InnoDB Recovery, here are the settings and its effects:

1 (SRV_FORCE_IGNORE_CORRUPT)

Let the server run even if it detects a corrupt page. Try to make SELECT * FROM tbl_name jump over corrupt index records and pages, which helps in dumping tables.

2 (SRV_FORCE_NO_BACKGROUND)

Prevent the master thread from running. If a crash would occur during the purge operation, this recovery value prevents it.

3 (SRV_FORCE_NO_TRX_UNDO)

Do not run transaction rollbacks after crash recovery.

4 (SRV_FORCE_NO_IBUF_MERGE)

Prevent insert buffer merge operations. If they would cause a crash, do not do them. Do not calculate table statistics.

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

Do not look at undo logs when starting the database: InnoDB treats even incomplete transactions as committed.

6 (SRV_FORCE_NO_LOG_REDO)

Do not do the redo log roll-forward in connection with recovery.

With transactional changes buried in the UNDO and REDO logs, you run the risk of

  • losing data meant to be written
  • keeping data meant to be deleted

In case you expect bad side effects, backup the entire /var/lib/mysql and put it somewhere in case you want to copy ibdata1, ib_logfile0, and ib_logfile1 and retry normal recovery.

If mysql is fully up in one of the modes

  • mysqldump all data except the offending table
  • shutdown mysql
  • remove everything in /var/lib/mysql except /var/lib/mysql/mysql
  • start mysql
  • reload the mysqldump

CAVEAT : Make sure you backup everything !!!

I hope this helps !!!

share|improve this answer
    
+1 ...there's really no other answer. –  Derek Downey Dec 12 '12 at 20:49
    
+1 Rolando, I'm amazed that nearly every time I have a weird MySQL problem, you have the answer. –  Stefan Lasiewski Jun 3 at 22:55

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.