Чи можна очистити движок зберігання даних mysql innodb, щоб він не зберігав дані з видалених таблиць?
Або мені потрібно кожного разу відновлювати нову базу даних?
Чи можна очистити движок зберігання даних mysql innodb, щоб він не зберігав дані з видалених таблиць?
Або мені потрібно кожного разу відновлювати нову базу даних?
Відповіді:
Ось більш повна відповідь щодо InnoDB. Це трохи тривалий процес, але можна вартих зусиль.
Майте на увазі, що /var/lib/mysql/ibdata1
це найзайнятіший файл в інфраструктурі InnoDB. Зазвичай вона містить шість типів інформації:
Pictorial Representation of ibdata1
Багато людей створюють кілька ibdata
файлів, сподіваючись на краще управління дисковим простором та продуктивністю, однак ця думка помилкова.
OPTIMIZE TABLE
?На жаль, біг OPTIMIZE TABLE
проти таблиці InnoDB, що зберігається у спільному файлі простору таблиць, ibdata1
робить дві речі:
ibdata1
ibdata1
рости , тому що суміжні сторінки даних і індексні додаються доibdata1
Однак можна відокремити дані таблиці та індекси таблиць від ibdata1
них та самостійно керувати ними.
OPTIMIZE TABLE
з innodb_file_per_table
?Припустимо , що ви повинні були додати innodb_file_per_table
до /etc/my.cnf (my.ini)
. Чи можете ви просто запустити OPTIMIZE TABLE
всі таблиці InnoDB?
Хороші новини : Коли ви запустите OPTIMIZE TABLE
з innodb_file_per_table
увімкненим, це створить .ibd
файл для цієї таблиці. Наприклад, якщо у вас є таблиця з mydb.mytable
даними даних /var/lib/mysql
, вона створить наступне:
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
Повідомлення .ibd
міститиме сторінки даних та сторінки покажчиків для цієї таблиці. Чудово.
Погані новини : Все, що ви зробили, - це витягнути Сторінки даних та Індексні сторінки mydb.mytable
з проживання ibdata
. Запис у словнику даних для кожної таблиці, в тому числі mydb.mytable
, все ще залишається у словнику даних (Див. Зображення ibdata1 ). ВИ НЕ МОЖЕТЕ ПРОСТО ПРОБЛЕМАТИ ibdata1
НА ЦЕЙ ТОЧКІ !!! Зверніть увагу, що ibdata1
зовсім не скоротився.
Щоб стиснути ibdata1
раз і назавжди, ви повинні зробити наступне:
Скинути (наприклад, з mysqldump
) всі бази даних у .sql
текстовий файл ( SQLData.sql
використовується нижче)
Відкиньте всі бази даних (крім mysql
і information_schema
) CAVEAT : Для запобіжних заходів запустіть цей сценарій, щоб переконатися, що у вас є всі грантові користувачі:
mkdir /var/lib/mysql_grants
cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
chown -R mysql:mysql /var/lib/mysql_grants
Увійдіть до mysql та запустіть SET GLOBAL innodb_fast_shutdown = 0;
(Це повністю змине всі зміни, що залишилися у трансакції від ib_logfile0
та ib_logfile1
)
Вимкнення MySQL
Додайте наступні рядки до /etc/my.cnf
(або my.ini
в Windows)
[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G
(Сторінка: Що б ви не встановили innodb_buffer_pool_size
, переконайтеся, що innodb_log_file_size
це 25% innodb_buffer_pool_size
.
Також: innodb_flush_method=O_DIRECT
недоступно для Windows)
Видалити ibdata*
і ib_logfile*
, за бажанням, можна видалити всі папки /var/lib/mysql
, крім них /var/lib/mysql/mysql
.
Запустіть MySQL (Це дозволить відтворити ibdata1
[10 МБ за замовчуванням] ib_logfile0
та ib_logfile1
по 1G кожен).
Імпорт SQLData.sql
Тепер ibdata1
вони все ще будуть рости, але містять лише метадані таблиці, оскільки кожна таблиця InnoDB існуватиме поза межами ibdata1
. ibdata1
більше не буде містити дані InnoDB та індекси для інших таблиць.
Наприклад, припустимо, у вас є таблиця InnoDB mydb.mytable
. Якщо ви заглянете /var/lib/mysql/mydb
, ви побачите два файли, що представляють таблицю:
mytable.frm
(Заголовок двигуна зберігання)mytable.ibd
(Дані таблиці та індекси)З innodb_file_per_table
опцією в /etc/my.cnf
, ви можете запустити OPTIMIZE TABLE mydb.mytable
і файл /var/lib/mysql/mydb/mytable.ibd
фактично скоротиться.
Я робив це багато разів у своїй кар’єрі як MySQL DBA. Насправді, коли я це зробив, я скоротив файл на 50 ГБ ibdata1
до всього 500 МБ!
Спробувати. Якщо у вас є додаткові запитання щодо цього, просто запитайте. Довірся мені; це буде працювати як в короткостроковій перспективі, так і в довгостроковій перспективі.
На кроці 6, якщо mysql не вдасться перезапустити через те, що mysql
схема починає випадати, огляньтесь на крок 2. Ви зробили фізичну копію mysql
схеми. Відновити його можна наступним чином:
mkdir /var/lib/mysql/mysql
cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
chown -R mysql:mysql /var/lib/mysql/mysql
Поверніться до кроку 6 і продовжуйте
Що стосується встановлення innodb_log_file_size на 25% від innodb_buffer_pool_size на кроці 5, це правило для ковдр є досить старою школою.
Повернувшись July 03, 2006
, у Percona була чудова стаття, чому вибрати правильний innodb_log_file_size . Згодом Nov 21, 2008
Перкона переглянув ще одну статтю про те, як обчислити належний розмір, виходячи з пікового навантаження, зберігаючи зміни години .
З тих пір я писав повідомлення в DBA StackExchange про обчислення розміру журналу і де я посилався на ці дві статті Percona.
Aug 27, 2012
: Належна настройка таблиці 30 InnoDB на сервері з 48 Гб оперативної пам’ятіJan 17, 2013
: MySQL 5.5 - Innodb - innodb_log_file_size вище 4 ГБ разом?Особисто я все одно ходив би з правилом 25% для початкової установки. Потім, оскільки робоче навантаження можна більш точно визначити з часом у виробництві, ви могли змінити розмір журналів під час циклу технічного обслуговування за лічені хвилини.
innodb_open_tables
при необхідності. За замовчуванням - 300.
Двигун InnoDB не зберігає видалені дані. Під час вставлення та видалення рядків невикористаний простір залишається виділеним у файлах зберігання InnoDB. З часом загальний простір не зменшиться, але з часом «видалений і звільнений» простір буде автоматично використаний сервером БД.
Ви можете додатково настроїти та керувати простором, який використовує двигун, за допомогою ручного повторного використання таблиць. Для цього потрібно скинути дані в уражені таблиці за допомогою mysqldump, скинути таблиці, перезапустити службу mysql, а потім відтворити таблиці з файлів дампа.