SQLレプリケーション実装ルール
SQLレプリケーションの実装にはルールがある。 レプリケーション環境では、ステートメント・リプレイを使用してレプリケートできないSQLステートメントは、値によってレプリケートされるか、レプリケーション・エラーで拒否されます。
SQLレプリケーションの実装には以下のルールが適用されます:
- レプリケートされたデータまたはグローバル・データに対する更新トランザクションは、プライマリ・ノードで実行されなければならない。
- ユーザー、グループ、セキュリティ定義、グローバル権限などのグローバル・データに対する更新トランザクションは、複製データベースまたはSYSTEMデータベースへの接続がある場合にのみ、プライマリで許可されます。
- SYSTEMデータベースはレプリケートされません。 これは、テーブルやビューなどのローカル・オブジェクトに適用される。 グローバル・オブジェクトはレプリケートされたデータベースの一部ではないため、レプリケートされます。
- 一時テーブル自体は複製されない。 しかし、更新トランザクション(一時テーブルにアクセスし、レプリケートされた非一時テーブルに書き込むトランザクション)で一時テーブルを使用すると、値によるレプリケーションが発生します。 つまり、一時テーブルは、値によるレプリケーションを使用することで許可され、サポートされる他の非レプリケーションリソースと同じです。
- レプリケートされていないデータベース、システム・テーブル、および仮想テーブルから選択する、レプリケートされたオブジェクトに対する更新トランザクションは、値によるレプリケーションをトリガします。
- プライマリ・ノードが停止している場合、レプリケートされたデータベースに対する更新SQLトランザクションはすべてエラーになります。 トランザクションの開始と終了は、レプリケーションが継続的にアクティブであった時間帯でなければならない。
- オプティマイザが特定の実行順序を選択することに依存するSQL式でWHERE句を使用したい場合は、IF/THEN文を使用するように句を書き換える必要があります。 そうでなければ、プライマリとレプリカが異なる順序で節を評価し、ゼロによる除算エラーになるかもしれない。 例えば、次のステートメントは、逆の順序で評価された場合、ゼロによる除算エラーを返す:
問題を修正するには、IF/THENを入れ子にして文を書き直す:( ID <> 0 and ( XYZ / ID > 10) )IF ID <> 0 THEN IF ( XYZ / ID > 10 ) - SQLによるレプリケーションを使用する場合、倍精度またはその他の浮動小数点型を変更するときに、SUMやAVGなどの集約関数を持つSQL文を使用すると、プライマリとレプリカの間でデータの不一致が発生する可能性があります。 これは、浮動小数点データ型の固有の制限により、1つのホスト上の2つのクエリでも発生する可能性がある。 有限精度の IEEE-754 値を処理するには、等号演算子の代わりに小なりや大なりを使うなど、特別な配慮が必要です。 ビット単位で同じ結果を得るには、更新SQLトランザクションを実行するセッションのセッション変数 REPLICATE_ALWAYS_BY_VALUE をオンに設定します。
- ユーザーがテーブルに列を追加したり、テーブルから列を削除したりすると、テーブルはバージョン管理されたテーブルになる。 レプリケーション環境では、バージョン管理されたテーブルの行を更新すると、以下のエラーでレプリカが停止することがあります:Versioned tables do not support DELETE operations that join again to the versioned table.このエラーを防ぐには、同じトランザクション内で列の追加や削除を行った後に、プライマリ・ノードで VERSIONS オプションを付けて GROOM TABLE コマンドを発行してください。