MySQL innodb変数「innodb_log_file_size」を安全に変更する方法は?


105

だから、私はInnoDBをチューニングするのはかなり新しいです。MyIsamからInnoDBに(必要に応じて)テーブルをゆっくりと変更しています。innodbに約100MBあるので、innodb_buffer_pool_size変数を128MB に増やしました。

mysql> show variables like 'innodb_buffer%';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)

innodb_log_file_size値を変更しようとしたとき(mysqlのinnodb構成ページのコメント my.cnfの例では、ログファイルのサイズをバッファーサイズの25%に変更します。したがって、my.cnfは次のようになります。

# innodb
innodb_buffer_pool_size = 128M
innodb_log_file_size = 32M

サーバーを再起動すると、次のエラーが表示されます。

110216 9:48:41 InnoDB:バッファープールの初期化、サイズ= 128.0M
110216 9:48:41 InnoDB:バッファープールの初期化の完了
InnoDB:エラー:ログファイル./ib_logfile0は異なるサイズ0 5242880バイト
InnoDB:で指定されたものより.cnfファイル0 33554432バイト!
110216 9:48:41 [エラー]プラグイン 'InnoDB' init関数がエラーを返しました。
110216 9:48:41 [エラー]ストレージエンジンとしてのプラグイン 'InnoDB'の登録に失敗しました。

私の質問:古いlog_filesを削除しても安全innodb_log_file_sizeですか、それとも変数を変更する別の方法がありますか?


1
my.iniのinnodb_log_file_sizeにコメントするだけ...

5
うーん、なぜデフォルト値から変更しようとするときにデフォルト値を使用するためにコメントアウトしたいのですか?
デレクダウニー

はい、innodb_log_file_sizeの行にコメントしてコメントしてください。
ムハンマドウマルファルークフランク

2
@muhammadumarfarooqfrankもちろん動作します-変数の値をもう変更していないので、全体のポイントが無効になります。コメントに投票する方法があればいいのにと思います。
dr01

回答:


83

はい、mysqldがシャットダウンしたらログファイルを削除しても安全です

これを踏まえて、次の手順を実行してください。

mysql -uroot -p... -e"SET GLOBAL innodb_fast_shutdown = 0"
service mysql stop
mv /var/lib/mysql/ib_logfile[01] /tmp
service mysql start

mysqldを起動すると再作成されib_logfile0ib_logfile1

試してみる !!!

2011-10-20 16:40 EDTの更新

ログファイルをやり直す前にInnoDBバッファープール内のすべてのデータをきれいにページアウトします。シャットダウンの約1時間前にこのオプションを設定する必要があります。

SET GLOBAL innodb_max_dirty_pages_pct = 0;

デフォルトでは、innodb_max_dirty_pages_pctは75(MySQL 5.5+)または90(MySQL 5.5より前)です。これをゼロに設定すると、ダーティページの数がInnoDBバッファープールの1%未満に維持されます。service mysql stopとにかくこれを実行します。また、シャットダウンすると、REDOログの残りの項目がすべて終了します。このオプションを維持するには、/ etc / my.cnfに追加するだけです。

[mysqld]
innodb_max_dirty_pages_pct = 0

更新2013-04-19 16:16 EDT

これを行うにはmysqlを再起動し、mysqlを停止していたため、innodb_fast_shutdownで回答をもう少し更新しました。現在、コミットされていないすべてのトランザクションには、InnoDBトランザクションログの内部および外部に他の可動部分がある可能性があるため、この1ステップが不可欠です(InnoDBインフラストラクチャを参照)。

innodb_fast_shutdownを2に設定するとログも消去されますが、さらに多くの可動部分が存在し、mysqldの起動中にクラッシュリカバリで選択されることに注意してください。0の設定が最適です。


1
いい答えだし、アップデートも素晴らしい。私の唯一の提案は、何かがうまくいかない場合に別の場所にib_logfilesをコピーすることです。これにより、ファイルのサイズを設定する方法を知ることができます。mysqlperformanceblog.com
Justin Noel

5
私のためにも働いたが、LinuxコンソールUIは誤解を招く可能性がある-大きなログファイルサイズ(数百MB以上)を設定すると、mysqldの起動に時間がかかる。コンソールUIにはドットが表示され、「失敗!」と表示されますが、実際にはMySQLがまだ起動しています。「mysqld:ready for connections」が表示されるまで、ログファイルの読み取りを待機します(または、「tail -f [log-file]」でログファイルを監視します)。そして、両方のログファイルがディスクに割り当てられます。
f055

2
警告!!ステップ3がうまくいかず、InnoDBなしでmysqlがロードされるのを見て、心臓がほぼ停止しました。mysqlを停止して手動で削除し、MySQLを再起動する必要がありました。アドバイスの2枚:1.バックアップあなたは既に既存のログファイル、2.手動でファイルを削除
Peeyush Kushwaha

2
Peeyushは正しいです。mysqlのドキュメントでも、何か問題が発生した場合にログファイルをバックアップすることを推奨しています。
グレッグ

1
@Gregこれが私が使用する理由ですSET GLOBAL innodb_fast_shutdown = 0;。MySQLがシャットダウンすると、トランザクションのすべてが、REDOログ(ib_logfile0およびib_logfile1)を含むすべての可動部分からフラッシュされます。それらを保持できます。完全にフラッシュされたログに関する問題はまだ発生していません。
RolandoMySQLDBA

31

代わりに、公式の方法をお勧めします。便宜上、ここで再現します。

MySQL 5.6.7以前でInnoDBログファイルの数またはサイズを変更するには、次の手順を使用します。使用する手順は、innodb_fast_shutdownの値によって異なります。innodb_fast_shutdownは、シャットダウン操作の前にシステムテーブルスペースを完全に最新にするかどうかを決定します。

  • innodb_fast_shutdownが2に設定されていない場合、MySQLサーバーを停止し、エラーなしでシャットダウンすることを確認して、REDOログに未解決のトランザクションに関する情報がないことを確認します。シャットダウン中に問題が発生し、テーブルスペースを回復するために必要な場合に備えて、古いREDOログファイルを安全な場所にコピーします。ログファイルディレクトリから古いログファイルを削除し、my.cnfを編集してログファイルの構成を変更し、MySQLサーバーを再起動します。mysqldは、起動時にInnoDBログファイルが存在しないことを確認し、新しいログファイルを作成します。

  • innodb_fast_shutdownが2に設定されている場合:innodb_fast_shutdownを1に設定します。

mysql> SET GLOBAL innodb_fast_shutdown = 1;

次に、前の項目の指示に従います。

MySQL 5.6.8以降、InnoDBログファイルの数またはサイズを変更する場合、innodb_fast_shutdown設定は関係なくなりました。さらに、古いログファイルをバックアップとして安全な場所にコピーすることもできますが、古いログファイルを削除する必要はなくなりました。InnoDBログファイルの数またはサイズを変更するには、次の手順を実行します。

  1. MySQLサーバーを停止し、エラーなしでシャットダウンすることを確認します。

  2. my.cnfを編集して、ログファイルの構成を変更します。ログファイルのサイズを変更するには、innodb_log_file_sizeを構成します。ログファイルの数を増やすには、innodb_log_files_in_groupを構成します。

  3. MySQLサーバーを再起動します。

InnoDBは、innodb_log_file_sizeがREDOログファイルのサイズと異なることを検出すると、ログチェックポイントを書き込み、古いログファイルを閉じて削除し、要求されたサイズで新しいログファイルを作成し、新しいログファイルを開きます。


これは、この質問に対する更新としての良い回答です。+1 !!!
RolandoMySQLDBA

2
これは「更新」ではありません。これらのマニュアルページは長い間存在していました。私は常に、車輪を再発明して情報を複製する(DBAが最も嫌いなものです)のではなく、マニュアル(世の中にある最高のマニュアルの1つ)からの直接的な情報をお勧め​​します。
ランダムシード

これは、MySQL 5.6以降で推奨される方法です。5.6より前のバージョンでまだ実行している場合、これは機能しません。
デレクダウニー

20

innodb_buffer_pool_size-単に変更my.cnfmy.ini)して、mysqldを再起動します。

