@vadya0505

Способ уменьшить размер БД InnoDB без дампа?

Приветствую. Встал остро вопрос об уменьшении БД на диске, т.к. на сайте ведутся логи (в базу данных), то база достигла 6 ГБ, естественно если просто удалить записи из InnoDB то место занимаемое на диске никак не меняется. Прочитал про дамп, но 1) это геморно, 2) долго, 3) нужно тормозить на достаточно длительное время сайт.
Полазив в phpMyAdmin решил попробовать такой способ:
1) Удаляем ненужные записи в базе
2) Конвертируем таблицу (НЕ БАЗУ) в MyISAM (ALTER TABLE .... ну я просто поменял тип базы в "Операции" над таблицей), оптимизируем MyISAM таблицу.
3) Конвертируем обратно в InnoDB (так же через phpMyAdmin).

В итоге вижу что место занимаемое базой уменьшилось. А теперь внимание вопрос - такой вариант имеет место быть или есть какие то подводные камни? Пока я пробовал только на копии базы это провернуть, на реальной базе пока боюсь. Подскажите что может пойти не так? Или все нормально и можно делать!
  • Вопрос задан
  • 3286 просмотров
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Если ненужные записи в разрезе логов = все старые логи, то делаете партицирование по дате. Ненужные более старые данные в будущем дропаются целиком всем разделом, просто и без длительных блокировок.

2) Конвертируем таблицу (НЕ БАЗУ) в MyISAM (ALTER TABLE .... ну я просто поменял тип базы в "Операции" над таблицей), оптимизируем MyISAM таблицу.
3) Конвертируем обратно в InnoDB (так же через phpMyAdmin).

Блокировка записи на всё время перестроения. И, емнип, alter table tablename engine=innoodb; (даже если таблица уже в innodb) спровоцирует копирование таблицы с сопутствующим сжатием неиспользуемых пространств. Т.е. конвертирование в myisam избыточно.

А так можно поиграться с созданием новой таблички идентичной старой, копированием через insert select в неё нужных данных, затем копированием актуальных данных и финальным rename и докопированием того что попало в старую табличку до rename. Это не сложно, если табличка именно логов - т.е. только insert и select. Если есть update или delete то надо опять же извращаться. Или согласовывать простой.
Ответ написан
@lubezniy
Как я понимаю, для таких операций нужно иметь достаточно времени (на время преобразования таблица будет полностью заблокирована, а переписываться в MyISAM она будет вся) и места на диске. И, разумеется, крайне желательно перед выполнением операции сделать бэкап.
Ответ написан
Комментировать
@BorisKorobkov Куратор тега MySQL
Web developer
https://dev.mysql.com/doc/refman/5.7/en/optimize-t...

Но при любом из вариантов таблица будет длительное время залочена.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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