0

同じ PostgreSQL 9.3 サーバー (Windows 上で実行) で 2 つのデータベースを実行しています。2 つのデータベースの構造はまったく同じです。同じテーブル、同じキー、同じ制約などです。唯一の違いは、データが定期的に一方から他方に移動されることです。顧客と注文に関する情報を含むデータベースのようなものだと考えてください。たとえば、2 年以上前の顧客に関連するデータが毎週移動されます。

新しいデータベースと古いデータベースのデータを組み合わせたテーブルを簡単に作成する方法はありますか? 何かのようなもの:

select * from NewDatabase.MyTable
UNION
select * from OldDatabase.MyTable

データベースの 170 のテーブルのうち約 25 で実行されます。

私が見る2つの重要な問題は次のとおりです。

1) PostgreSQL は実際にはクロス データベース クエリを許可していません。外部データ ラッパーまたは db リンク (ここで述べたように: Postgres でクロスデータベース クエリを実行できますか? ) は、アクセスするテーブルの構造全体を事前に宣言する必要があるため、使用するのが非常に面倒です。

2) これを自動化する方法を見つけて、必要な 25 個のテーブルごとに自動的にコーディングできるようにする必要があります。これは毎週実行されます。

効率的に自動化できる限り、これがどのように行われるか (Pentaho-Kettle、コマンド スクリプト、SQL スクリプトなど) には何の好みもありません。

ありがとう!

4

1 に答える 1

0

私は道を見つけたかもしれないと信じています。もちろん、提案やコメントは大歓迎です。私の考えは、ここで提案されたものと似ています:別のスキーマでデータベースを復元したい(ただし、最も投票数の多い回答ではありません)。

public スキーマのテーブルのみに関心があるため、次のことを行いました。

database1 のパブリック スキーマのバックアップ

"C:\Program Files\PostgreSQL\9.3\bin\pg_dump.exe" --host MYSQLHOST --port 5432 --username "JohnDoe"  --format custom --section pre-data --section data --section post-data --verbose -n "public" --file "\\mypath\db1.backup" "db1"

db2 のパブリック スキーマの名前を変更し、新しい空のパブリック スキーマを作成しました。

ALTER SCHEMA public RENAME TO public_db2 ;
CREATE SCHEMA public ;

db1 のパブリック スキーマのバックアップを、db2 で新しく作成された (そして空の) パブリック スキーマに復元します。

"C:\Program Files\PostgreSQL\9.3\bin\pg_restore.exe" --host MYSQLHOST --port 5432 --username "JohnDoe" --dbname "db2"   --section pre-data --section data --section post-data --schema public --verbose "\\mypath\db1.backup"

db2 に新しくインポートされたパブリック スキーマの名前を変更しました。

ALTER SCHEMA public RENAME TO public_db1 ;

上記の私の構文は、バイナリ (および自動的に圧縮) バックアップ ファイルを作成します。テキスト形式のバックアップ ファイルがある場合、1 つのスキーマだけを復元することはできません。(まだ) 自動化できていない唯一の部分は、シェル コマンドでパスワードの入力を求められることです。

私は Windows を使用していますが、構文は他のシステムでも同じでなければならないことを理解しています。

于 2014-11-17T19:14:59.907 に答える