web-dev-qa-db-fra.com

Changement dynamique en innodb_flush_log_at_trx_commit

Ceci est lié à cette question . Cela aide à obtenir de meilleures performances pour les tables InnoDB.

Selon manuel MySQL , innodb_flush_log_at_trx_commit est une variable dynamique globale. Ainsi, je peux le changer en utilisant la commande SET GLOBAL et cela semble fonctionner.

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

Mais, cela n'a pas modifié le paramètre MySQL réel. Lorsque j'ai mis à jour my.cnf et redémarré le serveur MySQL, cela a fonctionné. Donc, je ne peux pas changer la variable globale au moment de l'exécution?

Je préfère la valeur par défaut innodb_flush_log_at_trx_commit=1, mais je dois le changer en 2 avant d'exécuter un processus de restauration pour une grande base de données pour obtenir plus rapidement. Mais une fois le processus terminé, je souhaite redéfinir la valeur sur 1. Est-il possible de le faire au moment de l'exécution?

Je n'ai pas accès à my.cnf sur mon serveur d'hébergement partagé.

11
Sithu

Bien que je sois d'accord avec la recommandation de Rolando de modifier innodb_flush_method, Je ne savais pas à 100% ce que vous vouliez dire par:

il n'a pas modifié le paramètre MySQL réel

Je tiens à souligner la mise en garde que la modification de la variable GLOBAL affecte toutes les nouvelles connexions, mais ne modifie pas la session en cours (c'est moi qui souligne):

Le changement de variable globale n'affecte pas la variable de session pour tout client actuellement connecté ( pas même celui du client qui émet l'instruction SET GLOBAL ).

Donc pour vérifier que:

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)
12
Derek Downey

En définissant innodb_flush_log_at_trx_commit , vous risquez de confondre avec l'interopérabilité mysqld/OS. Je dis cela parce que le système d'exploitation est approuvé pour effectuer le vidage.

Notez la prudence de la Documentation MySQL

De nombreux systèmes d'exploitation et certains matériels de disque trompent l'opération de vidage sur disque. Ils peuvent dire à mysqld que la vidange a eu lieu, même si ce n'est pas le cas. Ensuite, la durabilité des transactions n'est pas garantie même avec le paramètre 1, et dans le pire des cas, une panne de courant peut même corrompre la base de données InnoDB. L'utilisation d'un cache disque sauvegardé par batterie dans le contrôleur de disque SCSI ou dans le disque lui-même accélère les vidages de fichiers et rend l'opération plus sûre. Vous pouvez également essayer d'utiliser la commande hdparm Unix pour désactiver la mise en cache des écritures sur disque dans les caches matériels, ou utiliser une autre commande spécifique au fournisseur de matériel.

Ce que cela dit est le suivant: l'OS peut mentir comme un mari qui triche. Le système d'exploitation indique qu'il videra le disque et ne le fera tout simplement pas. Par conséquent, même si vous définissez innodb_flush_log_at_trx_commit, vous devez séparer le vidage du système d'exploitation sur disque du vidage sur disque de mysqld.

Essayez de définir innodb_flush_method sur O_DIRECT si vous ne l'avez pas déjà fait. Vous pouvez voir une différence car la méthode de vidage diffère considérablement (Voir mon Mar 04, 2011 post Clarification sur la variable MySQL innodb_flush_method ).

CAVEAT

Comme vous l'avez mentionné, vous n'avez pas accès à my.cnf. Veuillez contacter le SysAdmin chez votre fournisseur et obtenir innodb_flush_method changé.

MISE À JOUR 2012-12-10 12:45 EDT

J'utilise actuellement MySQL 5.5.12 sur mon PC. Lorsque je me connecte et exécute show variables like 'innodb_flush_method'; Je reçois

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

mysql>

Puisqu'il est vide, cela indique simplement que le paramètre par défaut est utilisé. Veuillez lire mon article du 04 mars 2011 pour Clarification sur la variable MySQL innodb_flush_method

7
RolandoMySQLDBA