2016-07-13 4 views
0

私は列を追加する必要がある約25GBのテーブルを持っています。新しい列を追加するためにALTERを実行するときにtmpテーブルが増加しない

私はスクリプトを実行します。実行すると、データディレクトリにtempテーブルが表示されますが、約480Kのままです。私はprocesslistでALTERが実行中であり、問​​題はないことがわかります。

長時間のアクティビティの後にスクリプトを終了すると、processlistでクエリが "kill"状態のままになり、クエリがLITERALLYで殺されるまでtmpファイルが拡張されます(つまり、 "kill"状態プロセスリストからプロセスリストの消滅まで)。

私は(クエリを殺す前に)次のコマンドを実行します。

select * from global_temporary_tables\G 

それはどちらか追加されているすべての行を表示しません。

他に何かできますか?

+0

InnoDBまたはMyISAM? –

答えて

1

まず、 "ps"出力レポートに表示される内容は何も関係ありません。 "ps"の言うことに頼らないでください。古いデータが含まれています。

プロセスが強制終了された場合(SIGTERMではなくSIGKILL)、出力がどこにも出力されないことを保証します。 SIGTERMedされている場合は、あなたが接続しているシグナルハンドラによって異なります。あなたはシグナルハンドラを登録していないという野生の推測を危険にさらします。

ほとんどの実動DBMSは、チャンクでストレージを設定します。 Xのスペースが得られます。これには、行や列を追加できる「スラック」ルームが含まれている可能性があります(2つのメカニズムが同じであるとは言いません)。あなたが知覚できる方法で何かが成長しなかったからといって、変更が加えられたわけではありません。データ辞書をチェックアウトして、テーブルの現在の構造を調べてみましょう。

変更をコミットしましたか?一部のDBMSでは、DDL操作はコミット可能/ロールバック可能(yecch)イベントとみなされます。

関連する問題