Дефрагментація і стиснення innodb, одмінскій блог

На превеликий жаль база InnoDB працює за принципом ніпеля, тобто туди дуй, звідти х ... Пояснюючи це доступним мовою-табличний простір може як розширюватися так і зменшуватися, але фізичний розмір бази при цьому змінюється тільки в бік збільшення. Простіше кажучи якщо у вас база була на максимумі 20гігов, і після цього ви її почистивши звільнили 90% простору, всередині база у вас буде вільна на 90% (подивитися вільний простір можна командою в консолі управління сервером: mysql> show table status;), але зовні вона так і буде займати на диску 20 Гиг фізичного простору диска. Так ось у мене, на одному з серверів, вона встигла розростися, поки я прочухал той факт, що забув встановити очищуючий скриптик, до 250 гигов, які звичайно працюють як годинник, але самої цифрою діють мені на нерви. У зв'язку з цим треба щось робити. Але робити можна тільки одним способом, а саме перегнати базу в дамп sql і затягнути його назад, попередньо дропнув наявного монстра. У зв'язку з цим, рівно як і для дефрагментації табличного простору, нашим кращим другом є системна утиліта mysqldump, що входить в стандартний комплект поставки сервера mySQL.

*** Для дефрагментації InnoDB також можна використовувати спосіб подвійної перегонки бази, за допомогою команди ALTER перетворити її в тип MyISAM, а потім назад в тип InnoDB.
Дана утиліта дає можливість зробити миттєвий зліпок бази даних (на тему миттєвості звичайно це я так, для красивого словца- півтора гіга йшло хвилин 7, 250 пройшли за 2.5 години) представляє собою текстовий файл з набором SQL команд для створення і заповнення таблиць.
Власне приступаємо до роботи:

# Mysqldump -uSQL_USER_EXIM -p EXIM_DATABASE> /tmp/exim.sql

-u або -user = - ім'я користувача
-p -password - запит пароля
exim_database - ім'я бази даних
exim.sql - файл для виводу дампа

за раз можна загнатьв дамп кілька баз, якщо перерахувати їх один за одним, після опції -B або -databases:

# Mysqldump -uSQL_USER_EXIM -p database1 -B database2 database3> /tmp/database.sql

також можна зняти дамп всіх таблиць, якщо використовувати оператор -A або -all-databases:

# Mysqldump -uSQL_USER_EXIM -p -A> /tmp/database.sql

Дана операція займе якийсь час і місце на диску, залежне від обсягу бази SQL.

Після цього зупиняємо сервер mySQL

*****
З версії 6.x доступний так званий on-line backup для всіх типів баз. Його відмінні риси те, що він не блокує виконання INSERT / UPDATE / DELETE і виконується найпростішими командами:
BACKUP DATABASE to
RESTORE [OVERWRITE]
*****

Робимо резервну копію бази даних яку ми припускаємо експортувати, з папки% mysql% / data переписуємо файл бази і журналів InnoDB і відповідну їй папку з файлами * .frm в саме затишне місце на гвинті.

Після цього видаляємо таблицю і відповідні їй файли, і запускаємо сервер:

Сервер трохи подумає і відновить порожню базу InnoDB, після чого ми заливаємо в неї наш бекап. Зробити це можна двома способами, або з командного рядка:

# Mysql -uSQL_USER_EXIM -p EXIM_DATABASE

або з консолі сервера:

mysql> use EXIM_DATABASE;
mysql> source exim.sql

Після чого дивимося продуктивність і розмір диска, яку він обіймав базою.
******
Парочка корисних порад:

При обмежених ресурсах пам'яті або об'ємної базі даних, слід використовувати опцію -quick або -opt, це дозволить утиліті mysqldump почати робити дамп бази без попереднього завантаження її в пам'ять.

Також може виникнути необхідність вказівки кодування в якій ви хотіли б отримати дамп вашої бази, для цього використовується опція -default-character-set =

Опція -f дозволить продовжувати виконання резервування навіть при отриманні помилки в ході виконання процедури.

Зручна команда для автоматичного резервування зі стисненням:
mysqldump -uROOT -pPASSWD DBNAME | gzip -c> `date" +% Y-% m -. "` .gz

Також можливо резервіроватьна віддалений хост:
mysqldump -uROOT -PNUMBER_PORT -hHOST -pPASSWD DBNAME

Схожі статті