На превеликий жаль база 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
RESTORE
*****
Робимо резервну копію бази даних яку ми припускаємо експортувати, з папки% 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