Render.com の Postgresql DB を CockroachDB へ移管する
https://render.com/ → https://www.cockroachlabs.com/
マイグレーションガイド
render.com の DBに対して pg_dump
を実行。
スキーマだけをdumpしたバージョンと、全体をdumpしたバージョンを作っておく[1]。
コマンド実行前に、事前にIPアドレス許可の設定をしておかないと外部用のURLが発行されない[2]。
コマンド実行後は、IPアドレス許可設定は削除して良い。
pg_dump -s -d <External Database URL> render_scheme.dump
pg_dump -d <External Database URL> render.dump
-
CockroachDB公式のガイドで、先にスキーマをマイグレーションしておくことが推奨されている。
We strongly recommend migrating your database schema to a new CockroachDB database before migrating the data.
↩︎ -
キャプチャでは雑に
0.0.0.0/0
で済ませたが、マシンのIPアドレスを設定することもできる。 ↩︎
スキーマdumpをCockroachDBのSchema Conversion Toolへ入力(ドラッグ&ドロップ可)。
完了すれば良し、ダメならエラーを順次潰す
cannot modify schema "public" (SQLSTATE 3f000)
エラー: (publicスキーマを使っている場合のみ)
以下のstatementで発生。
ALTER SCHEMA public OWNER TO "<DB User>";
publicスキーマはデフォルトで用意されている。
All CockroachDB clusters include a preloaded schema named public
原因
publicスキーマに対する変更は禁止になっている模様
対応
Delete statement
で対応
"index" という名前のカラムを引用符無しで設定しようとすると文法エラーになる
以下のstatementで発生
CREATE TABLE hoge (
id integer NOT NULL,
-- 省略
index integer NOT NULL
)
メッセージは at or near "not": syntax error
。
原因
CockroachDB は postgresql と異なり、 create table
の中で同時にインデックスを設定可能な構文を提供している[1]。そのため、CockroachDBの create table
では index
が予約語となってしまっている。
- sql: "index" as column name differs from postgres #26993
- Document that "index" can not be used unquoted as a column name #4817
上記の理由から、indexカラムを定義しようとしているつもりで CockroachDBにはインデックスを定義しようとしているとみなされ、文法エラーと評価されてしまっている。
対策
上記issueでも言及されている通り、引用符でカラムを囲えば回避可能。
CREATE TABLE hoge (
id integer NOT NULL,
-- 省略
"index" integer NOT NULL
)
To bypass either of these rules, simply surround the identifier with double-quotes (").