patternsqlMinor
Recover the disk space after deleting rows from table
Viewed 0 times
afterrowsdeletingthespacediskrecoverfromtable
Problem
I deleted millions of rows from one of the table with innodb engine. I know that I need to run
There are no constraints or foreign keys.
optimize table to recover the space. But running that will cause lock on the table, which will affect the production queries. Is there any other way to recover the space without affecting the production queries.innodb_file_per_table is ON and there are about 15,221,827 rows in the table.There are no constraints or foreign keys.
Solution
You will have to take the table offline to prevent any reads or writes that would get locked and probably have to roll back. If the table is called
Any queries attempting to read from or write to
Give it a Try !!!
UPDATE 2013-08-26 15:24 EDT
Look back at the code I suggested. Please note the line
That line takes the table offline with respect to the application.
To get a good idea how long it should take to optimize run the following:
However long this takes, is how long it will actually take to run.
mydb.mytable, here is what you must do:USE mydb
DROP TABLE IF EXISTS mytablenew;
CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytable RENAME mytableold;
INSERT INTO mytablenew SELECT * FROM mytableold;
ANALYZE TABLE mytablenew;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;Any queries attempting to read from or write to
mytable will fail immediately rather than hang on a lock from OPTIMIZE TABLE.Give it a Try !!!
UPDATE 2013-08-26 15:24 EDT
Look back at the code I suggested. Please note the line
ALTER TABLE mytable RENAME mytableold;That line takes the table offline with respect to the application.
To get a good idea how long it should take to optimize run the following:
USE mydb
CREATE TABLE mytablenew LIKE mytable;
INSERT INTO mytablenew SELECT * FROM mytable;However long this takes, is how long it will actually take to run.
Code Snippets
USE mydb
DROP TABLE IF EXISTS mytablenew;
CREATE TABLE mytablenew LIKE mytable;
ALTER TABLE mytable RENAME mytableold;
INSERT INTO mytablenew SELECT * FROM mytableold;
ANALYZE TABLE mytablenew;
ALTER TABLE mytablenew RENAME mytable;
DROP TABLE mytableold;ALTER TABLE mytable RENAME mytableold;USE mydb
CREATE TABLE mytablenew LIKE mytable;
INSERT INTO mytablenew SELECT * FROM mytable;Context
StackExchange Database Administrators Q#48740, answer score: 7
Revisions (0)
No revisions yet.