Rubyと筋肉とギターとわたし

エンジニア二年目の雑魚です。プログラミング・ギター・筋トレのことをメインにブログを書いていきます。

【PostgreSQL】CloudSQLからエクスポートしたダンプデータをインポートする

f:id:rdwbocungelt5:20181112160913p:plain

どうもてぃ。

最近エンジニア用のアカウントを作成しました。

写真チャラいです。

twitter.com

それはさておき、本番環境と同じデータをローカルに反映させたかったので、DBサーバーのCloudSQLからダンプデータを落としてローカルにインポートしました。

その時の流れを書きたいと思います。

プロジェクトはRailsです。

CloudSQLからCloudStorageへ

使用しているDBデータをCloudStorageへ落とします。

ここに手順を書いてもいいですが、googleのドキュメントのわかりやすさには勝てそうにないのでそちらを参考にしてください。

以下参考。

cloud.google.com

ローカルへインポート

CloudStorageから上記手順で落としたダンプデータをダウンロードします。

その後、psqlコマンドでDB名を指定してインポートします。

この際、先にDBを作って準備しておく必要があります。要注意。

$ bundle exec rails db:create

$ psql DB名 < ~/Downloads/Cloud_SQL_Export_2019~~~~~~~~~

ダウンロードしたダンプデータの保存先は基本Downloadsになっているはず。

違う場合はダウンロードしたパスを指定して上げてください。

ダンプデータのファイル名は上のように、 Cloud_SQL_Export_日付 になっているかと思うので、正しく指定してあげてください。

PG::ConnectionBad - fe_sendauth: no password supplied

準備が整ったと思ったので、サーバーを起動して画面確認したところ上記エラー。

単に database.yml でパスワード設定してないだけでした。

おろかなり。

PG::InsufficientPrivilege - ERROR: permission denied for relation schema_migrations

パスワードを設定して、サーバー起動後画面を表示するとこのエラー。

使用しているユーザーがDBスキーマに対して権限を持ってないとのこと。

以下で解決。

postgres=> \c <database_name>  # 権限を付与するDB名

database_name=> grant all on all tables in schema public to <user_name>  # user_nameは付与するユーザー名

\z で確認するとちゃんと付与されてるっぽかった。

マイグレーションを実行

$ bundle exec rails db:migrate
・
・
・

StandardError: An error has occurred, this and all later migrations canceled:

PG::InsufficientPrivilege: ERROR:  must be owner of relation <table_name>

まだ解決できない。。。

もっかい権限が付与されてるか確認してみると…特定のテーブルだけ権限が変更できてて、他は全く変更できてなかった。

\z じゃなくて、\d の方が見やすかった。だまされた。

なのでテーブルごとに権限を変更した。

postgres=> \c <database_name> 

# user_nameは付与するユーザー、old_user_nameは現在付与されているユーザー
database_name=> select 'alter table ' || schemaname || '.' || tablename || ' owner to <user_name>;'
from pg_tables
where tableowner = '<old_user_name>';

# 上で出てきたものをコピーして貼り付け実行する

すべてuser_nameをownerへ変更できた。

解決

マイグレーションがやっと通りました。

CloudSQLから落としたデータをインポートするとこんなにハマるとは思ってなかった。

今後同じようなことが出てくると思うので備忘録として、また同じような作業をする人へ向けて書きました。

なにかわからないことがあればコメントよろしくお願いします。