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

Rolandoの変更の推奨に同意しinnodb_flush_methodますが、あなたが何を意味するのかは100%明確ではありませんでした。

実際の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';ために実行すると、ログアウトして再度ログインするまで、意味のない問題が発生することを経験しました。
RolandoMySQLDBA

@Rolando私も!また、「接続」できることがわかって嬉しかったです。ログアウトして再度ログインする代わりに。時間を節約できます。
Derek Downey

この実行の概念はconnect、MySQLでは実際に新しいものです。私はPostgreSQLとOracleでこれを100万回実行しました。私はかつてMySQLがそれを許可することを考えたことはありませんでした
RolandoMySQLDBA

@DTest、ご回答ありがとうございます。私の詳細なテストによると、それは動的に機能しました。私のlocalhostでは、接続を実行せずにセッション変数が変更されました(発行時にエラーが発生しましたconnect)。値2では、2,241,319レコードのインポートに27分43秒かかりましたが、値1では約1日かかりました。設定は現在のセッションで機能しているようですがmy.cnf、再起動後に元の設定(から)を復元しました。
Sithu

@DerekDowney、これは特定の設定のためだけinnodb_flush_log_at_trx_commitですか?それとも、すべての設定についてglobal、現在のセッションに影響を与えない設定ですか?
Pacerier、2015

7

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に設定してみてください。フラッシュメソッドが大きく異なるため、違いが見られる場合があります(MySQL innodb_flush_method変数に関する私のMar 04, 2011投稿の説明を参照してください)。

警告

おっしゃったように、へのアクセス権がありません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の説明のための2011年3月4日の投稿を読んでくださいinnodb_flush_method変数


私はまずローカルホストでテストしました。私は見つけることができませんでしたinnodb_flush_methodではmy.ini(ありませんmy.cnf)。サーバー情報
-Apache

サーバーのバージョンやini / cnfに関係なく、構成ファイルにはinnodb_flush_method設定SHOW VARIABLESがなく、表示されないことに気付きました。
Sithu

あなたのアップデートのおかげで、私もそれを手に入れました、なぜ私たちはその値を見ることができないのかと思っただけです。my.iniまたはで見つけることができずmy.cnf、動的変数でもないため、どのように構成すればよいかわかりません。
Sithu
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.