1

slony によってバックアップされているデータベースがあります。レプリケートされた DB からテーブルを削除し、sql スクリプトを使用して同じテーブルを再作成しましたが、slony スクリプトは使用しませんでした。

投稿でこれを見つけて試しました:

  1. テーブルを再作成する
  2. 再作成されたテーブルの OID を取得します。SELECT OID from pg_class WHERE relname = <your_table>' AND relkind = 'r';
  3. 問題のテーブルの sl_table の tab_reloid を更新します。
  4. SET DROP TABLE ( ORIGIN = N, ID = ZZZ);ここでは MASTER のNODE N# で、ZZZ は の ID # ですsl_table

しかし、うまくいかないようです。

レプリケートされた DB からテーブルを削除するにはどうすればよいですか? または、古いテーブルの代わりに新しく作成されたテーブルを使用する方法はありますか?

4

2 に答える 2

1

データベースからテーブルを削除しましたが、_YOURCLUSTERNAME.sl_table から削除していません。

YOURCLUSTERNAMEの前の「_」が重要です。

混乱を解決するための 4 つのステップ:

1. tab_id を取得する

tab_relname='MYTABLENAME' および tab_nspname='MYSCHEMANAME' の _YOURCLUSTERNAME.sl_table から tab_id を選択します。

MYDATABASE で数値 2 を返します

2.トリガーを削除する

select _YOURCLUSTERNAME.altertablerestore(2);

これにより、エラーが返される場合があります。元のテーブルのトリガーを削除しようとしていて、新しいテーブルがあるためです。 3. slony インデックスが作成されている場合は削除します

select _YOURCLUSTERNAME.tableDropKey(2); これにより、エラーが返される場合があります。元のテーブルのインデックスを削除しようとしていて、新しいテーブルがあるためです。

4. sl_table からテーブルを削除します

tab_id = 2 の _YOURCLUSTERNAME.sl_table から削除します。

テーブルを削除する最良の方法は次のとおりです。

1. クラスタからテーブルを削除します。

tab_relname='MYTABLENAME' および tab_nspname='MYSCHEMANAME' の _YOURCLUSTERNAME.sl_table から tab_id を選択します。

MYDATABASE で数値 2 を返します

slonik < myfile.slonik で実行

myfile.slonik の場所: cluster name=MYCLUSTER; NODE 1 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST1_MASTER user=postgres port=5432'; NODE 2 ADMIN CONNINFO = 'dbname=DATABASENAME host=HOST2_SLAVE user=postgres port=5432';

SET DROP TABLE (ID = 2、オリジン = 1);

2 は sl_table の tab_id で、1 は NODE 1、HOST1_MASTER です

2. スレーブからテーブルをドロップする

SQL DROP TABLE を使用

于 2012-03-28T09:36:22.697 に答える
1

Slony からのドロップに関する信頼できるドキュメントはこちらです。

上記のコマンドを実行する前にどのような状態であったかは明確ではなく、「機能していないようです」も明確にしていません。

Slony でのレプリケーションからテーブルを削除することに関して、私が知っている重要な「落とし穴」が 1 つあります。レプリケーションからテーブルを削除した後、Slony 1.2 を使用して (マスターではなく) スレーブ上でテーブルを実際に物理的に削除すると、次のような不可解なエラーが発生する可能性があります。

ERROR:  "table_pkey" is an index

これは Slony 2.0 で修正される可能性がありますが、ここでの問題は、スレーブ上の複製されていないテーブルと複製されたテーブルの間に参照整合性関係があり、slony 1.2 が設計の一部として意図的にシステム テーブルを破損しており、これが原因です。問題。

解決策は、slonik_execute_script を介して「DROP TABLE」コマンドを実行することです。すでにマスターにテーブルを物理的にドロップしている場合は、オプション「EXECUTE ONLY ON」を使用して、特定のスレーブでのみコマンドを実行できます。詳細については、 EXECUTE SCRIPTのドキュメントを参照してください。

于 2011-11-03T15:28:57.337 に答える