2 ответов:
вот более полный ответ в отношении InnoDB. Это немного длительный процесс, но может стоить усилий.
имейте в виду, что
/var/lib/mysql/ibdata1является самым загруженным файлом в инфраструктуре InnoDB. Он обычно содержит шесть типов информации:
- Таблица Данных
- Таблица Индексов
- MVCC (Multiversioning Concurrency Control) сведения
- Сегментов Отката
- отменить Космос
- Таблица Данных (Словарь Данных)
- двойной буфер записи (фоновая запись для предотвращения зависимости от кэширования ОС)
- вставить буфер (управление изменениями в неуникальные вторичные индексы)
- посмотреть
Pictorial Representation of ibdata1Архитектура InnoDB
многие люди создают несколько
ibdataфайлы в надежде на лучшее дисковое пространство управление и производительность, однако это убеждение ошибочно.могу ли я запустить
OPTIMIZE TABLE?к сожалению, работает
OPTIMIZE TABLEпротив таблицы InnoDB, хранящейся в файле общего табличного пространстваibdata1делает две вещи:
- делает данные и индексы таблицы смежными внутри
ibdata1- делает
ibdata1растут, потому что смежные страницы данных и индекса добавлен toibdata1однако вы можете отделить табличные данные и табличные индексы от
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С datadir из/var/lib/mysql, он произведет следующее:
/var/lib/mysql/mydb/mytable.frm/var/lib/mysql/mydb/mytable.ibdThe
.ibdбудет содержать страницы данных и индексные страницы для этого стол. Отличный.Плохие Новости: все, что вы сделали, это извлечь страницы данных и индексировать страницы
mydb.mytableжить вibdata. Запись словаря данных для каждой таблицы, включаяmydb.mytable, по-прежнему остается в словаре данных (см. Изобразительное представление ibdata1). ВЫ НЕ МОЖЕТЕ ПРОСТО УДАЛИТЬibdata1В ЭТОТ МОМЕНТ !!! обратите внимание:ibdata1не уменьшился вообще.InnoDB Очистка Инфраструктуры
уменьшить
ibdata1раз и навсегда вы должны сделать следующее:
свалка (например, с
mysqldump) все базы данных в.sqlтекстовый файл (SQLData.sqlиспользуется ниже)удалить все базы данных (за исключением
mysqlиinformation_schema)будьте осторожны: в качестве меры предосторожности, пожалуйста, запустите этот скрипт, чтобы убедиться, что у вас есть все пользовательские гранты место: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)Shutdown 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_size25% от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(табличные данные и индексы)с на
/etc/my.cnf, вы можете запуститьOPTIMIZE TABLE mydb.mytableи файл/var/lib/mysql/mydb/mytable.ibdбудет на самом деле сокращаться.я делал это много раз в своей карьере в качестве MySQL DBA. На самом деле, в первый раз, когда я это сделал, я сжался 50GB
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 и далее
ОБНОВЛЕНИЕ 2013-06-04 11: 13 EDT
что касается установления innodb_log_file_size до 25%значение параметра innodb_buffer_pool_size в шаге 5 это общее правило довольно старой школы.
обратно на
July 03, 2006, у Перконы была хорошая статья почему выбрать правильный innodb_log_file_size. Позже, наNov 21, 2008, Перкона последовала еще одна статья о как вычислить правильный размер на основе пиковой нагрузки, сохраняя один час изменений.с тех пор я написал сообщения в DBA StackExchange о вычислении размера журнала и где я ссылался на эти две статьи Percona.
Aug 27, 2012:правильная настройка для таблицы 30GB InnoDB на сервере с 48GB РамJan 17, 2013:MySQL 5.5-Innodb-innodb_log_file_size выше 4 ГБ вместе взятых?лично я бы все равно пошел с правилом 25% для начальной настройки. Затем, поскольку рабочая нагрузка может быть более точно определена с течением времени в производстве,вы можете изменить размер журналов во время цикла обслуживания в течение нескольких минут.
механизм InnoDB не хранит удаленные данные. Когда вы вставляете и удаляете строки, неиспользуемое пространство остается выделенным в файлах хранения InnoDB. Со временем общее пространство не будет уменьшаться, но со временем "удаленное и освобожденное" пространство будет автоматически повторно использоваться сервером БД.
вы можете дополнительно настроить и управлять пространством, используемым двигателем, с помощью ручной реорганизации таблиц. Для этого сбросьте данные в затронутых таблицах с помощью mysqldump, отбросьте таблицы, перезапустите службу mysql, а затем повторно создайте таблицы из файлов дампа.

Comments