none
SQL Server 2000 レプリケーションで文字列データに差異が発生 RRS feed

  • 質問

  • SQL Server 2000 Standard Edition SP4 (8.00.2055)でレプリケーションを設定しております。
    設定済みのレプリケーションを再初期化して、データを配信しなおすと文字列データに差異が発生してしまいます。
    データが切れたり、どこかのデータと混ざったり、文字化けなど
    スナップショットの形式はキャラクタモード、ネイティブモードとも差異が発生します。また、ネイティブモードの方が差異が多数発生します。
     アーティクルのプロパティは サブスクライバにデータが存在する場合-既存のテーブル内のデータをすべて削除する を指定

    ホットフィックスや何か情報お持ちの方いらっしゃいますか。
    (ちなみに、レプリケーションされている状態でパブリッシャのデータを全件削除し、データを挿入し直すとサブスクライバにも正常なデータが配信されました)


    ●データ 50,000件程度でテスト
     キャラクタモードの場合 数件エラー
       データが切れたり、どこかのデータと混ざったり、文字化けなど
       再現性があり、再初期化して配り直しても同じデータが異常となる。
       が、パブリッシャのテーブルのクラスタドインデックスを外して
       パブリッシャのデータを再度入れ直すと(データ格納場所を変化させると?)、違うデータが異常となる。
       また、同じデータを使用しても差異が発生しない場合もある。
     ネイティブモードの場合 約1000件エラー
       文字列が620バイトを超える?と文字列の後ろに文字化けが発生し、データが切れている状態になる。
       (しかし、長い文字列でもエラーが出ないレコードもある)
       再現性あり同じデータが異常となる。

    ●テーブル
        CREATE TABLE [dbo].[T_TestRep] (
            [TestCD] [int] NOT NULL ,
            [TestText] [varchar] (5000) COLLATE Japanese_CI_AS NULL
        ) ON [PRIMARY]
        GO

        ALTER TABLE [dbo].[T_TestRep] WITH NOCHECK ADD
            CONSTRAINT [PK_T_TestRep] PRIMARY KEY  CLUSTERED
            (
                [TestCD]
            ) WITH  FILLFACTOR = 90  ON [PRIMARY]
        GO

    2009年3月27日 4:45

回答

  • NOBTAさん、情報ありがとうございました。
    キャラクターモードでも発生してしまいます。。。

    その後、サポートへ問合せをし回答を頂きました。

    スナップショット レプリケーションのスナップショット適用時に初期化する設定にすると、BCPが使用され初期データが配信されるとのことです。
    BCPには、文書番号: 323502の他、下記の不具合が報告されているとのことでした。

    技術情報 815132
    Unicode ネイティブ形式を使用した BCP で予期しない EOF が発生する
    http://support.microsoft.com/default.aspx?scid=kb;ja;815132

    技術情報 883716
    FIX: bcp ユーティリティはいない DBCS データ ファイルからインポート テキスト 32 MB より大きい
    http://support.microsoft.com/default.aspx?scid=kb;ja;883716


    3つすべてに対応可能なオプションはないとのことで、
    テーブルのデータ型を Unicode 型(nvarchar, ncharなど)で使用くださいとのことでした。

    試しにカラムをnvarcharに変更して、レプリケーションしてみたところ文字化けはなくなりました。
    ただ、nvarcharはmax4000文字までなので、その制限がネックなのと全テーブルを型変更した場合の作業や影響範囲も問題なのかなといったところです。

    結局、現状のままでレプリケーション再初期化後にパブリッシャとサブスクライバのデータをチェックして
    サブスクライバにUPDATE文をかけるということをしようと思います。。。

    パブリッシャに同じ文字をUPDATEしてもサブスクライバに反映されないんですよね。
    関係あるのかこちらにも質問が上がっていますね。
    http://social.technet.microsoft.com/Forums/ja-JP/sqlserverja/thread/405f8553-b26b-4ef9-ac2b-e2d800bfd0b0

    • 回答としてマーク tyuntyun 2009年4月8日 9:18
    2009年4月6日 13:32

すべての返信

  • 取りあえずレプリケーション元と先でデータベースの照合順序が同じ設定かご確認ください。そこが違っている場合にはレプリケーション先の照合順序をレプリケーション元の設定に合わせれば解決するのではないかと思います。
    Tadahiro Ishisaka(http://www.isisaka.com/)
    2009年3月30日 2:02
  • ありがとうございます。

    パブリッシャ、サブスクライバともJapanese_CI_ASに設定してあります。
    試しに、カラムの設定をJapanese_BINに変更して再配布してみましたが、同じデータに差異が発生しました。

    また、レプリケーション設定のアーティクルのプロパティにある出力先にコピーするオブジェクトの「照合順序」は、チェック有り/無し
    ともに行ってみましたが同様に差異が発生しました。

    さらにサブスクライバをSQL Server 2005にしてみましたが、同じデータにエラーが出ました。

    スナップショットを取得時に発生しているのでしょうか?
    2009年3月30日 5:01
  • スナップショット レプリケーション 及び その他 レプリケーションにて初期化(再初期化) する際、スナップショット形式を "ネイティブ SQL Server 形式" に設定している場合、スナップショット作成時に BCP が使用されていたと思います。
    文字化けが発生している列サイズが varchar (5000) であることから、以下の現象に合致しているかもしれませんね。

    [BUG]: BCP がエクスポート破損の DBCS 文字、文字または varchar データ型で保存します。
    << http://support.microsoft.com/kb/323502/ja >>

    ただ、この現象の回避策として、スナップショット形式を "キャラクタモード形式" にすることが記載されているので、"キャラクタモード形式" にしても文字化けが本当に発生しているのであれば、不思議ですね。
    varchar 列に挿入されているデータで文字化けが発生した元のデータを、バイナリで見ると、何か分かるかもしれません。
    2009年3月31日 10:49
  • NOBTAさん、情報ありがとうございました。
    キャラクターモードでも発生してしまいます。。。

    その後、サポートへ問合せをし回答を頂きました。

    スナップショット レプリケーションのスナップショット適用時に初期化する設定にすると、BCPが使用され初期データが配信されるとのことです。
    BCPには、文書番号: 323502の他、下記の不具合が報告されているとのことでした。

    技術情報 815132
    Unicode ネイティブ形式を使用した BCP で予期しない EOF が発生する
    http://support.microsoft.com/default.aspx?scid=kb;ja;815132

    技術情報 883716
    FIX: bcp ユーティリティはいない DBCS データ ファイルからインポート テキスト 32 MB より大きい
    http://support.microsoft.com/default.aspx?scid=kb;ja;883716


    3つすべてに対応可能なオプションはないとのことで、
    テーブルのデータ型を Unicode 型(nvarchar, ncharなど)で使用くださいとのことでした。

    試しにカラムをnvarcharに変更して、レプリケーションしてみたところ文字化けはなくなりました。
    ただ、nvarcharはmax4000文字までなので、その制限がネックなのと全テーブルを型変更した場合の作業や影響範囲も問題なのかなといったところです。

    結局、現状のままでレプリケーション再初期化後にパブリッシャとサブスクライバのデータをチェックして
    サブスクライバにUPDATE文をかけるということをしようと思います。。。

    パブリッシャに同じ文字をUPDATEしてもサブスクライバに反映されないんですよね。
    関係あるのかこちらにも質問が上がっていますね。
    http://social.technet.microsoft.com/Forums/ja-JP/sqlserverja/thread/405f8553-b26b-4ef9-ac2b-e2d800bfd0b0

    • 回答としてマーク tyuntyun 2009年4月8日 9:18
    2009年4月6日 13:32