なぜTRUNCATE TABLE
ステートメントが時々ハングしますか?このタイプの問題の理由は何ですか?
MySQLからMariaDBに移行しています。この問題はMySQLでは発生せず、MariaDBでのみ発生します。
ぶら下げステートメントは単純です:
TRUNCATE TABLE sampledb.datatable;
これを引き起こす原因は何ですか?どのように修正できますか?
もう1つの観察は、テーブルにデータがあり、1行または2行の場合、切り捨てクエリは正常に機能します。そうしないと、テーブルに大量のデータが含まれ、クエリがハングします。
TRUNCATE TABLE
の実行中にパフォーマンスの低下または停止が発生する理由は、このステートメントの既知の問題です。参照してください Bug#68184:Truncate tableが原因でinnodbストールが発生します。 以前のバージョンで開かれた他のバグ番号もあります。
以下を使用できます。
CREATE TABLE log_table_new LIKE log_table;
RENAME TABLE log_table TO log_table_old, log_table_new TO log_table;
DROP TABLE log_table_old;
AUTO_INCREMENT
値を持つテーブルの場合は注意が必要です。新しいテーブルは、作業テーブルですぐに使用されるAUTO_INCREMENT
値で作成されます。同じ値を使用したくない場合は、次のことができます。
ALTER TABLE log_table_new AUTO_INCREMENT=some high enough value;
TRUNCATE TABLE はDMLではなくDDLであることを覚えておく必要があります。
TRUNCATE TABLE の配管のどこに行き詰まっているのかを把握するのではなく、問題をあなたのこれを交換して自分の手
TRUNCATE TABLE sampledb.datatable;
これとともに
CREATE TABLE sampledb.datatablenew LIKE sampledb.datatable;
ALTER TABLE sampledb.datatable RENAME sampledb.datatablezap;
ALTER TABLE sampledb.datatablenew RENAME sampledb.datatable;
DROP TABLE sampledb.datatablezap;
これは問題をオフラインにするかもしれません(おそらくDROP TABLE
)、しかしテーブルはすぐに利用可能になります。 DROP TABLE
はMySQL 5.5.23で改善されました 。
私は過去の投稿で TRUNCATE TABLE について説明しました
Jul 09, 2012
: TRUNCATE TABLEに非常に長い時間がかかる原因は何ですか?Jan 17, 2012
; InnoDBの「テーブルごと」のファイルサイズの問題Sep 28, 2011
: ファイルが移動されたInnoDBテーブルを復元する方法試してみる !!!
詳細な情報がないと言うのは難しく、私は特にMySQL/MariaDBの専門家ではありませんが、クエリの実行に通常よりも予想以上に時間がかかる一般的な理由は次のとおりです。
Mariadbでは、truncate tableはドロップテーブルとして機能し、空のテーブルを暗黙的に再作成します。ただし、セッションがアクティブなテーブルロックを保持している場合、切り捨て操作は実行できません。
InnoDBテーブルの場合のみ、InnoDBは、テーブルを参照する_TRUNCATE TABLE
_制約がある場合、行を1つずつ削除して_FOREIGN KEY
_を処理します。 _FOREIGN KEY
_制約がない場合、InnoDBは元のテーブルを削除し、同じ定義で空のテーブルを作成することで高速トランケーションを実行します。テーブルに少数のレコードがある場合、切り捨ては高速であり、多くのレコードがある場合、切り捨ては無限であると述べているので、InnoDBとFKがあると仮定できます。
また、テーブルを切り捨てる前に、IS_FREE_LOCK(str)
関数を試して、テーブルがロックされているかどうかを確認してください。その場合、スレッドを取得する_IS_USED_LOCK
_関数がロックを保持しています。
他のプロセスがこのテーブルを使用できるため、TRUNCATE
がハングする可能性があるため、シェルでの実行を確認します。
mysqladmin proc
次に、それを使用しているクエリを強制終了します(変更123
からプロセスのIDへ):
mysqladmin kill 123
また実行中:
mysql -e "SHOW ENGINE INNODB STATUS\G"
ハングの調査にも役立ちます。