web-dev-qa-db-ja.com

innodb_flush_log_at_trx_commitへの動的な変更

これは この質問 に関連しています。 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にアクセスできません。

11
Sithu

私は変更するというRolandoの推奨に同意しますが、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)
12
Derek Downey

innodb_flush_log_at_trx_commit を設定すると、mysqld/OSの相互運用性との混乱を招くおそれがあります。 OSがフラッシュを実行するために信頼されているので、私はこれを言います。

MySQLドキュメンテーションからの注意に注意してください

多くのオペレーティングシステムと一部のディスクハードウェアは、ディスクへのフラッシュ操作をだます。フラッシュが行われていないにもかかわらず、フラッシュが行われたことをmysqldに通知する場合があります。その場合、設定1でもト​​ランザクションの耐久性は保証されません。最悪の場合、停電がInnoDBデータベースを破壊することさえあります。 SCSIディスクコントローラまたはディスク自体でバッテリバックアップ式のディスクキャッシュを使用すると、ファイルのフラッシュが高速化され、操作がより安全になります。また、Unixコマンドhdparmを使用してハードウェアキャッシュでのディスク書き込みのキャッシュを無効にするか、ハードウェアベンダーに固有のその他のコマンドを使用することもできます。

これは次のことを示しています。OSは浮気する夫のように嘘をつくことができます。 OSはディスクにフラッシュすると言っており、単純にはフラッシュしません。したがって、innodb_flush_log_at_trx_commitを設定しても、mysqldのディスクへのフラッシュからOSのディスクへのフラッシュを切り離す必要があります。

まだ設定していない場合は、 innodb_flush_method をO_DIRECTに設定してみてください。 flushメソッドが大きく異なるため、違いが見られる場合があります(My Mar 04, 2011投稿 MySQL innodb_flush_method variable の説明を参照)。

警告

ご指摘のとおり、my.cnfへのアクセス権がありません。プロバイダーのSysAdminに連絡して、 innodb_flush_method を変更してください。

UPDATE 2012-12-10 12:45 EDT

現在、自分のPCで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>

空白なので、デフォルト設定が使用されていることを示しているだけです。 MySQL innodb_flush_method variable の説明については、2011年3月4日の投稿をご覧ください。

7
RolandoMySQLDBA