web-dev-qa-db-ja.com

MySQLの「テーブルがいっぱいです」というエラー1114をAmazon RDSで解決する方法

テーブルに新しい列を追加しようとしていますが、クエリによってこのエラー1114が発生します。

RDSインスタンスのサイズが小さい。 1.7 GBのメモリ、1 ECU(1つの仮想コアと1つのECU))変更しようとしているテーブルは500万行でサイズは7GBです。インスタンスのディスクサイズは15GB(40%空き)です。

私たちが行き詰まっている私たちにとってその重要な時間、AWS RDSはmysql構成のすべてのパラメーターへのアクセスを許可していません。この問題を取り除くにはどうすればよいですか?

5
Ruchit Patel

15 GBの40%のみ= 6 GBの空き容量がある場合、ALTER TABLEを使用するかどうかに関係なく、インスタンスに7 GBテーブルの2つのコピーを同時に保持することはできません(通常、 RolandoMySQLDBAが説明したように、テーブルのコピー全体を作成してから既存のテーブルをそのテーブルで置き換えるか、別のテーブルを作成してデータを挿入します。

インスタンスにどちらも実行するのに十分なストレージがないようです。

管理コンソールからインスタンスを選択し、[変更]を選択して、割り当てられたストレージの量を変更し、[OK]をクリックすると、実行中のインスタンスで利用可能なストレージを増やすことができます。見る:

enter image description here

http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_ScalingStorage.html

RDSがこれをバックグラウンドで処理する方法がわからないため、変更中にデータベースが短時間使用できなくなるかどうかはわかりません。

この操作は、インスタンスの変更中に潜在的なパフォーマンス低下について警告しますが、インスタンスは引き続き利用可能でアクセス可能であり、数分以内にインスタンスの可用性を中断することなく操作が完了することがわかります。

6

ここに問題があります:_ALTER TABLE_を実行するときは常に、使用される一時テーブルが存在する必要があります。一時テーブルはデータフォルダーに書き込まれていません。おそらく_/rdsdbdata/tmp_に書き込まれます。このクエリをお願いします

_SHOW VARIABLES LIKE 'tmpdir';
_

これにより、そのフォルダの場所がわかります。繰り返しますが、デフォルトでは_/rdsdbdata/tmp_です。

Mysqldが停止するのはなぜですか? MyISAMのせいにします。 MyISAMを選ぶ理由 MySQL 5.0 Certification Study Guide によると、

enter image description here

bulletpoint#11は、ページ408、409のセクション29.2で次のように述べています。

MyISAMテーブルに行を追加しているときにディスク領域が不足しても、エラーは発生しません。サーバーは、スペースが使用可能になるまで操作を中断し、操作を完了します。

ディスク領域が不足した場合は、mysqlをシャットダウンまたは強制終了しないでください。現在使用されているMyISAMで開いているファイルハンドルの数はクリアされません。したがって、MyISAMテーブルはクラッシュとマークされます。 mysqldを実行したままデータボリュームのディスクスペースを解放できる場合、ディスクスペースが利用可能になると、mysqldは兵士になります。 mysqld自体はクラッシュしなかったことに注意してください。空き領域が実現するまで、アニメーションは一時停止状態になります。

あなたの場合、_ALTER TABLE_を強制終了してください。 MyISAMを使用する一時テーブルは、_/rdsdbdata/tmp_のディスク領域をロックするだけです。 _ALTER TABLE_を強制終了すると、一時テーブルが削除され、mysqldが解放され、通常どおりに継続できます。

私は過去の投稿でこれを説明しました:

あなたは何ができますか?

手動で_ALTER TABLE_を自分で実行する必要がある場合があります。

たとえば、次のテーブルがあるとします。

_CREATE TABLE ruchit_table
(
    id int not null auto_increment,
    field1 INT NOT NULL,
    field2 VARCHAR(20),
    primary key (id)
);
_

ALTER TABLE ADD COLUMN field3 CHAR(5);を実行したい

これをdatadir内で実行する手順は次のとおりです。

_CREATE TABLE ruchit_table_new LIKE ruchit_table;
ALTER TABLE ruchit_table_new ADD COLUMN field3 CHAR(5);
INSERT INTO ruchit_table_new SELECT id,field1,field2 FROM ruchit_table;
ALTER TABLE ruchit_table RENAME ruchit_table_old;
ALTER TABLE ruchit_table_new RENAME ruchit_table;
DROP TABLE ruchit_table_old;
_

ご了承ください

  • 一時テーブルの場所はdatadirにあります
  • _ALTER TABLE_ [.____を実行しました。]
    • 新しい列を空の一時テーブルに追加しました
    • 一時テーブルをロードしました
    • 古いテーブルを取り除く

これらは、mysqldが_ALTER TABLE_を使用して内部的に行うことです。これらの手順は、これを単にエミュレートし、datadirでこのエミュレーションを実行します。

試してみる !!!

5
RolandoMySQLDBA