none
SQL Server 2005 トランザクションレプリケーションの一時的な停止について RRS feed

  • 質問

  • お世話になります。

    SQL Server 2005 Standard Editionを3台用意して、パブリッシャー、ディストリビューター、サブスクライバーを個別に分けてトランザクションレプリケーションを構成しようと考えています。

    現在の運用では月次処理にて、あるテーブルをいったんTRUNCATEの上、別テーブルの情報をマージしてINSERTという処理を行っているのですが、このテーブルをレプリケーション対象にしてしまうと、TRUNCATE時に「Cannot truncate table 'Table_1' because it is published for replication.」のエラーとなってしまいます。

    このため、月次処理時、一時的にパブリッシュを停止しようと考えたのですが、色々検索すると大別して二つ方法があるようです。

    1. SQL Server Agentを停止する。
      例:http://oshiete.goo.ne.jp/qa/4099086.html
    2. パブリケーションのアーティクルから除外する。
      例:http://www.issociate.de/board/post/342715/Cannot_Alter_Table_being_Published_for_Replication.html

    1の方法について、ディストリビューターのSQL Server構成マネージャからSQLServerAgentを停止したところレプリケーション自体は停止しました。しかしテーブルのTRUNCATEは依然同様のエラーにてできませんでした。念のため、パブリッシャー、サブスクライバーのSQLServerAgentも停止しましたが、事象は変わりませんでした。

    2の方法について、アーティクルから対象テーブルを除外すると希望通りTRUNCATEが可能となりました。

    1の方法でうまくいかない理由について何が考えられますでしょうか。(私のSQLServerAgentの意味の取り違え?)

    2011年2月7日 9:12

回答

  • 前者の方法はアーティクルに対してtruncate tableを実行した例ではなく、
    データベースのトランザクション分離レベルの指定のようですね。

    さて以下の文書があります。
    http://msdn.microsoft.com/ja-jp/library/ms151740.aspx

    ここでは以下の記述があります。
    --------------------------

    パブリッシュされたテーブルで TRUNCATE TABLE を実行できないのはなぜですか。

    TRUNCATE TABLE はログに記録されない操作であり、トリガも起動されません。操作による変更を追跡できないため、TRUNCATE TABLE は許可されていません。トランザクション レプリケーションでは、トランザクション ログを通じて変更が追跡され、マージ レプリケーションでは、パブリッシュされたテーブルのトリガを通じて変更が追跡されます。

    --------------------------

    このことから内部的にはトランザクションレプリケーションでarticleとして指定されている場合は
    truncate tableに失敗するものと考えられます。
    SQL Server Agentを止めるだけではレプリケーション関連ジョブだけが停止し、
    テーブルがレプリケーションのarticleからは外れないためと思われます。

    また、
    http://msdn.microsoft.com/ja-jp/library/ms177570.aspx
    にはその他truncate tableできない例が挙がっていますので参考にしてください。

     

    2011年2月7日 13:26
    モデレータ

すべての返信

  • 前者の方法はアーティクルに対してtruncate tableを実行した例ではなく、
    データベースのトランザクション分離レベルの指定のようですね。

    さて以下の文書があります。
    http://msdn.microsoft.com/ja-jp/library/ms151740.aspx

    ここでは以下の記述があります。
    --------------------------

    パブリッシュされたテーブルで TRUNCATE TABLE を実行できないのはなぜですか。

    TRUNCATE TABLE はログに記録されない操作であり、トリガも起動されません。操作による変更を追跡できないため、TRUNCATE TABLE は許可されていません。トランザクション レプリケーションでは、トランザクション ログを通じて変更が追跡され、マージ レプリケーションでは、パブリッシュされたテーブルのトリガを通じて変更が追跡されます。

    --------------------------

    このことから内部的にはトランザクションレプリケーションでarticleとして指定されている場合は
    truncate tableに失敗するものと考えられます。
    SQL Server Agentを止めるだけではレプリケーション関連ジョブだけが停止し、
    テーブルがレプリケーションのarticleからは外れないためと思われます。

    また、
    http://msdn.microsoft.com/ja-jp/library/ms177570.aspx
    にはその他truncate tableできない例が挙がっていますので参考にしてください。

     

    2011年2月7日 13:26
    モデレータ
  • 回答ありがとうございます。

    例としてあげましたURLでは、SQLServerAgentの停止について「テーブルのデザイン変更などの時はいつも止めています。」との文言がありましたので、ALTER DATABASE以外についても可能かと捉えてしまいました。

    ご提示いただいたFAQ資料は大変参考になりました。ありがとうございます。

     

    追伸:回答を先に行うとお礼の返信ができないようで、マークがややこしくなりました。すみません。

    2011年2月8日 2:44