• 締切済み

BACKUP DATABASE とINSERTが同時に行われた場合、データの不整合は発生しないのか

SQL Server2005で DBアクセスをするツールがあり、不定期なタイミングで Insertや、Update、Deleteが発生します。 このツールを動作中に別ツールでBACKUP DATABASEで DB内の全データのバックアップを行いたいのですが、 Insert(Commit)などのタイミングと重なった場合 どうなるのでしょうか? 一番気がかりなのはバックアップしたデータに不整合が 発生しないかという点です。

みんなの回答

回答No.3

SQL Server は データ更新中のバックアップが可能です。 バックアップの内容はバックアップが完了した時点の DB状態がバックアップされていることになります。 (バックアップ完了時点で、コミットされていれば、 バックアップはされています。) DBの不整合はアプリの異常終了等でも発生します。 不整合は、2フェーズコミットで減らすことができます。

  • t-ka
  • ベストアンサー率28% (14/50)
回答No.2

>バックアップが走っている間は他からのINSERTなどは >バックアップが終了するまで待つという事ですよね。  マルチスレッドプロセスなのでほとんど同時に(内部的には瞬時に切り替えていますが、)I/Oの許す範囲で行います。とは言え普通は書き込みの方が優先されるでしょう。例えばあるスレッドがある記憶範囲(メモリなど)を書き込み中に他のスレッドが同じ記憶範囲を読み込んだとしたらそのデータは不整合(ダーティ)になるでしょう。これが描画モジュールだとしたらでたらめな文字が表示されるということです。  この辺りのことはMSSQL・・2000 2005 2008 と進化してきて メモリ障害等に対してもデータの整合性が保てるようになっています。  それとアプリ側で一連の処理は普通トランザクションを使用していると 考えられます。心配でしたら他のマシンで復元して確認してみてください。健闘を祈ります。

  • t-ka
  • ベストアンサー率28% (14/50)
回答No.1

SqlServer等の業務用DBはログ先行書き込みと言う技法が用いられており、コミットされていないトランザクションは障害復旧時ロールバックされます。夜間一括でバックアップを行い、昼間はログのみ1~30分単位とかでバックアップすれば良いと思います。 insert()の場合autocommitですが、仮にcommitされていなくても次の30分後のログバックアップさえ成功すれば整合性に問題はないということです。

参考URL:
http://technet.microsoft.com/ja-jp/library/aa337560.aspx
koumem
質問者

お礼

回答ありがとうございます。 バックアップが走っている間は他からのINSERTなどは バックアップが終了するまで待つという事ですよね。 INSERT処理の途中でバックアップが走るとどうなるのですか たとえばAとBにinsertする処理があって AにINSERTした後にバックアップ処理が走った場合、 バックアップが終わってからBが走るという具合ですか

