1

あるサーバーから別のサーバーにデータベースのコピーを取得するスクリプトをセットアップしようとしています。

この投稿のおかげで、PostgreSQL データベースを別のサーバーにコピーする方法を見つけました。

しかし、コピー中にデータベースの名前を変更する必要があります。sed を使用して単純なテキスト置換を行うことを考えました。しかし、これによりデータベースが破損する可能性があるのではないかと心配しています。

これを行う適切な方法を知っている人はいますか?

ここで要求されたように、私が使用しているコマンドは次のとおりです

pg_dump -C -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin template1
4

1 に答える 1

5

別のデータベースに復元するだけです。のカスタム形式からのpg_restoreダンプ-Fcの場合:pg_dump

createdb newdbname
pg_restore --dbname newdbname database.dump

オプションを使用して作成されていないSQL 形式のダンプの場合:-Cpg_dump

createdb newdbname
psql -f database_dump.sql newdbname

リモート ホストからダンプをストリーミングしている場合は-f database_dump.sql、ダンプ データが stdin から来ているため省略してください。

新しいDBを作成するためにCREATE DATABASE別のDBに接続する必要があるため、復元と同じコマンドで簡単に行うことはできません。template1したがって、あなたの例では次のようになります。

psql -h localhost -U localadmin template1 -c 'CREATE DATABASE newdb;'
pg_dump -U remoteuser -h remoteServer dbname | psql -h localhost -U localadmin newdb

-Cへのフラグの省略に注意してくださいpg_dump

最初のコマンドは単なる手書きの書き方createdb -h localhost -U localadmin newdbです。


更新:フラグを付けてpg_dump作成されたもので立ち往生している場合は、非常に注意している限り、実際にダンプすることができます。ファイルの先頭には、データベース名を参照する 4 行 (1 行はコメント) のみが必要です。Pg 9.1 でダンプされたデータベース名「regress」の場合:-Csedpg_dump -C

--
-- Name: regress; Type: DATABASE; Schema: -; Owner: craig
--

CREATE DATABASE regress WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8';


ALTER DATABASE regress OWNER TO craig;

\connect regress

これは、3 つ (またはコメントを書き直す場合は 4 つ) の非常に特殊なコマンドを使用して、非常に安全に変換できsedます。ただし、データベース名に対してグローバルな検索と置換を行うだけではありません

sed \
  -e 's/^CREATE DATABASE regress/CREATE DATABASE newdbname/' \
  -e 's/^ALTER DATABASE regress/ALTER DATABASE newdbname/' \
  -e 's/^\\connect regress/\\connect newdbname/' \
  -e 's/^--Name: regress/--Name: newdbname/'

これは最後の手段です。なしでダンプする方がはるかに優れてい-Cます。

于 2012-10-18T00:35:08.857 に答える