Удаление огромных блоков данных из mysql innodb

  • Проснитесь, поразите дремоту в мое предупреждение
  • Вернитесь ко сну
  • Проснитесь, Хит дремота снова
  • Вернитесь ко сну
  • Проснитесь, Хит отклонение на моем предупреждении
  • Встаньте, лейтесь, подготовьтесь
  • Выпейте стекло воды
  • Сделайте несколько sit-ups/push-ups
  • Перейдите к работе
  • Ноутбук запуска OS X (Safari/Firefox, Adium (Несколько Учетных записей), Терминал, RDC пользователю TS и Администратор TS.
  • Проверка: статистика MRTG (Ищущий необычные вариации пропускной способности на различные сайты), Консоль Zenoss, электронная почта (особенно смотрят в течение 12:00 - электронные письма отключения электричества/обновления 7:00),
  • 9:00: Имейте один 'шот' кофе (или, если очень усталый имейте 75%-ю полную чашку).
  • 10:30: Другой 'шот' кофе в случае необходимости.
1
задан 12 May 2010 в 07:59
1 ответ

Можно минимизировать почти все время простоя, препятствуя тому, чтобы таблица была заблокирована.

Используйте a 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_;
2
ответ дан 3 December 2019 в 22:34

Теги

Похожие вопросы