Я использую MySQL в localhost в качестве «инструмента запросов» для выполнения статистики в R, то есть каждый раз, когда я запускаю скрипт R, я создаю новую базу данных (A), создаю новую таблицу (B), импортирую данные в B , отправьте запрос, чтобы получить то, что мне нужно, а затем я опускаю B и отбрасываю A.
Это нормально работает для меня, но я понимаю, что размер файла ibdata быстро увеличивается, я ничего не хранил в MySQL, но файл ibdata1 уже превысил 100 МБ.
Я использую более или менее настройку MySQL по умолчанию для установки, есть ли способ, которым я могу автоматически сжимать / очищать файл ibdata1 через фиксированный период времени?
Ответы:
Это
ibdata1
не сокращает, является особенно раздражающей особенностью MySQL.ibdata1
Файл фактически не может быть уменьшен , если вы не удалите все базы данных, удалите файлы и перезагрузите дамп.Но вы можете настроить MySQL так, чтобы каждая таблица, включая ее индексы, сохранялась как отдельный файл. Таким образом
ibdata1
, не будет расти как большой. Согласно комментарию Билла Карвина, это включено по умолчанию в версии 5.6.6 MySQL.Это было некоторое время назад, я сделал это. Однако, чтобы настроить ваш сервер на использование отдельных файлов для каждой таблицы, вам нужно изменить
my.cnf
, чтобы включить это:http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
Поскольку вы хотите освободить место,
ibdata1
вы должны удалить файл:mysqldump
все базы данных, процедуры, триггера и т.д. , за исключениемmysql
иperformance_schema
баз данныхibdata1
иib_log
файлыПри запуске MySQL на шаге 5,
ibdata1
иib_log
файлы будут восстановлены.Теперь вы готовы идти. Когда вы создаете новую базу данных для анализа, таблицы будут располагаться в отдельных
ibd*
файлах, а не вibdata1
. Поскольку вы обычно удаляете базу данных вскоре после этого,ibd*
файлы будут удалены.http://dev.mysql.com/doc/refman/5.1/en/drop-database.html
Вы, наверное, видели это:
http://bugs.mysql.com/bug.php?id=1341
Используя команду
ALTER TABLE <tablename> ENGINE=innodb
илиOPTIMIZE TABLE <tablename>
можно извлечь данные и индексные страницы из ibdata1 в отдельные файлы. Однако ibdata1 не будет уменьшаться, если вы не выполните описанные выше шаги.Что касается того
information_schema
, что не нужно и не возможно отбросить. На самом деле это просто набор представлений только для чтения, а не таблиц. И нет никаких файлов, связанных с ними, даже каталог базы данных.informations_schema
Используют память DB-двигатель и отбрасываются и регенерируют после остановки / перезапуска туздЫ. См. Https://dev.mysql.com/doc/refman/5.7/en/information-schema.html .источник
innodb_file_per_table
по умолчанию.Добавляя к ответу Джона П ,
Для системы linux шаги 1-6 могут быть выполнены с этими командами:
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
DROP DATABASE [database_name];
sudo /etc/init.d/mysqld stop
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(и удалите любой другой файл ib_logfile, который может быть названib_logfile0
иib_logfile1
т. д.)sudo /etc/init.d/mysqld start
create database [database_name];
mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql
Предупреждение: эти инструкции приведут к потере других баз данных, если у вас есть другие базы данных в этом экземпляре mysql. Убедитесь, что шаги 1,2 и 6,7 изменены, чтобы охватить все базы данных, которые вы хотите сохранить.
источник
create database database_name;
а затемgrant all privileges on database_name.* to 'username'@'localhost' identified by 'password';
Password:
командной строке (что является более безопасной практикой), просто введите-p
без действительного пароля.Когда вы удаляете таблицы innodb, MySQL не освобождает пространство внутри файла ibdata, поэтому продолжает расти. Эти файлы почти не уменьшаются.
Как сжать существующий файл ibdata:
http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html
Вы можете написать сценарий и запланировать запуск сценария через определенный промежуток времени, но для описанной выше установки кажется, что несколько табличных пространств - более простое решение.
Если вы используете опцию конфигурации
innodb_file_per_table
, вы создаете несколько табличных пространств. То есть MySQL создает отдельные файлы для каждой таблицы вместо одного общего файла. Эти отдельные файлы хранятся в каталоге базы данных, и они удаляются при удалении этой базы данных. Это должно устранить необходимость сокращения / очистки файлов ibdata в вашем случае.Дополнительная информация о нескольких табличных пространствах:
http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html
источник
Я думаю, что вы можете найти хорошее объяснение и решение там:
http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/
источник
Быстро запишем процедуру принятого ответа в bash:
Сохранить как
purge_binlogs.sh
и запустить какroot
.Исключено
mysql
,information_schema
,performance_schema
(иbinlog
каталог).Предполагается, что у вас есть полномочия администратора
/root/.my.cnf
и ваша база данных находится в/var/lib/mysql
каталоге по умолчанию .Вы также можете очистить двоичные журналы после запуска этого сценария, чтобы восстановить больше места на диске с помощью:
источник
alldatabases.sql
перед двойной проверкой, если все таблицы исправны. Что касается некоторых улучшений: установитеinnodb_fast_shutdown=0
перед выключением, установитеautocommit=0
перед импортом файла SQL, выполнитеCOMMIT
и установитеautocommit=1
после импорта файла SQL, используйтеmysqlcheck --all-databases
перед удалением резервной копии.Если ваша цель - следить за свободным пространством MySQL, и вы не можете остановить MySQL для сокращения файла ibdata, то получите его с помощью команд состояния таблицы. Пример:
MySQL> 5.1.24:
MySQL <5.1.24:
Затем сравните это значение с вашим файлом ibdata:
Источник: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html
источник
В новой версии MySQL-сервера приведенные выше рецепты сокрушат базу «MySQL». В старой версии это работает. В некоторых новых таблицах переключается на тип таблицы INNODB, и таким образом вы повредите их. Самый простой способ:
источник
Как уже отмечалось, вы не можете сжать ibdata1 (для этого вам нужно создать дамп и пересобрать), но в этом также нет особой необходимости.
Используя автоматическое расширение (вероятно, самый распространенный параметр размера), ibdata1 предварительно выделяет хранилище, увеличиваясь при каждом его заполнении. Это делает запись быстрее, так как пространство уже выделено.
Когда вы удаляете данные, они не уменьшаются, но пространство внутри файла помечается как неиспользуемое. Теперь, когда вы вставляете новые данные, они будут повторно использовать пустое пространство в файле перед дальнейшим расширением файла.
Так что он будет только расти, если вам действительно нужны эти данные. Если вам не нужно пространство для другого приложения, вероятно, нет причин его уменьшать.
источник
storage leak
.