回答:
テーブルを抽出し、ターゲットデータベースに直接パイプします。
pg_dump -t table_to_copy source_db | psql target_db
注:他のデータベースですでにテーブルが設定されている場合は、-a
フラグを使用してデータのみをインポートする必要があります。そうしないと、「メモリ不足」のような奇妙なエラーが表示される場合があります。
pg_dump -a -t my_table my_db | psql target_db
pg_dump -U remote_user -h remote_server -t table_to_copy source_db | psql target_db
-a
フラグをデータのみに使用する必要があることに注意してください。すなわちpg_dump -a -t my_table my_db | psql target_db
。ここにいる間、データベースがサーバー上にある場合は、データベースをファイルにダンプし、そのファイルをデータベースにscpし、ファイルの内容をpsqlに送信する方が簡単だと思います。たとえばpg_dump -a -t my_table my_db > my_file.sql
、それをサーバーに配置した後->psql my_other_db < my_file.sql
pg_dump -t '"tableToCopy"' source_db | psql target_db
。単一引用符と二重引用符は、テーブル名を囲むことに注意してください
pgAdmin IIのバックアップ機能を使用することもできます。次の手順に従ってください。
うまく機能し、一度に複数のテーブルを実行できます。
Objects
セクションの下で複数のテーブルを選択できます。OSXでは、SQLボタンをクリックするかSQL Editor
、Tools
メニューから取得して、バックアップファイルからコピーしたSQLを貼り付けます。
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);
両方のサーバーに接続できるLinuxホストでのpsqlの使用
( export PGPASSWORD=password1
psql -U user1 -h host1 database1 \
-c "copy (select field1,field2 from table1) to stdout with csv" ) \
|
( export PGPASSWORD=password2
psql -U user2 -h host2 database2 \
-c "copy table2 (field1, field2) from stdin csv" )
PGPASSWORD=password1 psql -U ...
。明示的なサブシェルも必要ありません。通常、最初にセットアップするにはいくつかのことを行う必要があるため、とにかくサブシェルが必要になる場合があります。また、パスワードは後続のプロセスにエクスポートされません。ありがとう!
pg_dump -t '<table_name>' --schema-only
次に、次のようなことを行います。
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
);
INSERT INTO l_tbl (l_col1, l_col2, l_col3) SELECT * FROM dblink('dbname=r_db hostaddr=r_ip password=r_pass user=r_usr', 'select r_col1, r_col2, r_col3 from r_tbl where r_col1 between ''2015-10-29'' AND ''2015-10-30'' ') AS t1(col1 MACADDR, col2 TIMESTAMP, col3 NUMERIC(7,1));
(lはローカルを意味し、rはリモートです。単一引用符をエスケープします
pg_dumpを使用してテーブルデータをダンプし、psqlで復元します。
あなたが両方のリモートサーバーを持っているなら、あなたはこれに従うことができます:
pg_dump -U Username -h DatabaseEndPoint -a -t TableToCopy SourceDatabase | psql -h DatabaseEndPoint -p portNumber -U Username -W TargetDatabase
すでに既存のスキーマがある場合は、前述のソースデータベースのテーブルをターゲットデータベースの同じ名前のテーブルにコピーします。
次のことができます。
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>
ここに私のために働いたものがあります。最初にファイルにダンプします。
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
ローカル設定でデータベース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
export PGPASSWORD=<passw>
コマンドを実行する前に実行できる@max
ここでいくつかの解決策を試しましたが、それらは本当に役に立ちました。私の経験では、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
)
)
この方法の問題は、コピーするフィールドの名前とテーブルのタイプを記述する必要があることです。
pg_dump
常に機能するとは限りません。
両方のデータベースに同じテーブル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"
user5542464および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つのパスワードを同時に要求します。
DbLinkを使用して、1つのテーブルデータを別のデータベースの別のテーブルにコピーする必要があります。データベース間のクエリを実行するには、DbLink拡張機能をインストールして構成する必要があります。
このトピックに関する詳細な投稿はすでに作成しています。 このリンクにアクセスしてください
この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);
両方のDB(from&to)がパスワードで保護されている場合、そのシナリオでは、ターミナルは両方のDBのパスワードを要求しません。パスワードプロンプトは1回だけ表示されます。したがって、これを修正するには、コマンドとともにパスワードを渡します。
PGPASSWORD=<password> pg_dump -h <hostIpAddress> -U <hostDbUserName> -t <hostTable> > <hostDatabase> | PGPASSWORD=<pwd> psql -h <toHostIpAddress> -d <toDatabase> -U <toDbUser>
DataGrip(Intellij Idea)を使用していました。あるテーブルから(別のデータベースにある)別のテーブルにデータをコピーするのは非常に簡単でした。
まず、データグリップで両方のデータソースに接続していることを確認します。
ソーステーブルを選択し、F5キーを押すか、または(右クリック-> [テーブルのコピー先を選択]をクリックします。)
これにより、すべてのテーブルのリストが表示されます(ポップアップウィンドウでテーブル名を使用して検索することもできます)。ターゲットを選択してOKを押してください。
DataGripは他のすべてを処理します。
別の方法として、外部データラッパー拡張を使用して、リモートテーブルをローカルテーブルとして公開することもできます。その後、リモートデータベースのテーブルから選択して、テーブルに挿入できます。唯一の欠点は、あまり速くないことです。