Open5

Render.com の Postgresql DB を CockroachDB へ移管する

philomagiphilomagi

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

脚注
  1. CockroachDB公式のガイドで、先にスキーマをマイグレーションしておくことが推奨されている。 We strongly recommend migrating your database schema to a new CockroachDB database before migrating the data. ↩︎

  2. キャプチャでは雑に 0.0.0.0/0 で済ませたが、マシンのIPアドレスを設定することもできる。 ↩︎

philomagiphilomagi

スキーマdumpをCockroachDBのSchema Conversion Toolへ入力(ドラッグ&ドロップ可)。

完了すれば良し、ダメならエラーを順次潰す

philomagiphilomagi

エラー: cannot modify schema "public" (SQLSTATE 3f000)

(publicスキーマを使っている場合のみ)
以下のstatementで発生。

ALTER SCHEMA public OWNER TO "<DB User>";

publicスキーマはデフォルトで用意されている。
https://www.cockroachlabs.com/docs/stable/schema-design-overview.html#schemas

All CockroachDB clusters include a preloaded schema named public

原因

publicスキーマに対する変更は禁止になっている模様
https://github.com/cockroachdb/cockroach/blob/b21379bb56dd206e6f63cc7d07ca72e85db7a4c4/pkg/sql/alter_schema.go#L63-L66

対応

Delete statement で対応

philomagiphilomagi

"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 が予約語となってしまっている。

上記の理由から、indexカラムを定義しようとしているつもりで CockroachDBにはインデックスを定義しようとしているとみなされ、文法エラーと評価されてしまっている。

対策

上記issueでも言及されている通り、引用符でカラムを囲えば回避可能。

CREATE TABLE hoge (
	id integer NOT NULL,
        -- 省略
	"index" integer NOT NULL
)

https://www.cockroachlabs.com/docs/v19.1/keywords-and-identifiers.html#rules-for-identifiers

To bypass either of these rules, simply surround the identifier with double-quotes (").

脚注
  1. https://www.cockroachlabs.com/docs/stable/sql-grammar.html#index_def ↩︎