Динамическое изменение на 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, мне не совсем понятно, что вы имели в виду:

это не изменило фактическую настройку MySQL

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

Изменение глобальной переменной не влияет на переменную сеанса для любого подключенного в данный момент клиента ( даже для клиента, который выдает инструкцию 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';чтобы увидеть старое значение, приводит к сумасшествию, пока я не выйду из системы и не вернусь обратно. +1 для этой точки зрения, которая считается само собой разумеющейся и часто забываемой.
RolandoMySQLDBA

@ Роландо мне тоже! Кроме того, я был рад, когда обнаружил, что могу «соединиться»; вместо выхода и возврата. Экономит время!
Дерек Дауни

Эта концепция работы connectна самом деле является новой для меня в MySQL. Я делал это миллион раз в PostgreSQL и Oracle. Я никогда не думал, что MySQL разрешит это
RolandoMySQLDBA

@DTest, спасибо за ваш ответ. Согласно моему глубокому тесту, он работал динамически. В моем локальном хосте переменная сеанса была изменена без запуска connect (я получил ошибку при выпуске connect). При значении 2 импорт 2 241 319 записей занял 27 минут 43 секунды, тогда как при значении 1 это заняло около 1 дня. Параметр, кажется, работает в текущем сеансе, но my.cnfпосле перезапуска восстановил исходную настройку (из ).
Sithu

@DerekDowney, это только для определенных настроек как innodb_flush_log_at_trx_commit? Или для всех настроек установка globalне повлияет на текущую сессию?
Pacerier

7

Установив innodb_flush_log_at_trx_commit , вы рискуете запутаться с совместимостью mysqld / OS. Я говорю это, потому что ОС доверяют для выполнения сброса.

Обратите внимание на осторожность в документации MySQL

Многие операционные системы и некоторые дисковые устройства обманывают операцию записи на диск. Они могут сказать mysqld, что сброс произошел, хотя это не так. Тогда длительность транзакций не гарантируется даже с параметром 1, и в худшем случае перебои в подаче электроэнергии могут даже повредить базу данных InnoDB. Использование дискового кеша с резервным питанием от батареи в контроллере диска SCSI или на самом диске ускоряет очистку файлов и делает работу более безопасной. Вы также можете попробовать использовать команду Unix hdparm, чтобы отключить кэширование записи на диск в аппаратных кэшах, или использовать другую команду, специфичную для поставщика оборудования.

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

Попробуйте установить innodb_flush_method в O_DIRECT, если вы еще этого не сделали. Вы можете увидеть разницу, потому что метод flush сильно отличается (см. Мой Mar 04, 2011пост прояснение по переменной MySQL innodb_flush_method ).

ПРЕДОСТЕРЕЖЕНИЕ

Как вы упомянули, у вас нет доступа к my.cnf. Пожалуйста, свяжитесь с SysAdmin у вашего провайдера и измените innodb_flush_method .

ОБНОВЛЕНИЕ 2012-12-10 12:45 ПО ВОСТОЧНОМУ ВРЕМЕНИ

Я сейчас использую 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.03.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не показывает их.
Sithu

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