私はPostgresのあるデータベースから別のデータベースへテーブル全体をコピーしようとしています。助言がありますか?
テーブルを抽出し、それをターゲットデータベースに直接パイプ処理します。
pg_dump -t table_to_copy source_db | psql target_db
PgAdmin IIのバックアップ機能を使用することもできます。次の手順に従ってください。
うまく機能し、一度に複数のテーブルを作成できます。
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);
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" )
その後、次のようにします。
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
);
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 localhost -U myuser -C -t my_table -d first_db>/tmp/table_dump
次にダンプしたファイルをロードします。
psql -U myuser -d second_db</tmp/table_dump
次のことができます。
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>
ローカルセットアップでデータベース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
私はここで解決策のいくつかを試してみました、そしてそれらは本当に役に立ちました。私の経験では最善の解決策は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
は常に機能するわけではありません。
両方の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"
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つのパスワードを同時に要求します。
これをチェックしてください 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);
あるテーブルデータを別のデータベースの別のテーブルにコピーするには、DbLinkを使用する必要があります。クロスデータベースクエリを実行するには、DbLink拡張機能をインストールして設定する必要があります。
このトピックに関する詳細な投稿をすでに作成しました。 このリンクをご覧ください
両方の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>
別の方法として、外部データラッパー拡張を使用して、リモートテーブルをローカルテーブルとして公開することもできます。その後、リモートデータベースのテーブルから選択してテーブルに挿入できます。唯一の欠点は、それがあまり速くないということです。
WindowsからpgAdmin(Backup:pg_dump
、Restore:pg_restore
)を実行すると、デフォルトでc:\Windows\System32
にファイルを出力しようとします。そのため、ユーザーpostgresが十分に昇格されていないため、Permission/Access deniedエラーが発生します。 管理者としてpgAdminを実行またはWindowsのシステムフォルダ以外の出力の場所を選択してください。