web-dev-qa-db-ja.com

Postgresのデータベース間でテーブルをコピーする

私はPostgresのあるデータベースから別のデータベースへテーブル全体をコピーしようとしています。助言がありますか?

222
nix

テーブルを抽出し、それをターゲットデータベースに直接パイプ処理します。

pg_dump -t table_to_copy source_db | psql target_db
249
thomax

PgAdmin IIのバックアップ機能を使用することもできます。次の手順に従ってください。

  • PgAdminで、移動したいテーブルを右クリックし、 "Backup"を選択します
  • 出力ファイルのディレクトリを選び、Formatを "plain"に設定します。
  • [ダンプオプション#1]タブをクリックし、[データのみ]または[スキーマのみ]をオンにします(操作内容によって異なります)。
  • [クエリ]セクションで、[列挿入の使用]と[ユーザー挿入コマンド]をクリックします。
  • 「バックアップ」ボタンをクリックしてください。これは.backupファイルに出力されます。
  • メモ帳を使用してこの新しいファイルを開きます。テーブル/データに必要な挿入スクリプトが表示されます。これらをコピーしてpgAdminの新しいデータベースSQLページに貼り付けます。 pgScriptとして実行 - クエリ - > pgScript F6として実行

うまく機能し、一度に複数のテーブルを作成できます。

84
a2ron44

dblink を使用すると便利です。

truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);
65
tinychen

Psqlを使用して、両方のサーバーに接続できるLinuxホスト上で

( PGPASSWORD=password1 
  psql -U user1 -h Host1 database1 \
  -c "copy (select field1,field2 from table1) to stdout with csv" ) \
| 
( PGPASSWORD=password2 
  psql -U user2 -h Host2 database2 \ 
   -c "copy table2 (field1, field2) from stdin csv" )
24
Alexey Sviridov

最初 dblinkをインストールしてください

その後、次のようにします。

INSERT INTO t2 select * from 
dblink('Host=1.2.3.4
 user=*****
 password=******
 dbname=D1', 'select * t1') tt(
       id int,
  col_1 character varying,
  col_2 character varying,
  col_3 int,
  col_4 varchar 
);
18
user3946530

Pg_dumpを使ってテーブルデータをダンプしてから、psqlでそれを復元します。

13

両方のリモートサーバーがある場合は、これに従うことができます。

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

すでに既存のスキーマがある場合は、上記のソースデータベースのテーブルをターゲットデータベースの同じ名前のテーブルにコピーします。

11

これは私のために働いたものです。最初にファイルにダンプします。

pg_dump -h localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump

次にダンプしたファイルをロードします。

psql -U myuser -d second_db</tmp/table_dump
8
max

次のことができます。

pg_dump -h <Host ip address> -U <Host db user name> -t <Host table> > <Host database> | psql -h localhost -d <local database> -U <local db user>

8

ローカルセットアップでデータベースAからデータベースBにテーブルを移動するには、次のコマンドを使用します。

pg_dump -h localhost -U owner-name -p 5432 -C -t table-name database1 | psql -U owner-name -h localhost -p 5432 database2
5
user5542464

私はここで解決策のいくつかを試してみました、そしてそれらは本当に役に立ちました。私の経験では最善の解決策はpsqlコマンドラインを使用することですが、時々私はpsqlコマンドラインを使用したい気がしません。だからここにpgAdminIIIのための別の解決策があります

create table table1 as(
 select t1.* 
 from dblink(
   'dbname=dbSource user=user1 password=passwordUser1',
   'select * from table1'  
  ) as t1(
    fieldName1 as bigserial,
    fieldName2 as text,
    fieldName3 as double precision 
  )
 )

この方法の問題点は、コピーするテーブルのフィールド名とそのタイプを記述する必要があることです。

4
Eloy A

pg_dumpは常に機能するわけではありません。

両方のDBに同じテーブルDDLがあると仮定すると、次のようにstdoutとstdinからそれをハッキングできます。

 # grab the list of cols straight from bash

 psql -d "$src_db" -t -c \
 "SELECT column_name 
 FROM information_schema.columns 
 WHERE 1=1 
 AND table_name='"$table_to_copy"'"
 # ^^^ filter autogenerated cols if needed     

 psql -d "$src_db" -c  \
 "copy ( SELECT col_1 , col2 FROM table_to_copy) TO STDOUT" |\
 psql -d "$tgt_db" -c "\copy table_to_copy (col_1 , col2) FROM STDIN"
4
Yordan Georgiev

ser5542464 および Piyush S. Wanare による回答と同じですが、2つのステップに分けます。

pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase > dump
cat dump | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase

それ以外の場合、パイプは2つのパスワードを同時に要求します。

3
Adobe

これをチェックしてください Pythonスクリプト

python db_copy_table.py "Host=192.168.1.1 port=5432 user=admin password=admin dbname=mydb" "Host=localhost port=5432 user=admin password=admin dbname=mydb" alarmrules -w "WHERE id=19" -v
Source number of rows = 2
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister1',true,false);
INSERT INTO alarmrules (id,login,notifybyemail,notifybysms) VALUES (19,'mister2',true,false);
2
themadmax

あるテーブルデータを別のデータベースの別のテーブルにコピーするには、DbLinkを使用する必要があります。クロスデータベースクエリを実行するには、DbLink拡張機能をインストールして設定する必要があります。

このトピックに関する詳細な投稿をすでに作成しました。 このリンクをご覧ください

2
Anvesh

両方のDB(fromとto)がパスワードで保護されている場合、そのシナリオではterminalは両方のDBのパスワードを要求しません、パスワードプロンプトは一度だけ表示されます。そのため、これを修正するには、コマンドとともにパスワードを渡します。

PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
1
Dante

別の方法として、外部データラッパー拡張を使用して、リモートテーブルをローカルテーブルとして公開することもできます。その後、リモートデータベースのテーブルから選択してテーブルに挿入できます。唯一の欠点は、それがあまり速くないということです。

0
ThatDataGuy

WindowsからpgAdmin(Backup:pg_dump、Restore:pg_restore)を実行すると、デフォルトでc:\Windows\System32にファイルを出力しようとします。そのため、ユーザーpostgresが十分に昇格されていないため、Permission/Access deniedエラーが発生します。 管理者としてpgAdminを実行またはWindowsのシステムフォルダ以外の出力の場所を選択してください。

0
Imre