MySQLのPartition使った時に出たエラーの対応メモ


環境

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ではやりたくないですね…

なにかもっといい解決法があったら教えてほしいです。