PostgreSQL データベースをコピー
-- データベースをコピー。db1(user1、password1) から db2(user2、password2)に。 pg_dump -U postgres -W db1 | psql -U postgres -W db2
- psql のプロンプトや postgres ユーザでのコマンドではなく、シェルで実行する。
- コピー先のデータベースは予め作っておくこと。
- PostgreSQL のユーザは postgres を使用する。
- パイプ(|)前後の2回分、パスワードの入力が求められる。
指定するユーザについてポイント
pg_dump -U user1 -W db1 | psql -U user2 -W db2
とすると
- ERROR: ロール”user1″のメンバでなければなりません
- WARNING: “public”の権限を取り上げられませんでした
といったメッセージが出ましたため、スーパーユーザで実行することでエラーを回避しています。
なお、実はこのコマンドでもコピーはできましたの。ですけれども、エラーが出ておりますのでやめておいたほうがよいと考えています。
また、パスワードの入力順番ですが、 user2 → user1 の順番でした。user2 のパスワードを入力し、enter した後、なにもメッセージが表示されませんでしたが、気にせず user1 のパスワードを入力し enter しましたら先に進むことができました。
といいましても、先ほどのようにエラーとなったのですけれどもね><。
実際にやってみました♪
次のような PostgreSQL を作りました。postdb から postdb2 へコピーいたします。
- ユーザ:postuser、パスワード:postpass、データベース:postdb
テーブル:testtable がある。 - ユーザ:postuser2、パスワード:postpass2、データベース:postdb2
それぞれのデータベース所有ユーザを指定して、エクスポート、インポートしようとしましたが、うまくいきません。
[root@localhost ~]# pg_dump -U postuser postdb | psql -U postuser2 postdb2 ユーザ postuser2 のパスワード: パスワード:
まずここで迷いました。どのような手順でパスワードを入力すればよいのでしょうか?
「postuser2 のパスワードを入力し、enter → postuser のパスワードを入力し、enter」でしょうか?
[root@localhost ~]# pg_dump -U postuser postdb | psql -U postuser2 postdb2 パスワード: ユーザ postuser2 のパスワード: pg_dump: [アーカイバ(db)] データベース"postdb"への接続が失敗しました: FATAL: ユーザ"postuser"のパスワード認証に失敗しました
ダメですね><。。。
では順番を入れ替えて、「postuser のパスワードを入力し、enter → postuser2 のパスワードを入力し、enter」でしょうか?
なお、postuser のパスワードは、2行目に入力し、postuser2 のパスワードは3行目で入力しております。2行目ではパスワードを入力しても表示されませんけれども、3行目では表示されますことに注意です!
[root@localhost ~]# pg_dump -U postuser postdb | psql -U postuser2 postdb2 パスワード: ユーザ postuser2 のパスワード: postpass2 SET SET SET SET SET CREATE EXTENSION ERROR: 拡張機能 plpgsql の所有者でなければなりません SET SET SET CREATE TABLE ERROR: ロール"postuser"のメンバでなければなりません ALTER TABLE WARNING: "public"の権限を剥奪できなかった可能性があります REVOKE WARNING: "public"の権限を剥奪できなかった可能性があります REVOKE WARNING: "public"には権限が付与されませんでした GRANT WARNING: "public"には権限が付与されませんでした GRANT [root@localhost ~]#
2つのユーザの認証が通りました♪ここは OK です!
- コマンドの左から右へ、パスワードも指定していく。区切りは enter
ですけれども、ダメですの><。
MySQL の時と同じように、作成したユーザには、紐付けたデータベース以外への権限を与えないようにしておりますけれども、その設定を引きずったままコピー先のデータベースへとインポートしようとするようです。
ですので、ロールや、権限関係のエラーが表示されております。
ところが!インポート先の postdb2 へとインポートできております!
postdb=# \c postdb2 データベース "postdb2" にユーザ"postgres"として接続しました。 postdb2=# \z アクセス権 スキーマ | 名前 | 型 | アクセス権 | 列のアクセス権限 ----------+-----------+----------+------------+------------------ public | testtable | テーブル | | (1 行) postdb2=# select * from testtable; id | username | title | post | status | created | modified ----+----------+-----------+---------+--------+----------------------------+------------------- --------- 1 | ユーザ1 | タイトル1 | ポスト1 | t | 2013-08-31 13:04:46.598495 | 2013-08-31 13:04:4 6.598495 (1 行) postdb2=#
ナンデ!?ERROR となりましたので、それ以降の処理は無視されたかと予想しておりましたけれども、違いました。
一歩一歩振り返って確認、大事ですね。
おわりに
本当は、別のサーバの PostgreSQL にデータベースをコピーしたいのです。ですけれども、よくわかりませんのでまずは同じサーバの PostgreSQL 内でデータベースのコピーをできるように努めさせていただきました。
一歩一歩、勉強していきたいと思います。
以上です。
「PostgreSQL のデータベースをコピーする方法メモ♪」への1件の返信
[…] PostgreSQL のデータベースをコピーする方法メモ♪ | oki2a24 […]