奇妙な問題があります。というデータベースがありますrestorelogs
。
自動バックアップ スクリプトは完全バックアップを実行し、その後は 3 時間ごとに差分バックアップを実行します。翌日、もう一度フルを実行してから、もう一度差分を実行します。
いいえ、スクリプトを書きたいのですが、このファイルをrestorelogsデータベースに復元するのは何ですか。
PHPから、sqlsrvを介してこれらのSQLクエリを使用しています:
USE master;
ALTER DATABASE restorelogs SET MULTI_USER WITH ROLLBACK IMMEDIATE;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307151435.bak' WITH REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307151745diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307152045diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307152345diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307160245diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307160545diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307160845diff.bak' WITH FILE= 1, REPLACE, NORECOVERY;
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307161145diff.bak' WITH FILE= 1, REPLACE, RECOVERY;
そして今、ゲームの興味深い部分が来ます.
これらのクエリを SQL Server Management Studio にコピーして実行すると、問題なく動作します。テーブルがあり、エラー メッセージはなく、すべて問題ありません。
しかし。PHP から実行しようとすると、データベースが復元モードのままになります。
多くのページを読んで、最後のクエリにRECOVERY
はデータベースを回復するオプションを含める必要があることを理解しました(また、最初のクエリでは REPLACE を使用しないようにしています)。
どうすれば起こりますか?
私を助けてください、何が間違っていますか。
更新: Adam のコメントに基づく: 私はまさにそれをしようとしています。バックアップ ファイルを収集し、最初 (フル) を NORECOVERY、REPLACE、最後の WITH RECOVERY で使用します。
これは私が試したことです: function pushToDatabase($files) {
$dbh = new Database();
$dbh->query("USE master");
pre($dbh->errorInfo(), 0);
$cnt = count($files);
$i = 0;
foreach ($files as $file) {
$withFile = '';
$option = '';
$moves = '';
if ($i == 0) {
//restoreFromDisk($file);
//truncateDatabase();
$option = " NORECOVERY, REPLACE";
} else {
$option = " RECOVERY";
}
if ($i > 0) {
$withFile = " FILE=1, ";
}
if ($i == 0 || $i == count($files) - 1) {
$sql = "RESTORE DATABASE " . DB_NAME . " FROM DISK = '" . $file . "' WITH " . $withFile . $option . ";";
echo $sql . "<br />";
$dbh->exec($sql);
pre($dbh->errorInfo(), 0);
}
$i++;
}
$sql = "RESTORE DATABASE " . DB_NAME . " WITH RECOVERY;";
$dbh->exec($sql);
pre($dbh->errorInfo(), 0);
echo $sql . "<br />";
die("NOW WE ARE DONE!");
}
最初のステートメントは問題なく実行されています。
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307151435.bak' WITH NORECOVERY, REPLACE;
しかし、この後、最後の差分ファイルを復元したい場合:
RESTORE DATABASE restorelogs FROM DISK = 'D:/Apache/htdocs/logreader/extracts/SRO_VT_LOG201307161145diff.bak' WITH FILE=1, RECOVERY;
エラーメッセージが返ってきました:
[Microsoft][SQL Server Native Client 10.0][SQL Server]A previous restore operation was interrupted and did not complete processing on file 'Log_DB_Data'. Either restore the backup set that was interrupted or restart the restore sequence.'
データベースの状態は復元モードのままになります。
また、RESTORE FILELISTONLY で遊んで、ファイルを適切な場所に移動しようとしました。それはできましたが、その後、差分バックアップを復元できません。
function restoreFromDisk($file) {
$sql = "RESTORE FILELISTONLY FROM DISK = '" . $file . "'";
$res = dbQuery($sql);
$option = ' ,REPLACE, RECOVERY';
while ($row = dbFetchAssoc($res)) {
if ($row["LogicalName"] == "Log_DB_Data") {
$move[] = " MOVE '" . $row["LogicalName"] . "' TO '" . MSSQL_DATA_PATH . "resetlogs.mdf'";
} else {
$move[] = " MOVE '" . $row["LogicalName"] . "' TO '" . MSSQL_DATA_PATH . "resetlogs.ldf'";
}
}
$moves = join(",", $move);
$sql = "RESTORE DATABASE " . DB_NAME . " FROM DISK = '" . $file . "' WITH " . $moves . $option . ";";
dbQuery($sql);
echo $sql . "<br />";
$sql = "RESTORE DATABASE " . DB_NAME . " WITH RECOVERY;";
dbQuery($sql);
echo $sql . "<br />";
}