Динамічна зміна на innodb_flush_log_at_trx_commit


11

Це пов’язано з цим питанням . Це допомагає досягти кращої продуктивності для таблиць InnoDB.

Згідно з посібником MySQL , innodb_flush_log_at_trx_commitце глобальна динамічна змінна. Таким чином, я можу змінити його за допомогою команди SET GLOBAL і, здається, працює.

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected

mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set

Але фактичні настройки MySQL не змінилися. Коли я оновив my.cnf і перезапустив сервер MySQL, він спрацював. Отже, я не можу змінити глобальну змінну під час виконання?

Я вважаю за краще значення за замовчуванням innodb_flush_log_at_trx_commit=1, але мені потрібно змінити його на 2, перш ніж запустити процес відновлення для великої бази даних, щоб швидше. Але коли процес закінчений, я хочу змінити значення назад на 1. Чи можливо це зробити під час виконання?

Я не маю доступу до my.cnf на своєму спільному сервері хостингу.

Відповіді:


12

Хоча я згоден з рекомендацією Роландо змінити innodb_flush_method, я не був на 100% зрозумілий, що ви мали на увазі під цим:

фактичні настройки MySQL не змінилися

Я хочу зазначити застереження, що внесення змін до змінної GLOBAL впливає на будь-які нові з'єднання, але не змінює поточний сеанс (моє наголос):

Глобальна зміна змінної не впливає на змінну сеансу для будь-якого клієнта, який зараз підключений ( навіть не для клієнта, який видає оператор SET GLOBAL ).

Отже, щоб перевірити це:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)


mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 1     |
+--------------------------------+-------+
1 row in set (0.00 sec)

mysql> connect;
Connection id:    6
Current database: *** NONE ***

mysql> SHOW SESSION VARIABLES LIKE 'innodb_flush_log%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| innodb_flush_log_at_trx_commit | 2     |
+--------------------------------+-------+
1 row in set (0.00 sec)

2
Ця відповідь має сенс. Документація ( dev.mysql.com/doc/refman/5.5/en/… ) не говорить про те, що змінна на рівні сеансу може бути змінена лише на глобальному рівні. Я відчував, що багато разів змінюючи max_connections SET GLOBAL max_connections = 1000;і коли я бігаю, SHOW VARIABLES LIKE 'max_connections';щоб побачити старе значення, буде означати гайки, поки я не вийду з нього і повернусь.
RolandoMySQLDBA

@Rolando мене теж! також був радий, коли виявив, що можу "підключитися"; замість виходу та повернення назад. Економить час!
Дерек Дауні

Ця концепція роботи connectнасправді нова для мене в MySQL. Я це зробив мільйон разів у PostgreSQL та Oracle. Я ніколи не думав про те, щоб MySQL дозволив це
RolandoMySQLDBA

@DTest, Дякую за вашу відповідь. Згідно з моїм глибоким випробуванням, це діяло динамічно. У мій localhost змінна сеансу змінена без запуску підключення (я отримав помилку під час випуску connect). Зі значенням 2 імпорт 2,241,319 записів зайняв 27 хвилин 43 секунди, тоді як значення 1 зайняло близько 1 дня, але налаштування, здається, працює в поточному сеансі, але воно відновило початкові налаштування (з my.cnf) після перезавантаження.
Сіту

@DerekDowney, це лише для певних налаштувань, як innodb_flush_log_at_trx_commit? Або так, що для всіх налаштувань налаштування globalне вплине на поточний сеанс?
Pacerier

7

Встановивши innodb_flush_log_at_trx_commit , ви ризикуєте переплутатись із сумісністю mysqld / OS. Я говорю це тому, що ОС довіряє виконувати флеш.

Зверніть увагу на обережність у документації MySQL

Багато операційних систем та деякі дискові апаратури нерозумно працюють на диску. Вони можуть сказати mysqld, що приплив відбувся, навіть якщо цього не відбулося. Тоді довговічність транзакцій не гарантується навіть із налаштуванням 1, а в гіршому випадку відключення електроенергії може навіть пошкодити базу даних InnoDB. Використання кешованого накопичувача диска в контролері диска SCSI або на самому диску прискорює змивання файлів і робить роботу безпечнішою. Ви також можете спробувати використовувати команду hdparm Unix для відключення кешування записів диска в кеш-пам'яті апаратних засобів або використовувати якусь іншу команду, специфічну для постачальника обладнання.

Про це говорить наступне: ОС може брехати, як чоловік, який обманює. ОС каже, що він буде переповнюватися на диск і просто не робить цього. Тому, навіть якщо ви встановили innodb_flush_log_at_trx_commit, ви повинні розлучитися з промиванням ОС на диску від промивання mysqld на диск.

Спробуйте встановити innodb_flush_method на O_DIRECT, якщо ви цього ще не зробили. Ви можете побачити різницю, оскільки метод флеш сильно відрізняється (Дивіться моє Mar 04, 2011повідомлення Роз'яснення на змінній MySQL innodb_flush_method ).

КАВАТИ

Як ви вже згадували, ви не маєте доступу до нього my.cnf. Будь-ласка, зв’яжіться зі службою SysAdmin у свого постачальника та перейдіть на зміну innodb_flush_method .

ОНОВЛЕННЯ 2012-12-10 12:45 EDT

На моєму ПК я зараз запускаю MySQL 5.5.12. Коли я підключаюся і запускаю, show variables like 'innodb_flush_method';отримую

mysql> show variables like 'innodb_flush_method';
+---------------------+-------+
| Variable_name       | Value |
+---------------------+-------+
| innodb_flush_method |       |
+---------------------+-------+
1 row in set (0.05 sec)

mysql>

Оскільки він порожній, він просто вказує, що використовується налаштування за замовчуванням. Будь ласка, прочитайте мій пост 04 березня 2011 року для роз'яснення змінної MySQL змінної innodb_flush_method


Я перевірив свій локальний господар спочатку. Я не міг знайти innodb_flush_methodв my.ini(не my.cnf). Інформація про сервер - Apache 2.4.1, PHP 5.4.4, MySQL 5.5
Sithu

Я помітив, що незалежно від версії сервера або ini / cnf, файл конфігурації не має innodb_flush_methodналаштувань і SHOW VARIABLESне показує його.
січня

Дякуємо за ваш ОНОВЛЕННЯ, я також отримав це, я просто задумався, чому ми не можемо побачити його значення. Оскільки я не зміг його знайти в, my.iniабо my.cnfце не динамічна змінна, я не знаю, як це можна налаштувати.
Сіту
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.