innodb_log_file_sizeそれほど重要ではありません。理由がない限り、変更しないでください。ローランドは手順を提供しましたが、1つの側面が私を心配しています...最初の2つの手順が重要であるかどうかはわかりません。彼らができるように思われる:

  1. set innodb_fast_shutdown = OFF
  2. mysqlを再起動します
  3. mysqlを停止します
  4. ログファイルを削除する
  5. mysqlを起動します

ログファイルは、未完了のビジネスを追跡します。「innodb_fast_shutdown」は再起動後にそのようなものに対処するよう指示しています。ファイルを削除すると情報が失われる可能性がありますか?

新しいバージョンでは改善されています:( コメントでさらに議論)

  • 5.6 innodb_log_file_size> 4GBを許可
  • 5.6 innodb_log_file_sizeは、最初にiblog *を削除せずに変更できます
  • 5.7は動的なサイズ変更を可能にします innodb_buffer_pool_size

log_file_sizeを変更する必要がありますか?

GLOBAL STATUSログサイクル前の分数を計算するために使用します。

Uptime / 60 * innodb_log_file_size / Innodb_os_log_written`

60(分)をはるかに下回る場合、log_file_sizeを増やすと役立つ場合があります。それ以上の場合、ログファイルはディスク容量を浪費しています。その「1時間」はかなりarbitrary意的であるため、それに近い場合は、log_file_sizeを変更する必要はありません。

innodb_log_files_in_groupデフォルトの2のままにします。


+1あなたの懸念はドキュメント
Jack Douglas

この答えを見て、最初の行が好きです。私は通常、クライアント--skip-networkingにこれらの土壇場の変更を邪魔にならないようにするための予防措置としてmysqlを上下させました。最初の行(innodb_fast_shutdown = OFFに設定)はそれを排除します。+1 !!!
RolandoMySQLDBA

1
賛辞をありがとう。新しい読者はこれを必要としないかもしれません。では5.6.8innodb_log_file_sizeiblogファイルを削除せずに、それを変更できるように拡張されました。
リックジェームズ

「それほど重要ではない」という意味ではなく、「より重要な」という意味ですか?
イゴール

@Igor-いいえ。log_file_sizeが小さすぎると、余分なI / Oがスラッシングします。私はめったにそれを見ません。大きすぎると、ディスク容量が無駄になります。設定の目標は、1時間で循環することです。しかし、10時間と10時間のどちらも重要ではありません。もっと...
リック・ジェームス

1

mysqlにログオンするときに、次のコマンドを入力します。

pager grep seq;
show engine innodb status \G select sleep(60); show engine innodb status \G

2つの数字が表示されます。最初に取得してから、1分間待ちます。別のものを取得します。

最初のものは3.456.718.123で、2番目のものは4.098.873.134であるとします

現在(4.098.873.134-3.856.718.123)* 60/1024/1024

結果は= 13.856 MBです

2つのログファイルがあります。2で割ると、7.000 MB近くの数値が得られます。念のため、ログファイルのサイズを8GBに設定します


1
これが実際に質問に答えていることは(少なくとも私には)明らかではありません。これは、ログファイルのサイズを安全に変更する方法ではなく、ログファイルの代替サイズの提案のようです。
RDFozz

1
@RDFozzあなたは正しい。これは、ログファイルのサイズを変更する方法には答えません。この質問は、innodb_log_file_sizeを設定するために数値を計算する方法に答えます。私はすでに5年前にそのような質問に回答しました(dba.stackexchange.com/questions/23189/…の小見出しLog File Sizeを参照してください)
RolandoMySQLDBA

私は助けたかっただけです:/しかし、私はその正確な答えではないことを知っています。
Linux初心者

-4

chown mysql:mysql -R / etc / mysql / var / lib / mysql && cd / var / lib / mysql && rm -f ib_logfile * && service mysql restart || サービスmysqlの再起動

試してみて、動作することが保証されています[Debian 6でテスト済み]


2
これは、完全なシャットダウンを保証するものではありません。負荷が軽いサーバーでは平均的なケースで機能する可能性がありますが、データベースの整合性に注意する場合はお勧めしません。
エミールヴィクストローム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.