###環境
AWS RDS Aurora 5.7.12
###実行
mysql> CREATE TABLE `hoge` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `parent_id` int(10) unsigned NOT NULL,
-> `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
-> `modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> PRIMARY KEY (`id`),
-> ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
-> /*!50100 PARTITION BY HASH (parent_id)
-> PARTITIONS 1024 */;
ERROR 1030 (HY000): Got error 168 from storage engine
エラー的にはストレージの空きがないみたいに見える。
色々調べても、ファイル容量を空けろみたいな記事が多いけど、RDSってそういうのどうしたらいいんだ?
###検証
####Partitionなしで実行
結果:OK
普通のテーブルができました。
でもPartitionを使いたいんだな…。
####DBをコピーして作成して実行
結果:NG
同じエラーが返ってくる。
####テーブル名を変更して実行
結果:OK
mysql> CREATE TABLE `fuga` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> `parent_id` int(10) unsigned NOT NULL,
-> `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
-> `modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
-> PRIMARY KEY (`id`),
-> ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
-> /*!50100 PARTITION BY HASH (parent_id)
-> PARTITIONS 1024 */;
Query OK, 0 rows affected (14.62 sec)
何もわからん…
####対応
データベース自体が壊れていると判断。
仮のデータベースを作成し、そこに現状のデータを退避し、既存データベースをドロップして対応しました
/*退避用DBを作成*/
CREATE DATABASE temp;
/*現状のデータを退避*/
CREATE TABLE temp_db.users LIKE now_db.users;
...
INSERT INTO temp_db.users SELECT * FROM now_db.users;
...
/*壊れたDBを削除*/
DROP DATABASE now_db;
/*新しくDBを作成*/
CREATE DATABASE now_db;
RENAME TABLE temp_db.users TO now_db.users;
...
/*一時退避したDBを削除*/
DROP DATABASE temp_db;
参考:
https://qiita.com/kako351/items/bad052c55cfe6d85903d
https://qiita.com/whisper0077/items/06add22b692a25bd19b5
テーブル名にこだわりがないのであれば、テーブル名を変えただけが早そうです…。
今回はdevelop環境だったのでこういう対応で済ませましたが、productionではやりたくないですね…
なにかもっといい解決法があったら教えてほしいです。