2010-12-03 16 views
0

実際には簡単な質問ですが、私は決定的な回答は見つかりませんでした。シームレスにpostgresデータベースを更新します - スキーマ、名前の変更、方法

本番データベースfoo_prdと、古いものを置き換えると思われる同じサーバー上の同じfoo_newの新しいバージョンを想定します。 _prdから_newにシームレスに切り替える最もクリーンな方法は何ですか?

データベースの名前を変更すると、現在のユーザーをpidで切断する必要があります。これはいくつかの要求を取りやめ、プロセス中に新しいユーザーが接続する可能性があります。私は新しいデータベースのテーブルを異なるSCHEMAとして作成し、次にsearch_pathを変更することを考えていました。 "$user",prdから"$user",new,prdまでです。

何かが間違っている可能性がありますか?より良い提案はありますか?間違ったアプローチを取っていますか?

+0

名前の変更で実際に強制切断が必要なのかどうかはわかりません。私は(テストされていない)名前がすべての接続がなくなるまで待つと思う。もちろん、2つの名前の変更は1つのトランザクションで行う必要があります。 –

+0

いいえ、エラーで失敗します。これは私がテストしたものです。 :) – relet

+0

プロダクションの大きな変更を行う伝統的な方法は、スキーマとデータの更新をスクリプト化し、バックアップし、オフラインでテストし、既存のデータベースに適用することだと思います。これは、2つのデータセットを保持したり、古いデータベースをしばらく読み込み専用にする必要はありません。 – Tobu

答えて

1

提案どおりに:新しいデータベースのテーブルを別のスキーマとして作成し、次にsearch_pathを変更します。

また、新しいスキーマと同じ名前のユーザーを作成し、すべてのアプリケーションをテストします。このユーザーとして各ユーザーにログインしてsearch_pathを変更する前に、新しいスキーマがデフォルトでそのユーザーのsearch_pathに最初に表示されます。名前は一致します。

最後に、古いスキーマを削除するときに気をつけてください。修飾リファレンス(例:prd.tableまたはprd.function)を使用してオブジェクトを参照するものがある場合は、最初に名前を変更することをおすすめします。数日後、それを自信を持って落とすことができます。

+0

それはユーザーとの素晴らしいアイデアです! – relet

0

私は自分のスキーマをバージョンアップし、準備ができたら新しいスキーマを指すようにアプリケーションを変更します。

+0

ありがとう。私はこれがうまくいくと思います。私は過去にそれを行っています。私たちのケースでは、「アプリ」はいくつかのマシンに分散された小さくて機敏なサービスです。 – relet

関連する問題