Я пытаюсь восстановить как полную резервную копию, так и дифференциальную резервную копию с помощью запросов Sql. Но при этом выдается исключение при произнесении команды «Нет восстановления» или «Восстановить с помощью QuickBackup(txt_Quick.Text)
«Журнал или дифференциальная резервная копия не могут быть восстановлены, поскольку нет файловготовы к повтору транзакций.\r\nRESTORE DATABASE завершается
ненормально.\r\nКонтекст базы данных изменен на «главный».
Вот мой код. См. условие else if в методе WriteFile().
private void WriteFile()
{
try
{
// Creates Restore.sql file.
string strTSQLFile = Environment.CurrentDirectory + "\\Restore.sql";
FileInfo File = new FileInfo(strTSQLFile);
StreamWriter Writer = File.CreateText();
// Write open database
string strTemp;
Writer.WriteLine("ALTER DATABASE [" + DB_NAME + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
Writer.WriteLine("Go");
if (Complete_Opt.Checked == true) // Full restore
{
strTemp = "USE MASTER RESTORE DATABASE [" + DB_NAME + "] FROM DISK = \'" + BackupFile_Txt.Text + "\' WITH RECOVERY";
Writer.WriteLine(strTemp);
}
else if (Differential_Opt.Checked == true) // Quick restore
{
strTemp = "USE MASTER RESTORE DATABASE [" + DB_NAME + "] FROM DISK = \'" + BackupFile_Txt.Text + "\' WITH RECOVERY";
Writer.WriteLine(strTemp);
Writer.WriteLine("GO");
//Writer.WriteLine("WAITFOR DELAY '00:00:10'");
//Writer.WriteLine("GO");
Writer.WriteLine("ALTER DATABASE [" + DB_NAME + "] SET MULTI_USER");
Writer.WriteLine("GO");
Writer.WriteLine("ALTER DATABASE [" + DB_NAME + "] SET SINGLE_USER WITH ROLLBACK IMMEDIATE");
Writer.WriteLine("Go");
strTemp = "USE MASTER RESTORE DATABASE [" + DB_NAME + "] FROM DISK = \'" + txt_Quick.Text + "\' WITH NORECOVERY";
Writer.WriteLine(strTemp);
}
Writer.WriteLine("GO");
Writer.WriteLine("ALTER DATABASE [" + DB_NAME + "] SET MULTI_USER");
Writer.WriteLine("GO");
Writer.Close();
}
catch (Exception Exc)
{
throw Exc;
}
}
Вот как я выполняю запросы.
try
{
string strTSQLFile = Environment.CurrentDirectory + "\\Restore.sql";
if (!File.Exists(strTSQLFile))
{
throw new FileNotFoundException();
}
using (StreamReader srSQL = new StreamReader(strTSQLFile))
{
string sqlLine;
StringBuilder sqlString = new StringBuilder();
while (!srSQL.EndOfStream)
{
sqlLine = srSQL.ReadLine();
if (string.IsNullOrEmpty(sqlLine) == false)
{
// We don't actually execute the "GO" lines but can use them to determine when to call the executenonquery function
if (string.Compare(sqlLine, "GO", true) == 0)
{
// Make sure we have something to execute
if (string.IsNullOrEmpty(sqlString.ToString()) == false)
{
ServerActionResult.ConnectionContext.ExecuteNonQuery(sqlString.ToString());
System.Diagnostics.Debug.WriteLine(sqlString);
}
sqlString.Clear();
}
// Add the next line to the stringbuilder object
else
{
sqlString.AppendLine(sqlLine);
}
}
}
}
}
catch (Exception exc)
{
throw exc;
}
finally
{
var strQuery = ("ALTER DATABASE [" + DB_NAME + "] SET MULTI_USER");
ServerActionResult.ConnectionContext.ExecuteNonQuery(strQuery);
}
Когда я пишу в окно отладки с помощью System.Diagnostics.Debug.WriteLine(sqlString);, вот что я вижу:
ALTER DATABASE [PharmSpecDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
USE MASTER RESTORE DATABASE [PharmSpecDB] FROM DISK = 'C:\PharmBackup\Backup\PharmSpecDB_14-Nov-2024-13-38-12-520_Full.Fbk' WITH RECOVERY
ALTER DATABASE [PharmSpecDB] SET MULTI_USER
ALTER DATABASE [PharmSpecDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
Exception thrown: 'Microsoft.SqlServer.Management.Common.ExecutionFailureException' in Microsoft.SqlServer.ConnectionInfo.dll
Вот как создаются резервные копии
Backup bk = new Backup();
string szFilename = DB_NAME + "_" + DateTime.Now.ToString("dd-MMM-yyyy-HH-mm-ss-fff", CultureInfo.InvariantCulture);
//Setup the backup options
if (enumBackupMode == BACKUP_MODE_ENUM.BACKUP_FULL)
{
szFilename += "_Full.Fbk";
bk.BackupSetDescription = "PharmSpecDB Full Backup";
bk.BackupSetName = DB_NAME + " Backup";
bk.LogTruncation = BackupTruncateLogType.Truncate;
bk.Incremental = false;
}
else if (enumBackupMode == BACKUP_MODE_ENUM.BACKUP_QUICK)
{
szFilename += "_Quick.qbk";
bk.BackupSetDescription = "PharmSpecDB Quick Backup";
bk.BackupSetName = DB_NAME + " Backup";
bk.LogTruncation = BackupTruncateLogType.Truncate;
bk.Incremental = true;
}
bdi = new BackupDeviceItem(szLocation + szFilename, DeviceType.File);
bk.Devices.Add(bdi);
bk.Action = BackupActionType.Database;
bk.Database = DB_NAME;
bk.RetainDays = 365;
//Perform the backup
bk.SqlBackup(ServerActionResult);
Подробнее здесь: https://stackoverflow.com/questions/791 ... ull-backup
Восстановление дифференциальной резервной копии вместе с полной резервной копией ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Mailjet: отправка почты с копией или скрытой копией с помощью Mailjet Send API
Anonymous » » в форуме Php - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-