3

リモート PostgreSQL サーバーからローカル サーバーにコピーする必要があります。ETL ツールは使用できません。Perl と DBI を使用して行う必要があります。このデータは大きくなるので、「ソースから選択」と「ローカルに挿入」は使いたくありません。COPY を使用してファイルを作成しようとしていましたが、このファイルはリモート サーバー上に作成されます。私もそれはできません。代わりに \COPY を使用したい。

DBI を使用して "\copy from remote table" コマンドを実行し、Perl で DBI を使用してローカル ファイルを作成するにはどうすればよいですか?

4

5 に答える 5

2

「copy from」および「copy to」コマンドを使用して、データベースにデータを効率的に出し入れする必要があります。これらは、データの行を反復処理するよりも桁違いに高速です。また、ターゲット テーブルにデータをコピーしている間はインデックスをオフにし、コピーが完了したらインデックスを有効にして (そして構築させたい) ということもよくあります。

単純に 2 つのデータベースのリスナー ポートに接続していると仮定すると、ソース データベースへの接続を開き、テーブルをファイルにコピーし、宛先データベースへの接続を開き、ファイルをターゲット テーブルにコピーして戻します。

于 2009-03-06T21:10:18.560 に答える
0

うーん。 \copy to ...psqlディレクティブであり、SQLではないため、DBIまたは相手側のPostgreSQLサーバーには理解されません。

PostgreSQLのSQLCOPYコマンドにはFROM STDINオプションTO STDOUTがあることがわかりますが、DBIに結果データへのアクセスに必要な「生の読み取り」を実行する方法があるとは思えません。(私は、内部的TO STDOUTにどのように実装するかを確信しています。)psql\copy to ...

したがって、あなたの場合、たとえばsambaまたはnfsを使用して、ソースボックスのフォルダーをターゲットボックスにマウントし直し、プレーンオールドを使用しますCOPY TO '/full/path/to/mounted/folder/data.txt' ...

于 2009-03-08T06:17:11.390 に答える
0

\ copy(select * from remote_table)to'/local/file.txt' ...次に、\ copy local_tablefrom'/local/file.txt'を使用してファイルをローカルデータベースにロードします。psqlスクリプトから\copyコマンドを実行しました。

これが私のスクリプトです

export PGUSER = remoteuser export PGPASSWORD = remoteepwd

/opt/PostgreSQL/8.3/bin/psql -h xx.xx.xx -p 5432 -d remotedb -c "\ COPY(select * from remote_table where date(reccreationtim e)= date((current_date --interval '4 day' )))TO'/local/copied_from_remote.txt' D ELIMITER'|' "

export PGUSER = localuser export PGPASSWORD = localpwd

/opt/PostgreSQL/8.3/bin/psql -h xx.xx.xx.xx -p 5432 -d localdb -c "\ COPY local_table FROM'/local/copied_from_remote.txt' DELIMITER'|'"

于 2009-03-12T21:24:34.253 に答える