• 締切済み

レプリケーションのトランザクション

SQL Server 2005にて、トランザクションパブリケーションによるレプリケーションの設定を行っています。 例えばプログラム側で3つのinsert文で一つのトランザクションとしているとき insert into tableA・・・(1) insert into tableB・・・(2) insert into tableC・・・(3) SQLServerのレプリケーション機能で同期中((1)、(2)のみ同期完了)にディストリビュータサーバに障害が起こった場合 (1)、(2)のみコミットされた状態で、(3)は適応されないという不整合は起こり得るのでしょうか? また、そのような状況を防ぐ方法はあるのでしょうか? レプリケーションを初めて構築するので困っております。 ご存知の方、どうかよろしくお願い致します。

みんなの回答

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

もしそれが起こるようなら、レプリケーションをサポートしているDBMS自体として問題だと思うのですが。。 >トランザクションのバッチ全体がディストリビューション データベースに正常に書き込まれるとコミットされます http://technet.microsoft.com/ja-jp/library/ms151706(SQL.90).aspx

関連するQ&A

  • マージレプリケーション

    マージレプリケーションについて質問があります。 現在Windows2000 SQLServer2000で、 サーバーAにB,C2台のサーバーがぶら下がっている状態の運用を行っております。 サーバーAとB,Cはマージレプリケーションで同期を取っており、B,Cそれぞれで更新されたデータはAで統合されるようになっております。 パブリッシャーは複数あり含まれるテーブル数はまちまちです。 おききしたい点 ある1つのパブリッシャーで、サブスクリプションが同期を取る際に、 「テーブルがほかのパブリケーションで使用中なので、 プロセスは1つ以上のテーブルを削除できませんでした。」 というメッセージが出てきて、うまく同期が取れなくなってしまいました。 現在、アーティクルに同じテーブルを参照しているパブリケーションは存在しませんので、エラーの出てくるパブリケーションを削除、追加を何度か繰り返したため、B,Cのテーブルに情報が残ってしまったのでは ないかと思われます。 パブリケーションを削除したのですが、B,Cのレプリケーションのサブスクリプションに削除したはずのサブスクリプションが「同期中です」で残っており、これを削除することができません。 正常にパブリケーションを作成しなおしたいのですが、どのようにすればよろしいでしょうか? 当方、初心者でまわりに聞ける人がいないので困っています。申し訳ありませんが、よろしくお願いします。

  • 1つのテーブルから複数のテーブルへのデータ振分け

    MySQLを使用して、tableAというテーブルのデータを tableB,tableC,tableDというテーブルに振り分けたいと思っています。 1日1回、自動的に行いたいと思っています。 たとえば、tableAのテーブル構成が下記のようなもので ================== name sex birth address phone email company ================== name,address,phoneはtableBに name,sex,birthはtableCに name,companyはtableDに分けるというような イメージです。 私の考えでは、下記のようなSQL文をPHPから呼び出して、タスクで 実行させてそれぞれ別のテーブルに振り分けようと思っている のですが、、もっと良いツールや方法があればお教えいただけ ませんでしょうか。 宜しくお願いいたします。 ---------------------------------------------------------------------------------------------------- INSERT INTO tableB (name,address,phone) SELECT tableA.name,tableA.address,tableA.phone FROM tableA AND INSERT INTO tableC (name,sex,birth) SELECT tableA.name,tableA.sex,tableA.birth FROM tableA AND INSERT INTO tableD (name,company) SELECT tableA.name,tableA.company FROM tableA; ----------------------------------------------------------------------------------------------------

  • レプリケーションの設定方法について

    お世話になっております。 現在、SQLServer2005、VB6.0(SP5)を使って開発をしています。 最終的には、レプリケーションの設定/解除を行うツールを作りたいのですが、まずSQLの機能を使って、ツール作成よりも簡単にレプリの設定/解除が出来るのではないかと調査中です。 msdnのヘルプに、次の様な記述がありました。 「レプリケーション スクリプトは、以下のような方法で作成できます。  ・レプリケーション ウィザードのスクリプト生成機能を使用する。」 (http://msdn2.microsoft.com/ja-jp/library/ms147302.aspx) しかし、この機能を使って作成したスクリプトを使っているのですが、データの同期が行えていません。 ログ リーダー エージェントを見ると、 「1 個のトランザクションが 1 個のコマンドと共に配信されました。」 と表示されているのですが、実際にデータを確認すると、同期が取れていません。 サブスクリプションの状態をチェックすると、 「ディストリビュータからサブスクライバまでの履歴」 で、「パブリケーション○○の初期スナップショットはまだ使用できません。」 と言うエラーが表示されていました。 レプリケーションモニタをチェックしたところ、スナップショットエージェントが開始されていませんでした。 そこで、スナップショットエージェントを開始したら、データの同期が行えるようになったのですが、 「レプリケーション ウィザードのスクリプト生成機能」を使用して作成したスクリプトなのに、完全なレプリケーションの設定が出来ないのは、どうしてなのでしょうか? 何か御存知の方がいらっしゃいましたら、教えてください。 よろしくお願いします。

  • SQLServer2005 レプリケーションについて

    SQLServer2005で、 マージレプリケーションのテストを行っています。 サーバーが2台あります。 Serv1・・・パブリッシャ Serv2・・・サブスクライバ とします。(どちらも2005です) 困っていることは、 サブスクリプションの上で右クリックし、 「同期状態の表示」を開くと、 「サーバー'Serv2\インスタンス'はサブスクライバではありません。」 とのメッセージが表示されており、 「開始」ボタンを押しても、Serv1側で変更したデータは反映されず、 ログを見ると「Serv2\インスタンス に接続できませんでした。」と残っています。 これを解消したいのですが、 どこから説明してよいのかわからないので、 最後に、設定手順を書いておきます。 -----設定手順----- SQLServer Management Studioを使って、 Serv1のローカルパブリケーションから、新規パブリケーションの作成ウィザードを実行し、パブリケーションを作成。 ここまでは、問題なく進みました。 次に、先ほど作成したパブリケーションの上で右クリックし、 サブスクリプションの新規作成ウィザードを開始しました。 サブスクライバの選択画面まで進み、 「SQLServer サブスクライバの追加」ボタンで、 [Serv2\インスタンス名]を追加しようとしましたが、認識できなかったので、 [IP\インスタンス名]と指定したら、 「レプリケーションでは、IPではなく実際のサーバー名を指定してください。」のようなメッセージがでたので、いったん中断しました。 hostsファイルに[Serv2]を追加してから、再度ウィザードを実行したら、 サブスクライバの画面から次に進めました。 マージエージェントセキュリティで 1つ目の選択肢で「SQLServerエージェント サービスのアカウントで実行する」 を選択し、 サブスクライバの接続では、 「次のSQLServerのログインを使用する」を選択し、ログインとパスワードを入力しました。 あとは、規定値で、完了しました。 このあと、2アクション(Serv2\インスタンスのサブスクリプションを作成しています、同期エージェントを開始しています)とも成功で終わります。

  • レプリケーションでのSQLServer認証について

    マージレプリケーションまたは、サブスクリプションで変更可能なトランザクションレプリケーションを設定しようとしています。 SQL Server認証で行いたいと考えています。 マージパブリケーションを設定したあと、サブスクリプションを作成しようとしたところで、以下のようなエラーが発生します。 -------------------------------- ジョブは失敗しました。 所有者 AAA (ジョブ BBBB) にはサーバーへのアクセス権がありません. -------------------------------- (このAAAという所有者はWindowsのユーザーです) 思い当たるのが、サブスクリプションの設定をする時の「マージ エージェントセキュリティ」の「サブスクライバに接続」の箇所は、「プロセスのアカウントを借用する」しか選べません。「SQL Serverログインを使用する」を選びたいのですが・・・。 全てのやりとりをSQL Server認証で行うには、どこを設定したらよいでしょうか??widnows認証でしかレプリケーションの設定を行えないのでしょうか?? パブリケーションは、SQL SERVER 2005 Developer サブスクリプションは、SQL SERVER 2005 EXPRESS です。

  • SQLserver2000のレプリケーションについて

    トランザクションとマージの違いが 知りたいです。 今、AとBの2台同じ機器構成のサーバが あってSQLServer2000 SP3a が入っていて、 AとBは同じDB状態でスタート。 Aだけが日中DBが変更され、 夜間にAの差分DBをBに適用する必要があります。 単純に考えてトランザクションパブリケーション というものを使えばよいのかなと 考えていたのですが、リアルに更新する必要は ないため、マージ?なんとかでも よいというような記述をみかけました。 初心者なものでうまく伝えれませんが、 この場合、トランザクションとマージは どちらが適しているのでしょうか。

  • トランザクションとlast_insert_id

    トランザクション中にinsertする予定のテーブル(未コミット)のauto_increment値を取得することはできるのでしょうか。 以下のような処理を期待しているのですが、hoge1テーブルのauto_increment値が取得できずに困っております。last_insert_id に関わらず、hoge1テーブルのauto_increment値が取得できる方法があれば教えてください。 (1) トランザクション開始 (2) $sql=" INSERT INTO hoge1(name) value('あああ'); "; (3) ( ロールバック ) (4) $key=mysql_insert_id(); (5) $sql2=" INSERT INTO hoge2(hoge1_primary,age) value($key,'20歳'); "; (6) ( ロールバック ) (7) コミット (8) トランザクション終了 よろしくお願いします。 環境: php5,mysql5 (InnoDB)

    • ベストアンサー
    • MySQL
  • SQLServer2005SP2のレプリケーション

    間違えて削除してしまったので再投稿します。 このたび、SQLServer2005SP2でレプリケーションを実装しようと思っています。 構成はこのように考えています。 Server1(プライマリサーバ):パブリッシャ SQLServer2005 SP2 Server2(セカンダリサーバ):ディストリビュータ&サブスクライバ 間違えて削除してしまったので再度投稿します。 SQLServer2005 SP2 Server1とServer2のDB、TABLE構成は同じです。 設定方法についていろいろ調べているのですが、どうもこれでよいかと確信がもてません。 どなたか設定方法をご教授お願い致します。 今回の構成に近い設定方法が載ったページなどがあれば合わせて教えてください。 また、Server1は更新用アプリが使用、Server2は参照用アプリが使用などといったことはできるのでしょうか?

  • INSERT分の処理速度がトランザクションを開始している時の方が速い

    SQLServerについて質問させていただきます。 ・トランザクションを開始せずにINSERT文を発行した場合 ・トランザクションを開始してINSERT文を発行した場合 上記の2ケースでは、まったく同じINSERT文でも 開始して発行したほうが 処理が速いという状況になっています。 (Management Stadioで発行) SQL Server Profiler にて確認して、処理時間、CPUの使用時間ともに明らかな差があります。 トランザクションを開始してる状況の方がINSERT文は速い、というのはなにか設定で変えられるのでしょうか?それとも仕組みとして当然そういったものなのでしょうか?(コミットするまでは物理的に書き込まないから、などの理由で) 判断が付かず、非常に困っています。そういう仕組みであるというならば、そういう想定でプログラムを修正するのですが、根拠がわからず、修正に入ってよいかどうか困っています。 本当に困っておりますので、どんな手がかりでもよいのでお教えいただけたらと思います。宜しく御願いいたします。

  • 複数のSQL文を一つのトランザクションで行いたい(SQL Server)

    Visual Basic 2005 から SQL Server に接続してINSERTやUPDATE処理を行いたいのですが、トランザクション処理の記述方法が分かりません。 コネクションオープン トランザクション開始  クラスA呼び出し(INSERTやUPDATEの処理記述)  クラスB呼び出し(INSERTやUPDATEの処理記述)  … コミット(またはロールバック) トランザクション終了 コネクションクローズ 上記の様に、いくつかのクラスに分けて記述したINSERTやUPDATEの処理を、一つのトランザクションで行いたいです。 コネクションやトランザクションを引数とすればよいのでしょうか?