2

サーバーのディスク容量が不足していたため、テーブルの変更 (tmp テーブルへのコピー) プロセスを強制終了する必要がありました。私の ibdata ファイルは現在 40 GB の大きさで、8 GB のディスク容量しか残っていません (いいえ、サーバーには 8 GB の RAM しかないため、ディスク容量を追加することはできず、RAM ディスクを使用することもできません)。

私の理解では、テーブルの変更プロセスを強制終了したとしても、MySQL は十分なディスク領域が利用可能になるとすぐにそれを完了しようとします。

「'%tmp%' のような状態を表示する;」によると、0 個の tmp テーブルと 5 個の tmp ファイルがあります。

「SHOW ENGINE INNODB STATUS;」によると、「トランザクション 0、開始されていません」エントリは 1 つだけです (およびいくつかのファイル I/O エントリ)。

情報スキーマによると、私のテーブルは約です。20 GB で、私の ibdata ファイルは 40 GB です (このデータベースには InnoDB テーブルが 1 つだけあります)。

保留中のすべての変更をフラッシュしたり、すべての tmp テーブルを削除したりする方法はありますか (ステータスを表示してもリストされません)。

また、なぜ innodb_buffer_pool_size が 8 GB に設定されているのか (8 GB RAM サーバー上で) 疑問に思っています。私は InnoDB の設定を一切変更しておらず、my.cnf ファイルには実際には何もありません。これはデフォルト値のように見えますか?

ありがとう: ラース

4

1 に答える 1

1

おっしゃるとおり、を kill してもALTER TABLE、テーブルの新しいコピーを作成しようとし続けます。この操作は、そのステップが完了した後にのみ「強制終了」されます。kill -9mysqld プロセス以外では、中断する方法はありません。ディスク容量が不足するとエラーが発生することに注意してください。ALTER TABLEその時点で中止し、一時テーブルをクリーンアップしてから終了すると思います。

変更のフラッシュに関する質問については、によって行われている作業をフラッシュするコマンドはありませんALTER TABLE。他のタイプの変更の場合、set global innodb_fast_shutdown=0mysqld をシャットダウンすると、バッファ プール内のすべてのダーティ ページがフラッシュされ、ロールバック セグメント内のガベージがパージされ、変更バッファ内の保留中のインデックス変更がマージされます。しかし、これは に対しては何もしませんALTER TABLE。その結果、シャットダウンALTER TABLEが完了するまで待機することになると思います。

バッファープールに関する質問については、別の値を指定しない場合、デフォルトの innodb_buffer_pool_sizeは 128MB です。構成ファイルで 8GB に設定する必要があります。Ubuntu は/etc/mysql/conf.d複数の構成ファイルが存在するディレクトリをサポートしており、これはこれらの構成ファイルのいずれかに設定できることに注意してください。


大きな ibdata1 ファイルがあり、余分なスペースを占有するものは何もないかもしれません。

一時テーブルは、MySQL での処理が完了するとクリーンアップされますが、使用中に ibdata1 ファイルのサイズが増加した可能性があります。MySQL は ibdata1 ファイルを縮小しませんが、割り当てられたスペースを後のデータに再利用します。

はい、ibdata1 を縮小する唯一の方法は、すべての InnoDB データをダンプし、mysqld をシャットダウンしrm、ibdata1 ファイルをフィジカル化し、mysqld を起動してから、ダンプしたデータを再インポートすることです。これは、長年にわたって MySQL ユーザーにとって大きな不便でした。

innodb_file_per_table今後この問題に直面しないように、データをインポートする前に有効にすることをお勧めします。MySQL は引き続きグローバル InnoDB データ用に ibdata1 を必要としますが、サイズは小さくなるはずです。また、InnoDB テーブル (一時的かどうかにかかわらず) を削除または変更すると、ディスク領域の一部が再利用されます。これは実際、MySQL 5.6 ではデフォルトで有効になっています。


mysqld は、いくつかの場所で my.cnf を探します。

  1. /var/lib/mysql/my.cnf (データディレクトリ)
  2. /usr/my.cnf (ベースディレクトリ)
  3. /etc/my.cnf

したがって、それらの場所をチェックして、 のミステリー設定を持つ別の my.cnf を探しますinnodb_buffer_pool_size=8G

MySQL が my.cnf を見つける方法の詳細については、http://dev.mysql.com/doc/refman/5.6/en/option-files.html を参照してください

于 2013-11-09T22:04:07.393 に答える