web-dev-qa-db-ja.com

PostgreSQLを使用したデータベース間のデータ転送

別のデータベースからいくつかのデータを転送する必要があります。古いデータベースはPaw1.movi​​esDBと呼ばれ、新しいデータベースはPaw1です。各テーブルのスキーマは次のとおりです。

Awards (name of the table)(new DB)
Id [PK] Serial           Award

Nominations (name of the table) (old DB)
Id [PK] Serial           nominations

古いデータベースから新しいデータベースにデータをコピーするにはどうすればよいですか?

47
Nicopuri

私はちょうどこの正確なことをしなければならなかったので、私はここにレシピを投稿すると思いました。これは、両方のデータベースが同じサーバー上にあることを前提としています。

最初に、古いデータベースから新しいデータベースにテーブルをコピーします(明らかにデータベース間でデータを移動できないため)。コマンドラインで:

pg_dump -U postgres -t <old_table> <old_database> | psql -U postgres -d <new_database>

# Just adding extra space here so scrollbar doesn't hide the command

次に、コピーしたテーブルのアクセス許可を新しいデータベースのユーザーに付与します。 psqlにログインします。

psql -U postgres -d <new_database>

ALTER TABLE <old_table> OWNER TO <new_user>;

\q

最後に、古いテーブルから新しいテーブルにデータをコピーします。新しいユーザーとしてログインしてから:

INSERT INTO <new_table> (field1, field2, field3) 
SELECT field1, field2, field3 from <old_table>;

できた!

70
Nate

データベースはPostgreSQLで分離されています。 1つのデータベースのみに接続するPostgreSQLサーバーに接続する場合、SQLクエリを使用して、あるデータベースから別のデータベースにデータをコピーすることはできません。

MySQLから来た場合:MySQLが(大まかに)「databases」と呼ぶものは「schemas "PostgreSQLでは-名前空間の種類。 PostgreSQLデータベースには多くのスキーマがあり、各スキ​​ーマにはテーブルとビューがあり、schema.table構文を使用して、あるスキーマから別のスキーマにコピーできます。

本当に2つの異なるPostgreSQLデータベースがある場合、一方から他方にデータを転送する一般的な方法は、テーブルを( pg_dump -t で)ファイルにエクスポートすることです。それらを他のデータベースにインポートします(psqlを使用)。

別個のPostgreSQLデータベースからデータを本当に取得する必要がある場合、Grant Johnsonの回答で言及されている別のオプションは dblink です。これは追加モジュール(contrib/) 。

33
leonbloy

これは、ローカルホストからHerokuのpostgresqlにテーブルをリモートでコピーするのに役立ちました。

pg_dump -C -t source_table -h localhost source_db | psql -h destination_Host -U destination_user -p destination_port destination_db

これにより、テーブルが作成されます。

他の方向(Herokuからローカルへ)pg_dump -C -t source_table -h source_Host -U source_user -p source_port source_db | psql -h localhost destination_db

20
crizCraig

From:hxxp://dbaspot.c om/postgresql/348627-pg_dump-t-give-where-condition.html(注:リンクは現在壊れています

# create temp table with the data
psql mydb
CREATE TABLE temp1 (LIKE mytable);
INSERT INTO temp1 SELECT * FROM mytable WHERE myconditions;
\q

# export the data to a sql file
pg_dump --data-only --column-inserts -t temp1 mtdb > out.sql
psql mydb
DROP TABLE temp1;
\q

# import temp1 rows in another database
cat out.sql | psql -d [other_db]
psql other_db
INSERT INTO mytable (SELECT * FROM temp1);
DROP TABLE temp1;

リモートで役立つ別の方法

  # export a table csv and import in another database
  psql-remote> COPY elements TO '/tmp/elements.csv' DELIMITER ',' CSV HEADER;
  $ scp Host.com:/tmp/elements.csv /tmp/elements.csv
  psql-local> COPY elements FROM '/tmp/elements.csv' DELIMITER ',' CSV;
11
Thiago Macedo

これが1回限りの場合、コピーには3つのオプションがあります。

  1. Db_linkを使用します(まだ寄与していると思います)。
  2. アプリケーションに作業を行わせます。
  3. 輸出入

これが継続的なニーズである場合、答えは次のとおりです。

  1. 同じDB内のスキーマへの変更
  2. db_link
8
Grant Johnson

実際、あるPostgreSQLデータベースから別のデータベースにテーブルデータを送信する可能性があります。私は、手続き言語plperlu(安全でないPerl手続き言語)を使用します。

説明(すべてLinuxサーバーで行われました):

  1. データベースAにplperlu言語を作成します

  2. その後、PostgreSQLは、データベースAのpostgresql.confの最後にある一連の次のコマンドを使用して、いくつかのPerlモジュールに参加できます。

    plperl.on_init='use DBI;'
    plperl.on_init='use DBD::Pg;'
    
  3. 次のようにAで関数を作成します。

    CREATE OR REPLACE FUNCTION send_data( VARCHAR )
    RETURNS character varying AS
    $BODY$
    my $command = $_[0] || die 'No SQL command!';
    my $connection_string =
    "dbi:Pg:dbname=your_dbase;Host=192.168.1.2;port=5432;";
    $dbh = DBI->connect($connection_string,'user','pass',
    {AutoCommit=>0,RaiseError=>1,PrintError=>1,pg_enable_utf8=>1,}
    );
    my $sql = $dbh-> prepare( $command );
    eval { $sql-> execute() };
    my $error = $dbh-> state;
    $sql-> finish;
    if ( $error ) { $dbh-> rollback() } else {  $dbh-> commit() }
    $dbh-> disconnect();
    $BODY$
    LANGUAGE plperlu VOLATILE;
    

そして、データベースA内の関数を呼び出すことができます。

SELECT send_data( 'INSERT INTO jm (jm) VALUES (''zzzzzz'')' );

また、値「zzzzzz」がデータベースBのテーブル「jm」に追加されます。

0
francisco

SQL Serverのようなデータベース間クエリを実行することはできません。 PostgreSQLはこれをサポートしていません。

PostgreSQLのDbLink拡張機能は、あるデータベースを別のデータベースに接続するために使用されます。クロスデータベースクエリを実行するようにDbLinkをインストールして構成しました。

PostgreSQLでクロスデータベースクエリを実行するためのステップバイステップスクリプトと例を既に作成しました。この投稿をご覧ください:PostgreSQL [ビデオ]:DbLink拡張機能を使用したデータベース間クエリ

0
Anvesh

Leonbloyが提案したように、データベースで2つのスキーマを使用する方法があります。 ソーススキーマ(古いDB)とターゲットスキーマ(新しいDB)の場合、次のようなものを試すことができます(列名、タイプなどを考慮する必要があります):

INSERT INTO target.Awards SELECT * FROM source.Nominations;
0