お世話になっております。

SQL Server2005のバックアップ・リストアに関する質問です。

環境はサーバ1台とクライアントが3台のC/S構成です。
クライアントのうち1台は、サーバが故障した場合に備えて、毎日、サーバと同じ状態にしています。

そのため、現在、以下の手順で、データベースのリストア作業を毎日行っています。
(1)サーバから完全バックアップ
(2)バックアップファイルをクライアントへコピー
(3)クライアントにリストア
(4)サーバからバックアップファイルを削除

しかし、データベースのサイズも大きくなり、(1)~(3)の作業に、かなりの時間を要するようになりました。

そこで、スピードアップを図るため、
・差分バックアップ
・トランザクションログバックアップ
いずれかを使用したいと考えています。

試しに、以下の手順でバックアップ→リストアを行うと、エラーが発生します。

【エラーが発生する手順】
(1)週末、サーバから完全バックアップ
(2)バックアップファイルをクライアントへコピー
(3)クライアントに復元
(4)サーバから完全バックアップファイルを削除
(5)週始め~差分バックアップ
(6)バックアップファイルをクライアントへコピー
(7)クライアントに復元
→「ロールフォーワードできる状態のファイルがないので、
 ログまたは差分バックアップは復元できません。」のエラー発生

バックアップファイルは、サーバにもクライアントにも残さず削除することが要求されているため、必ず(4)の完全バックアップファイルを削除しています。

一度、完全バックアップをリストアしているので、差分バックアップファイルが存在すれば、それをリストアできるように思っていました。

完全バックアップファイルが存在しなければ、差分バックアップをリストアすることはできないのでしょうか?
ヘルプを読んでみると、何となく、完全バックアップ+差分バックアップがセットで存在しなければリストアできないように認識しましたが、この認識は正しいでしょうか?

もし、完全バックアップファイルを削除すると、差分バックアップをリストアできないのであれば、バックアップファイルを残すことなく、差分のみをリストアする上手い方法がないでしょうか?

何かご存知の方がいらっしゃいましたら、ご教示よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

>完全バックアップファイルが存在しなければ、差分バックアップをリストアすることはできないのでしょうか?



はい。できません。
差分バックアップは、その差分バックアップに含まれるデータの最新の完全バックアップに基づいて行われるものです。
そのため、完全バックアップが消えてしまっては、比較の元がないために、エラーになり、復元はできません。

詳しくは、マイクロソフトのサイトにも書いてありますので
ご覧下さい。

■差分バックアップ
http://msdn2.microsoft.com/ja-jp/library/ms17552 …

>もし、完全バックアップファイルを削除すると、差分バックアップをリストアできないのであれば、バックアップファイルを残すことなく、差分のみをリストアする上手い方法がないでしょうか?

差分バックアップではできないので、部分バックアップを
使って見ては、如何でしょうか?
部分バックアップは、SQL Server2005からサポートされている
ものです。

■部分バックアップ
http://msdn2.microsoft.com/ja-jp/library/ms19021 …

ただし、ストアドやテーブル等のオブジェクトの単純比較というレベル
の差分であれば、「SQL Server Compare」という
フリーソフトで管理することは可能です。

■SQL Server Compare
http://www.yessoft.com/dnn/

#それでも、テーブル内に格納されているデータに対する差分は、
 このツールでも無理です。
 その場合は、完全バックアップ + 差分バックアップか、部分バックアップのどちらかを取らない限り無理です。

ご参考になれば幸いです。
    • good
    • 0
この回答へのお礼

kero_mio様

とても詳しく、わかりやすく、ご丁寧な回答をいただき、本当にありがとうございましたm(_ _)m
とても貴重な情報となりました。

バックアップの考え方についても、理解が深まりました。

また、部分バックアップで行けるかもしれないので、もう少し、よく調べてみます。

本当にありがとうございました!

お礼日時:2008/01/15 10:07

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QSQLServer2012の復元ができない

いつも楽しく勉強させていただいております。

環境はSQLServer2012のExpressでOSはWindowsServer2008です。

Test1というデータベースのバックアップを取ってTest2という名前で復元しようとしましたが、なぜか失敗してしまいます。
どなたか原因を教えていただけませんか。

次の手順でバックアップを取り、復元をしています。


○バックアップのフェーズ

1.データベースのバックアップのダイアログボックスを開く。
2.ソースにTest1、バックアップの種類に完全を指定する。
3.バックアップ先は以下のファイルに

 C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\Backup\Test1.bak

