Як безпечно змінити змінну 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 на сторінці конфігурації innodb mysql коментує, щоб змінити розмір файлу журналу до 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" функція init повернула помилку.
110216 9:48:41 [ПОМИЛКА] Не вдалося зареєструвати плагін "InnoDB" як ДЕРЖАВНЕ ЗБЕРІГАННЯ.

Отже, моє запитання: чи безпечно видалити старі файли log_files чи є інший метод зміни innodb_log_file_sizeзмінної?


1
Просто прокоментуйте innodb_log_file_size в my.ini .....

5
хм, чому я хотів би прокоментувати це використання значення за замовчуванням, коли я намагаюся змінити його зі значення за замовчуванням?
Дерек Дауні

Так, коментуючи рядок innodb_log_file_size його роботи .. Дякую.
muhammad umar farooq frank

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 EDT

Це чисто сторінка з усіх даних у буферній базі InnoDB перед повторним завантаженням файлів журналу. Ви повинні встановити цю опцію приблизно за годину до відключення:

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 EDT

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

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


1
Гарна відповідь і оновлення також чудово. Моя єдина пропозиція - скопіювати ib_logfiles в інше місце, якщо щось піде не так. Це допоможе вам отримати уявлення про розмір файлів: mysqlperformanceblog.com/2011/07/09/…
Justin Noel

5
Також працював і для мене, АЛЕ користувальницький інтерфейс консолі Linux може вводити в оману - запуск mysqld займає багато часу, якщо встановити великий розмір файлу журналу (кілька сотень МБ і більше). Інтерфейс консолі показує вам точки, а потім показує "не вдалося!", Але насправді MySQL все ще запускається. Зачекайте і продовжуйте читати файл журналу (або відслідковуйте файл журналу за допомогою "tail -f [log-file]"), поки ви не побачите "mysqld: готовий до з'єднань." і обидва файли журналу, виділені на диску.
f055

2
УВАГА!! крок 3 не працював для мене, і моє серце ледь не зупинилося, коли я побачив завантаження mysql без InnoDB, Довелося зупинити mysql та видалити їх вручну та запустити MySQL знову. дві поради: 1.
створити

2
Піюш правильний. Навіть документація на mysql рекомендує створити резервну копію ваших логінів у випадку, якщо щось піде не так
Грег,

1
@Greg саме тому я використовую 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
Це не "оновлення". Ці сторінки керівництва давно існують. Я завжди рекомендую інформацію з першої руки з посібника (одна з найкращих посібників там), а не винаходити колесо і дублювати інформацію (це те, що нас найбільше ненавидить DBA).
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 Ваша турбота, здається, підтримується документами
Джек Дуглас

Я переглянув цю відповідь і мені подобається перший рядок. Зазвичай у мене змушувались клієнти знижувати та вносити mysql --skip-networkingв якості запобіжних заходів, щоб уникнути цих змін в останню хвилину. Ваш перший рядок (встановлений 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 МБ. Для впевненості встановіть розмір файлу журналу 8 Гб


1
Не очевидно (мені щонайменше), що це насправді відповідає на питання. Це здається пропозицією щодо альтернативного розміру для файлу журналу, а не як безпечно змінити розмір файлу журналу.
RDFozz

1
@RDFozz ви праві. Це не відповідає, як змінити розмір файлу журналу. Це запитання відповідає на те, як розібратися з номером для встановлення innodb_log_file_size. Я вже відповів на таке питання п’ять років тому (Дивіться підзаголовку Log File Sizeв dba.stackexchange.com/questions/23189/… )
RolandoMySQLDBA

Я хотів лише допомогти: / Я знаю, що це не точна відповідь.
Linux Newbie

-4

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

Спробуйте, гарантовано працюйте [перевірено на Debian 6]


2
Це не гарантує чистого відключення. Це може працювати в середньому випадку на сервері з невеликим завантаженням, але це не рекомендується, якщо ви дбаєте про цілісність вашої бази даних.
Еміль Вікстрьом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.