Мне нужно удалить огромный кусок моих данных в моей производственной базе данных, размер которой составляет около 100 ГБ. Если возможно, я хотел бы минимизировать время простоя.
Мои критерии выбора для удаления, вероятно, будут
УДАЛИТЬ * ИЗ РАЗМЕЩЕНИЯ, ГДЕ USER.ID = 5 И UPDATED_AT <100
Как лучше всего его удалить?
Вы можете минимизировать почти все время простоя, не допуская блокировки стола.
Использовать SELECT INSERT
чтобы перенести данные, которые вы хотите, во временную таблицу.
Переименуйте таблицы.
Вам нужно будет рассмотреть любые INSERTS
в то время SELECT INSERT
бегал.
Наконец, отбросьте таблицу, содержащую ненужные данные.
Имейте в виду, что если у вас нет innodb_file_per_table
в вашей конфигурации, что выделенное дисковое пространство не будет освобождено.
Кроме того, для вашего приложения и конкретной ситуации потребуется особое внимание.
Вот процедура, которую я написал с помощью этого метода ..
# Temp table, recreating forty_first_transaction_
#
CREATE TABLE working_table_temp_ LIKE working_table_;
# Increment if there's an auto_increment field.
#
ALTER TABLE working_table_temp_ AUTO_INCREMENT = 15000000;
# Testing inserts and select while this query was running resulted success.
# Verified no active lock.
#
INSERT INTO working_table_temp_ SELECT * FROM working_table_ WHERE id > $NUM;
RENAME TABLE working_table_ TO working_table_old_;
RENAME TABLE working_table_temp_ TO working_table_;
# Verify that all rows were caught
#
# The last row < 15000000 in both tables should be identical.
#
SELECT * FROM working_table_ where id < 15000000 order by id desc limit 5;
SELECT * FROM working_table_old_ where id < 15000000 order by id desc limit 5;
# If not, we need to move them !
#
# This query will need to be modified.
#
INSERT INTO working_table_ SELECT * FROM working_table_old_ WHERE id > 138376577;
# Verify application functionality, if necessary.
#
# LAST CHANCE FOR BACKOUT !!!
#
# Once verified, get rid of the old data to free up some space.
#
DROP TABLE working_table_old_;
^D
df -h
## BACKOUT ##
RENAME TABLE working_table_ TO working_table_new_;
RENAME TABLE working_table_old_ TO working_table_;