4.OKをクリックし、「データベース'Test1'のバックアップが正常に完了しました」を確認。

○復元のフェーズ

5.データベースの復元のダイアログボックスを開く。
6.ソースはデバイスにする。
7.ファイル名に上記3.のファイル名を指定
8.転送先データベースはTest2とする。
9.OKをクリック(ここでエラーとなる)。

エラーメッセージは以下の通りです。

------------------------------------------
データベース'Test2'の復元に失敗しました。(Microsoft.SqlServer.Mangement.RelationalEngineTasks)
追加情報:

System.Data.SqlClient.SQLError:ファイル'C:\Program Files\Microsoft SQL Server\MSSQL11.SQLEXPRESS\MSSQL\DATA\Test1.mdf'に上書きできません。
データベースTest1が使用中です。(Microsoft.SqlServer.SmoExtended)
------------------------------------------

メッセージの内容で引っかかるのはTest1.mdfに上書きできませんというところです。
上書きでなくTest2という新規データベースに書き込みたいのですが。

ためしにTest2というデータベースを作成しておいて「既存のデータベースに上書きする」をチェックしてやってみましたが、やはり失敗。
メッセージは上と同じです。
SQLServerを再起動して試してもやはり結果は同じです。

何が悪いのでしょう。

いつも楽しく勉強させていただいております。

環境はSQLServer2012のExpressでOSはWindowsServer2008です。

Test1というデータベースのバックアップを取ってTest2という名前で復元しようとしましたが、なぜか失敗してしまいます。
どなたか原因を教えていただけませんか。

次の手順でバックアップを取り、復元をしています。


○バックアップのフェーズ

1.データベースのバックアップのダイアログボックスを開く。
2.ソースにTest1、バックアップの種類に完全を指定する。
3.バックアップ先は以下のファイルに...続きを読む

Aベストアンサー

復元時にデータファイルとログファイルの格納先を指定して変更する必要があります。

Q復旧中のデータベースについて

SQL Serverのバックアップを取る為
DBをオフラインにしたのですが
いくつかのDBが
[DB名](復旧中) となったまま状態が元に戻りません。
この状態を強制的に解除する方法はありますでしょうか?
教えて下さい。

Aベストアンサー

うーん、そもそもやり方に問題がありますね。

バックアップというのは、通常BACKUPコマンドを使って実行し、バックアップファイルの拡張子はBAKになります。
戻すときはRESTOREコマンドを使って実行します。

質問者さんがやられたようにMDF/LDFのファイル自体をコピーする方法は一般的ではありません。
が、もしやるならば、「オフラインにする」のではなく、「データベースのデタッチ」を実行してデータベースを一旦切り離し、
それからコピーするのが正しい方法です。
(お勧めはしませんが、SQL Serverサービスを停止させてからコピーする方法もあります)

データベースのステータスはシステムデータベースのmasterが管理しています。
データベースをオフラインにして、ファイルを差し替えたことにより、masterデータベースの把握している状態と齟齬が生じてしまったため、そのような状態になってしまったと考えられます。
そのデータベースをドロップするかデタッチして、改めてMDF/LDFをアタッチするしかないと思いますが、前にコピーしたMDF/LDFも同じ方法でとったものならば、わずかながらうまくいかないリスクはあります。

SQL Serverのバージョンは何ですか?Enterprise ManagerもしくはSQL Server Management Studioが使える状態ですか?
(バックアップ、リストア、デタッチ、アタッチはGUIでできるので)

うーん、そもそもやり方に問題がありますね。

バックアップというのは、通常BACKUPコマンドを使って実行し、バックアップファイルの拡張子はBAKになります。
戻すときはRESTOREコマンドを使って実行します。

