2010-08-11 2 views
489

Я использую MySQL в localhost как «инструмент запроса» для выполнения статистики в R, то есть каждый раз, когда я запускаю R-скрипт, я создаю новую базу данных (A), создаю новую таблицу (B), импортировать данные в B, отправить запрос, чтобы получить то, что мне нужно, а затем я отбрасываю B и отбрасываю A.Как сжать/очистить файл ibdata1 в MySQL

Это работает отлично для меня, но я понимаю, что размер файла ibdata быстро увеличиваясь, я ничего не хранил в MySQL, но файл ibdata1 уже превысил 100 МБ.

Я использую более или менее значение по умолчанию MySQL для установки, есть ли способ, чтобы я мог автоматически сжимать/очищать файл ibdata1 через определенный период времени?

+0

Дополнительная ссылка: [ibdata1 растет в геометрической прогрессии, когда innodb_file_per_table сконфигурирован] (HTTP: //dba.stackexchange .com/q/39125) – hakre

ответ

701

Это ibdata1 не уменьшается это особенно раздражает особенность MySQL. Файл ibdata1 фактически не может быть сокращен, если вы не удалите все базы данных, не удалите файлы и не перезагрузите дамп.

Но вы можете настроить MySQL так, чтобы каждая таблица, включая ее индексы, хранилась как отдельный файл. Таким образом, ibdata1 не будет расти как большой. Согласно Bill Karwin's comment, это включено по умолчанию с версии 5.6.6 MySQL.

Это было давно. Я сделал это.Однако, чтобы настроить сервер использовать отдельные файлы для каждой таблицы необходимо изменить my.cnf для того, чтобы включить это:

[mysqld] 
innodb_file_per_table=1 

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

Как вы хотите, чтобы вернуть пространство от ibdata1 вы на самом деле нужно удалить файл:

  1. Выполните mysqldump всех баз данных, процедур, триггеров и т.д. кроме mysql и performance_schema баз данных
  2. Отбросьте все базы данных кроме вышеуказанных 2 баз данных
  3. Остановить MySQL
  4. Удалить ibdata1 и ib_log файлы
  5. Запуск MySQL
  6. Восстановление из отвала

При запуске 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-движок памяти, который отбрасывается и регенерируется при остановке/перезапуске mysqld. См. https://dev.mysql.com/doc/refman/5.7/en/information-schema.html.

+0

Нет необходимости в «= 1» в соответствии с http://dev.mysql.com/doc/refman/5.1/en/innodb-multiple-tablespaces.html –

+13

Что касается информационных_схем ​​и performance_schema ? –

+0

@JordanMagnuson Я попробовал это на тестовом сервере, это не позволило мне (зарегистрировался как пользователь root/admin mysql) drop information_schema. Итак, нет. – Umbrella

30

Когда вы удаляете таблицы 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

-2

Как уже отмечалось, вы не можете сжимать ibdata1 (для этого вам необходимо сбрасывать и перестраивать), но также часто нет необходимости.

Использование autoextend (возможно, самая распространенная настройка размера) ibdata1 предопределяет хранение, увеличиваясь каждый раз, когда он почти заполнен. Это делает записи быстрее, поскольку пространство уже выделено.

Когда вы удаляете данные, он не сжимается, а пространство внутри файла помечено как неиспользуемое. Теперь, когда вы вставляете новые данные, он будет повторно использовать пустое пространство в файле, прежде чем расширять файл.

Таким образом, он будет продолжать расти только в том случае, если вам действительно нужны эти данные. Если вам действительно не нужно место для другого приложения, вероятно, нет причин его сжимать.

+62

Думаю, вы слишком пренебрегаете необходимостью освобождать пространство. – drewish

+2

У меня есть раздел с твердым состоянием 60Gig. Я быстро бегу из космоса, так как я работаю с базами данных 4 + gig. Я хочу переместить mysql в другой раздел в ближайшее время, но этот вопрос и ответы будут мне помогать, тем временем – NullVoxPopuli

+3

Спасибо за этот ответ, это очень полезно. Я очистил некоторые таблицы из унаследованных данных ... хорошо знать, что размер на диске не будет расти снова в ближайшее время. – Brad

5

Если ваша цель - контролировать свободное пространство MySQL, и вы не можете остановить MySQL, чтобы сжать файл ibdata, а затем получить его через команды статуса таблицы.Пример:

MySQL> 5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}' 

< MySQL 5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}' 

Затем сравните это значение вашего ibdata файла:

du -b ibdata1 

Источник: http://dev.mysql.com/doc/refman/5.1/en/show-table-status.html

13

If you use the InnoDB storage engine for (some of) your MySQL tables, you’ve probably already came across a problem with its default configuration. As you may have noticed in your MySQL’s data directory (in Debian/Ubuntu – /var/lib/mysql) lies a file called ‘ibdata1′. It holds almost all the InnoDB data (it’s not a transaction log) of the MySQL instance and could get quite big. By default this file has a initial size of 10Mb and it automatically extends. Unfortunately, by design InnoDB data files cannot be shrinked. That’s why DELETEs, TRUNCATEs, DROPs, etc. will not reclaim the space used by the file.

Я думаю, что вы можете найти хорошее объяснение и решение там:

http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/

28

Добавление к John P's answer,

Для системы Linux, шаги 1-6 могут быть выполнены с этими командами:

  1. mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
  2. DROP DATABASE database_name
  3. sudo /etc/init.d/mysqld stop
  4. sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile (и удалять любые другие ib_logfile, которое может быть названо ib_logfile0, ib_logfile1 и т.д ...)
  5. sudo /etc/init.d/mysqld start
  6. create database [database_name]
  7. mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

Предупреждение: эти инструкции приведут к потере других баз данных, если у вас есть другие базы данных в этом экземпляре mysql. Убедитесь, что шаги 1,2 и 6,7 изменены для охвата всех баз данных, которые вы хотите сохранить.

+5

Вам нужно повторить 1,2 и 6 для каждой базы данных с таблицами InnoDB. – EJP

+4

Вам нужно еще несколько шагов между # 5 и # 6. Вам необходимо воссоздать базу данных и повторно назначить разрешения. Поэтому из командной строки mysql client'create database database_name; 'и затем« предоставить все привилегии на имя_базы. * На «имя пользователя» @ «localhost», идентифицированное «password»; ' – fred

+0

@fred Мне не нужно предоставлять привилегии при выполнении это. Возможно, потому, что я воссоздал базу данных с тем же именем? – crmpicco

1

В новой версии рецептов mysql-сервера выше будет раздавлена ​​база данных «mysql». В старой версии он работает. В новых таблицах переключается на тип таблицы INNODB, и при этом вы будете наносить им ущерб. Самый простой способ сбросить все, что вам базы данных, удаление MySQL-сервер, добавить в оставшихся my.cnf:

[mysqld] 
innodb_file_per_table=1 


erase all in /var/lib/mysql 
install mysql-server 
restore users and databases 
Смежные вопросы