PostgreSQL のデータベースをコピーする方法メモ♪

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 内でデータベースのコピーをできるように努めさせていただきました。

一歩一歩、勉強していきたいと思います。

以上です。

ディスカッションに参加

1件のコメント

コメントを残す

コメントを残す