質問者さんがやられたようにMDF/LDFのファイル自体をコピーする方法は一般的ではありません。
が、もしやるならば、「オフラインにする」のではなく、「データベースのデタッチ」を実行してデータベースを一旦切り離し、
それからコピーするのが正しい方法です。
(お勧めはしませんが、SQL Serv...続きを読む

Q別のDBからテーブルをコピーする方法

SQL Server2005 Express Edition を使っています。
異なるDB間(同じコンピュータ内)で、テーブルをコピーしたいの
ですが・・・
コピー元DB名:DB_A
コピー元テーブル名:dbo.顧客
コピー先DB名:DB_B

テーブルのコピーは select * into ・・・ from ・・・ を使えばできそうですが、別DBの場合の方法がわかりません。
お教えいただければ幸いです。
よろしくお願いいたします。

Aベストアンサー

別のDBでも同じインスタンス内ならば同じです。

SELECT * INTO DB_B.dbo.顧客 FROM DB_A.dbo.顧客

QMS SQLServer のSQLで文字列の前にN:

MS SQLServer のSQLで文字列の前にN: をつけることをよく見かけますが、
「N:」とはいったいどんな意味なのでしょうか?
教えて下さい。

Aベストアンサー

T-SQLでの話かと思いますが・・・。NCHAR/NVARCHAR型という、型(タイプ)があるのですが、これらは、夫々、national character/national character varying(SQL-92での表記法)の意味を持っています。夫々、固定長文字列(Unicode)/可変長文字列(Unicode)です。
NVARCHARはSQL-Server2000では4000文字まで、VARCHAR2は8000文字まで格納可です。(つまり、1/2になるということです)

さて、N'***' とT-SQL内で書くと、''内の文字をUnicodeで表現されたものとして処理する、という意味になります。Nは、nationalの略です。ですから、日本語を使おうとするとNは必須になる、という事ですね。

こんな感じでつかいます。#N'Unicode 文字列'

Q特定のフォルダ内のある種類のファイルをすべてコピーし格納する方法

WINDOWSマシン使用。
あるフォルダ(AAA)の中に、複数のフォルダやファイルを含み、またそのフォルダは、
は、下位のフォルダやファイルを含むという関係が続きます。階層は4くらい。
この中の各所にあるフォルダにはwordのファイルやその他のファイルを含んで
います。
このwordのファイルだけをすべて選択しコピーして、別のフォルダ(BETU)へ
入れたい。
簡単に行なう方法、あるいはツールなどあれば紹介をお願いします。

Aベストアンサー

はじめまして。

コマンドプロンプトで
for /f "tokens=*" %i in ('dir /b /s AAA\*.doc') do copy "%i" "BETU"
を実行すれば4階層以上深くても可能です。

※"%i" "BETU"と"でくくるのは、ディレクトリ名に空白がある場合エラーとなるのを防ぐためです。

AAAもBETUもフルパスで記述すればコマンド実行ディレクトリは何処でも構いません。

Q[SQLServer]既に存在するテーブルに他のテーブルからデータをINSERT

SQL初心者です。

既に存在するTable_A(レコード0件)に対して、これまた既に存在するTable_B(レコード100件)の内容をINSERTしたいです。次のように書くとだめですよね。
(Table_AとTable_Bのレイアウトはまったく同じ)

select * into Table_A from Table_B

何か策はあるのでしょうが、ちょっと探しきれません。お分かりになるかた教えてください。

Aベストアンサー

>(Table_AとTable_Bのレイアウトはまったく同じ)
これを読み飛ばしておりました。

ならばもっと省略できます
Insert Into Table_A
Select *
From Table_B
where フィールドB1 = 'ぱけらった' ←条件をつけるとき

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Q復元に異常に時間がかかる

DBの復元をしようとしているのですが、
復元中のメッセージ表示後、インジケータが全く動かなくて、
1時間たったところでキャンセルしました。
その間、タスクマネージャーを見てみましたが、
CPUは1%、メモリも300MB程で、
何もしていないで止まっている感じです。
なぜそうなってしまうのでしょうか?
回答宜しくお願いします。

Aベストアンサー

リストアするときにそのデータベースに接続しているセッションが残っていると、リストアがいつまで経っても0%のままなので、「おかしいな」と思うことは昔よくありました。
(実際には「排他アクセスを取得できませんでした」というメッセージが別ウィンドウで返ってきているのですが、気付きにくいんですよね)

今回のケースが同じものか、書かれている状況だけでは判断できませんが、クエリアナライザの接続も一つ残らず閉じて、それでリトライしてみることをお勧めします。

Q期限切れのバックアップの削除

有効期限を設定して日数が経過してもバックアップファイルは自動では消えないのでしょうか?

不要なバックアップを自動的に削除する為には、毎回ファイルを作成するのではなく、
一つのファイルに追加していくと、ファイル内から期限切れのバックアップが消えていくのでしょうか?

試せばいいのでしょうが、期間を一日にしても結果が判るのが月曜日になってしまい、
週末を悶々としてすごさないといけないので質問しました、よろしくお願いします。

Aベストアンサー

#1です。
「メンテナンスクリーンアップタスク」というのを追加すれば可能です。
メンテナンスプランで作成されるバックアップは1バックアップ1ファイルになりますので、指定日数後に削除するように登録しておけば期限が過ぎたバックアップファイル自体が削除されていきます。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング