Как безопасно изменить переменную MySQL innodb 'innodb_log_file_size'?

105

Так что я довольно новичок в настройке InnoDB. Я медленно меняю таблицы (при необходимости) с MyIsam на InnoDB. У меня есть около 100 МБ в innodb, поэтому я увеличил innodb_buffer_pool_sizeпеременную до 128 МБ:

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

Когда я пошел, чтобы изменить innodb_log_file_sizeзначение (например, my.cnf на странице конфигурации mysql в комментариях к innodb, чтобы изменить размер файла журнала на 25% от размера буфера. Итак, теперь мой my.cnf выглядит так:

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

Когда я перезагружаю сервер, я получаю эту ошибку:

110216 9:48:41 InnoDB: Инициализация пула буферов, размер = 128.0M
110216 9:48:41 InnoDB: Завершена инициализация пула буферов
InnoDB: Ошибка: файл журнала ./ib_logfile0 имеет другой размер 0 5242880 байт
InnoDB: чем указано в файл .cnf 0 33554432 байт!
110216 9:48:41 [ОШИБКА] Плагин 'Функция инициализации InnoDB' вернула ошибку.
110216 9:48:41 [ОШИБКА] Ошибка регистрации плагина InnoDB в качестве ДВИГАТЕЛЯ ХРАНЕНИЯ.

Итак, мой вопрос: безопасно ли удалить старые log_files или есть другой способ изменить innodb_log_file_sizeпеременную?

Дерек Дауни
источник
1
Просто прокомментируйте innodb_log_file_size в my.ini .....
5
хм, почему я хочу закомментировать это, чтобы использовать значение по умолчанию, когда я пытаюсь изменить его по умолчанию?
Дерек Дауни
Да, комментируя строку innodb_log_file_size, она работает .. Спасибо.
Мухаммад Умар Фарук Франк
2
@muhammadumarfarooqfrank Конечно, это работает - потому что вы больше не изменяете значение переменной, поэтому весь вопрос становится спорным. Я бы хотел, чтобы был способ снизить комментарии.
dr01

Ответы:

83

Да, безопасно удалить файл журнала после завершения работы mysqld

В свете этого просто выполните следующие шаги:

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

Запуск mysqld воссоздаст ib_logfile0иib_logfile1

Попробуйте!

ОБНОВЛЕНИЕ 2011-10-20 16:40 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Он аккуратно выводит все данные из пула буферов InnoDB перед повторным редактированием файлов журналов, вы должны установить эту опцию примерно за 1 час до выключения:

SET GLOBAL innodb_max_dirty_pages_pct = 0;

По умолчанию innodb_max_dirty_pages_pct имеет значение 75 (MySQL 5.5+) или 90 (до MySQL 5.5). Установка этого значения в ноль сохраняет количество грязных страниц менее 1% от пула буферов InnoDB. Выполнение service mysql stopделает это в любом случае. Кроме того, завершение работы завершит все оставшиеся элементы в журнале повторов. Чтобы сохранить эту опцию, просто добавьте ее в /etc/my.cnf:

[mysqld]
innodb_max_dirty_pages_pct = 0

ОБНОВЛЕНИЕ 2013-04-19 16:16 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Я немного обновил свой ответ с помощью innodb_fast_shutdown, потому что для этого я перезапускал mysql и останавливал mysql. Теперь этот один шаг жизненно важен, потому что каждая незафиксированная транзакция может иметь другие движущиеся части внутри и за пределами журналов транзакций InnoDB ( см. Инфраструктура InnoDB ).

Обратите внимание, что установка innodb_fast_shutdown в 2 также очистит журналы, но больше движущихся частей все еще существует и будет выбрано в Crash Recovery во время запуска mysqld. Установка 0 лучше.

RolandoMySQLDBA
источник
1
Хороший ответ и обновление тоже отличное. Мое единственное предложение было бы скопировать ib_logfiles в другое место на случай, если что-то пойдет не так. Это поможет вам составить представление о размере файлов: mysqlperformanceblog.com/2011/07/09/…
Джастин Ноэль,
5
Сработало и у меня, НО: интерфейс консоли Linux может вводить в заблуждение - запуск mysqld занимает много времени, если вы установили большой размер файла журнала (несколько сотен МБ или более). Консольный пользовательский интерфейс показывает вам точки, а затем показывает «сбой!», Но на самом деле MySQL все еще запускается. Подождите и продолжайте читать файл журнала (или следите за файлом журнала с помощью «tail -f [log-file]»), пока не увидите «mysqld: готов к подключению». и оба файла журнала размещены на диске.
f055
2
ПРЕДУПРЕЖДЕНИЕ!! шаг 3 не работал для меня, и мое сердце почти остановилось, когда я увидел загрузку mysql без InnoDB, пришлось остановить mysql и удалить их вручную и снова запустить MySQL. два совета: 1.
сделайте
2
Peeyush правильно. Даже документация mysql рекомендует создавать резервные копии ваших лог-файлов на случай, если что-то пойдет не так
Грег
1
@ Грег, поэтому я использую SET GLOBAL innodb_fast_shutdown = 0;. Когда MySQL завершает работу, все транзакции сбрасываются со всех движущихся частей, включая журналы повторов (ib_logfile0 и ib_logfile1). Можно их сохранить. Мне еще не приходилось сталкиваться с проблемами с полностью очищенными журналами.
RolandoMySQLDBA
31

Вместо этого я бы порекомендовал официальный метод , который я привожу здесь для удобства:

Чтобы изменить количество или размер файлов журнала InnoDB в MySQL 5.6.7 или более ранней версии , используйте следующие инструкции. Используемая процедура зависит от значения innodb_fast_shutdown, которое определяет, следует ли полностью обновлять системное табличное пространство перед операцией завершения работы:

  • Если для innodb_fast_shutdown не задано значение 2: остановите сервер MySQL и убедитесь, что он выключается без ошибок, чтобы в журнале повторов не было информации об ожидающих транзакциях. Скопируйте старые файлы журнала повторов в безопасное место на случай, если во время выключения что-то пойдет не так, и они понадобятся вам для восстановления табличного пространства. Удалите старые файлы журнала из каталога файлов журнала, отредактируйте файл my.cnf, чтобы изменить конфигурацию файла журнала, и снова запустите сервер MySQL. mysqld видит, что при запуске не существует файлов журнала InnoDB, и создает новые.

  • Если для innodb_fast_shutdown задано значение 2: установите для innodb_fast_shutdown значение 1:

mysql> SET GLOBAL innodb_fast_shutdown = 1;

Затем следуйте инструкциям в предыдущем пункте.

Начиная с MySQL 5.6.8 , параметр innodb_fast_shutdown больше не имеет значения при изменении количества или размера файлов журнала InnoDB. Кроме того, вам больше не нужно удалять старые файлы журналов, хотя вы все равно можете скопировать старые файлы журналов в безопасное место в качестве резервной копии. Чтобы изменить количество или размер файлов журнала InnoDB, выполните следующие действия:

  1. Остановите сервер MySQL и убедитесь, что он выключается без ошибок.

  2. Отредактируйте my.cnf, чтобы изменить конфигурацию файла журнала. Чтобы изменить размер файла журнала, настройте innodb_log_file_size. Чтобы увеличить количество файлов журнала, настройте innodb_log_files_in_group.

  3. Запустите сервер MySQL снова.

Если InnoDB обнаружит, что innodb_log_file_size отличается от размера файла журнала повторов, он запишет контрольную точку журнала, закроет и удалит старые файлы журнала, создаст новые файлы журнала в запрошенном размере и откроет новые файлы журнала.

Случайное зерно
источник
Это хороший ответ как обновление на этот вопрос. +1 !!!
RolandoMySQLDBA
2
Это не «обновление». Эти справочные страницы давно существуют. Я всегда рекомендую информацию из первых рук из руководства (одно из лучших руководств) вместо того, чтобы изобретать велосипед и дублировать информацию (это то, что наши администраторы ненавидят больше всего).
RandomSeed
Это предпочтительный метод с MySQL 5.6. Если вы все еще работаете с версией до 5.6, это не сработает.
Дерек Дауни
20

innodb_buffer_pool_sizeпросто измените my.cnf( my.ini) и перезапустите mysqld.

innodb_log_file_sizeменее критично. Не меняйте его, если нет причин. Роланд представил шаги , но меня беспокоит один аспект ... Я не знаю, важны ли первые два шага; кажется, что они могут быть:

  1. set innodb_fast_shutdown = OFF
  2. перезапустите MySQL
  3. остановить MySQL
  4. удалить файлы журналов
  5. начать MySQL

Файлы журнала отслеживают незаконченные дела; « innodb_fast_shutdown» говорит, чтобы иметь дело с этим материалом после перезапуска. Таким образом, удаление файлов может потерять информацию?

Новые версии улучшили вещи: (больше обсуждения в комментариях)

  • 5,6 позволяет для innodb_log_file_size> 4 ГБ
  • 5.6 innodb_log_file_sizeможно изменить без предварительного удаления iblog *
  • 5.7 позволяет динамически изменять размеры innodb_buffer_pool_size

Должен ли я изменить log_file_size?

Используйте GLOBAL STATUSдля вычисления количества минут до циклов регистрации.

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

Если оно намного меньше 60 (минут), это может помочь увеличить log_file_size. Если это намного больше, тогда файлы журнала тратят впустую дисковое пространство. Этот «1 час» довольно произвольный, поэтому, если вы близки к нему, не беспокойтесь об изменении log_file_size.

Оставьте innodb_log_files_in_groupпо умолчанию 2.

Рик Джеймс
источник
+1 Ваши документы, кажется, поддерживаются документами
Джек Дуглас
Я посмотрел на этот ответ, и мне нравится первая строка. Я обычно --skip-networkingзаставлял клиентов включать и выключать MySQL в качестве меры предосторожности, чтобы эти изменения были сделаны в последнюю минуту. Ваша первая строка (set innodb_fast_shutdown = OFF) устраняет это. +1 !!!
RolandoMySQLDBA
1
Спасибо за отзывы. Новым читателям это может не понадобиться. В 5.6.8 , innodb_log_file_sizeбыла увеличена , чтобы изменить его , не снимая iblog файлы.
Рик Джеймс
Вы имеете в виду «более критично», а не «менее критично»?
Игорь
@Igor - Нет. Если у вас слишком маленький log_file_size, через него будут проходить дополнительные операции ввода-вывода. Я редко вижу это. Если он у вас слишком большой, вы просто тратите место на диске. Целью его установки является циклический переход за один час. Но 10 минут против 10 часов - не имеет большого значения. подробнее ...
Рик Джеймс
1

Когда вы входите в MySQL, введите эти команды:

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

Вы получите два номера. Сначала вы получаете один, а затем подождите минуту. Вы получите другой.

Скажем, первый - 3.456.718.123, а второй - 4.098.873.134.

Сейчас (4.098.873.134-3.856.718.123) * 60/1024/1024

Результат = 13,856 МБ

У вас есть два файла журнала. Так что разделите его на два, и вы получите число около 7.000 МБ. Просто чтобы быть уверенным, установите размер файла журнала 8GB

Linux Новичок
источник
1
Не очевидно (по крайней мере для меня), что это действительно отвечает на вопрос. Похоже, это предложение альтернативного размера файла журнала, а не того, как безопасно изменить размер файла журнала.
RDFozz
1
@RDFozz ты прав. Это не ответ, как изменить размер файла журнала. Этот вопрос отвечает на вопрос о том, как определить число для установки innodb_log_file_size. Я уже отвечал на такой вопрос пять лет назад (см. ПодзаголовокLog File Size в dba.stackexchange.com/questions/23189/… )
RolandoMySQLDBA
Я только хотел помочь: / Я знаю, что это не точный ответ, хотя.
Linux Newbie
-4

chown mysql: mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || перезапуск службы mysql

Попробуйте, гарантированно будет работать [проверено на Debian 6]

Грегори
источник
2
Это не гарантирует чистое отключение. В среднем он может работать на сервере с небольшой нагрузкой, но это не рекомендуется, если вы заботитесь о целостности своей базы данных.
Эмиль Викстрем