関連するQ&A

  • まれにinsertエラーが発生する

    VB6からWindows版PostgreSQL8.2.4へ書き込みを行っています。 まれにinsertエラーが発生する為、困っています。(2日~7日に1回) エラー時のSQLログがあり、SQL文に間違いが無いことは確認ずみです。 エラー詳細を取っておらず詳細がわかりません。 (実際に現象を発生させようとしましたが、発生しません。) 追加するテーブル自体に主キーは設定していません。 データの書き込みは15秒に2レコード位なのですが、Update文の直後のinsert文がまれに失敗します。 とりあえず、トランザクション処理で回避していますが、PostgreSQLの設定値などの変更により、回避出来るのでしょうか。 また、この様な事はよくあることなのでしょうか。 説明が分かりづらく申し訳ありませんが、 宜しくお願いします。

  • INSERTしたテーブルデータの参照

    いつもお世話になっています。 早速ですが質問したいことがあります。 環境は、ORACLE11gです。 よろしくお願いします。 PL/SQLにて、テーブルAに対してINSERTを行い、テーブルAにINSERTした データを元にデータを作成し、テーブルBにINSERTをしたいと考えています。 COMMITは、プログラムの処理が全て終わった後に行います。 一応プログラムを作成し、想定どおりの動作を確認できたのですが、一点だけ 気になることがあります。 テーブルAにデータをINSERTしてから、COMMITせずに、テーブルBのデータを 作成するために、テーブルAのデータを取得します。その際、最初に登録した テーブルAのデータは、テーブルBを作成する際、必ず取得できるのでしょうか。 (一応作成したプログラムでは取得できていますが、必ず取得できるものなのか  を教えていただきたいです。) COMMITは、仕様上プログラムが全て終わった後にしか行えません。 質問は以上です。 質問文がごちゃごちゃして見難くてすみませんが、ご回答よろしくお願いします。

  • SQL Server上のDBにWin7でアクセス

    SQL Server上のDBに、Win7のクライアントPCからSELECTのみ実行できるツールを探しています。(INSERT、DELETE、UPDATEは実行できないものがいいです。また、DBを直接編集もできては困ります) フリーソフトがベストです。どなたか、ご教授頂けますでしょうか。

  • insert into $DB (data1, data2) values (\"$data1\", \"$data2\")で変数扱いされません

    $sql = "insert into $DB (data1, data2) values (\"$data1\", \"$data2\") ; PHPにてMySQLを操作していますが、上記のように insertする項目の文字列に数字が入ると insertする際に、data1がそのままdata1として書き込まれてしまいます。 $sata1 = 'text or int'; data1 = $data1; として書き込みたいのですが… アドヴァイスお願い致します。

  • [ADO.NET]Accessの日付型にデータをInsertするには?

    言語はVB.NETでDBはAccess2003、OleDbで接続をしています。 テーブルに日付型のフィールドがあるのですが、 SQL文でInsertしようとすると、 System.Data.OleDb.OleDbException: 更新可能なクエリであることが必要です。 という例外がスローされます。 SQL文としては、 INSERT INTO TEST_TABLE (name,updatetime) VALUES ('テスト',DateValue('2006/12/11 18:00:00')); というような構文になっています。 初歩的な不明点ですが、ご教授お願いします。

  • データの更新方法について

    データを更新するときSQLで DeleteしてInsertする更新方法と Updateを行う更新方法とがあると思うのですが この使い分け、切り分けはどういう視点になるのでしょうか 私はDeleteしてInsertする方が簡単なので Delete + Insertをよく使っています。

  • 鬱 XOOPS X2のデータベース操作ではまりました。

    鬱になりそうです。 $this->db->query($sql); はSELECT系 $this->db->queryF($sql); はINSERT, UPDATE, DELETE系 と気づくのに1日かかりました。 私はプログラマーに向いていないのでしょうか? XOOPS Cubeでなく X2ではまる場所って他にありますか? 単に私が・・・なだけでしょうか?

    • 締切済み
    • PHP
  • ダンプリストア時のDBデータ不整合

    環境 CentOS5系 64bit DBバージョン 8.3.3 本番DBサーバからpg_dump -c -D でダンプしたデータを、ローカルテストDBサーバ へpsql にてリストアした際、データ不整合が、一部のテーブルに発生しました。 前のデータが一部クリアされずに残っている状況です。 ダンプのデータは、DBの内容と同じなのですが。 因みに、pg_dump パラメータ無しのダンプのリストアでは、発生しません。 何が、原因でしょうか? もしかしてバグ? ご教授願えれば幸いです。 宜しくお願い致します。

  • オンラインREDOログ障害からの復旧方法について

    現在、Oracle11g Release2 11.2.0.3(ASM使用) の環境で、オンラインREDOログファイルが全て消失した場合を想定して、以下の手順で復旧の方法をテストしています。 ----- 1.sqlコマンドでテーブルに1件データを挿入する。 2.フルバックアップ(バックアップセット)を取得する。 3.sqlコマンドでテーブルに1件データを挿入する。 4.累積増分バックアップを取得する。 5.sqlコマンドでテーブルに1件データを挿入する。 6.DBをシャットダウンする。 (RMAN> shutdown immediate;) 7.オンラインREDOログファイルを全て削除する。 8.DBをマウントする。 (RMAN> startup mount;) 9.リストアをする。 (RMAN> restore database;) 10.バックアップの際に除外している表領域をオフラインにする。 (SQL> Alter database datafile '+DATA/orcl/DATAFILE/hoge2' offline drop;) 11.リカバリをする。 (SQL> recover database using backup controlfile until cancel;) (ログの指定は AUTO) 12.DBをオープンする。 (RMAN> alter database open resetlogs;) 13.sqlコマンドでテーブルの中を確認する。 (SQL> select * from HOGEHOGE;) (データが1件) ----- 上記の手順でDBをオープンにするところまで上手くいったのですが、 私の考えでは、13でテーブルを確認するとデータが2件はいっていると思ったのですが、 結果は、1件だけでした。 累積増分バックアップを取得した時点(データが2件入った状態)まで戻したいのですが、 解決の手がかりになる情報などがございましたらご教示いただけますでしょうか。 よろしくお願いします。

  • VBでODBC接続して更新・削除できない

    VBとSQLSerever2003を接続してプログラムしています。 ネットで検索しつつ以下のコードで接続できました。 Set SQL_DB = SQL_WSpace.OpenDatabase("", False, False, "ODBC;Driver={SQL Server};" "SERVER=" & (DATABASE_SERVER) & ";" "DATABASE=" & (DATABASE_NAME) & ";" "UID=" & (DB_ID) & ";" "PWD=" & (DB_PASS) & ";" SELECT文は問題ないのですが、DELETE文とUPDATE文だと、「指定されたテーブルから削除できませんでした」、「更新可能なクエリであることが必要です」とでます。アドバイスをお願いします。