【问题标题】:How do I make sure alla data is restored using SMO?如何确保使用 SMO 恢复 alla 数据?
【发布时间】:2019-07-03 09:51:25
【问题描述】:

当原始数据库处于简单恢复模式时,使用 SMO 对象使用 C# 代码执行的恢复可以正常恢复。我们遇到了一个数据库的问题,其中恢复丢失了某个表中的所有内容,所有数据都在进程后期插入。数据库显示处于 BULK LOGGED 恢复模式。更改为 SIMPLE 并进行新备份后,使用我们的代码恢复正常。

我们在还原对象上尝试了不同的设置,但没有找到解决问题的方法。我们的印象是恢复忽略了日志中的数据。

基本还原如下所示:

sqlServer = new Server(new ServerConnection(instanceName));
restore = GetRestore();
restore.PercentComplete += PercentCompleteAction;
restore.Complete += CompleteAction;
restore.SqlRestore(sqlServer);

GetRestore 函数基本上是这样实现的:

restore = new Restore();
var deviceItem = new BackupDeviceItem(backupFileName, DeviceType.File);
restore.Devices.Add(deviceItem);
restore.Database = newDatabaseName;
restore.NoRecovery = false;
restore.Action = RestoreActionType.Database;
restore.ReplaceDatabase = false;
return restore;

没有错误消息 - 只是缺少一个表中的内容。

添加尝试: 我对下面的解决方案进行了猜测,但没有帮助:

restore.ReplaceDatabase = false;
restore.NoRecovery = true;
restore.Action = RestoreActionType.Database;
restore.SqlRestore(sqlServer);
restore.ReplaceDatabase = true;
restore.NoRecovery = true;
restore.Action = RestoreActionType.Log;
restore.SqlRestore(sqlServer);
restore.ReplaceDatabase = true;
restore.NoRecovery = false;
restore.Action = RestoreActionType.Files;
restore.SqlRestore(sqlServer);

【问题讨论】:

  • 该问题与任何BULK LOGGED 问题无关,切换到 SIMPLE 会降低可用性,它不能解决问题。 BULK LOGGED 与完全记录相同,但特定的批量操作除外。自上次备份以来的更改保留在事务日志中,直到它自己备份为止。这使得恢复更容易。这也意味着除了完整备份之外,您还可以进行小型事务日志备份,例如每 1 小时或 15 分钟一次,并且能够将所有内容恢复到最后一小时的数据,而不是最后一天或一周的数据。
  • 另一方面,SIMPLE 在事务完成后删除事务日志条目。这意味着您不能进行任何日志备份,只能恢复到上次的数据备份。
  • 很可能是在该表为空且没有事务日志备份时进行了最后一次数据备份。转向简单并不能解决这个问题。它甚至不影响备份和恢复的行为,只影响事务日志的使用方式
  • the restore missed all content from a certain table, where all data was inserted late in process. 这可能意味着在进行数据备份时没有提交数据更改。它们仍会出现在事务日志中。恢复事务日志会将它们带回来。使用 SIMPLE 不会留下任何事务日志条目,因此不会有任何恢复它们的机会
  • 我认为您的最后一条评论是对的,那么问题就变成了:如何确保将事务日志恢复为目标数据?我在我的问题中添加了一个尝试,但没有任何帮助。

标签: sql-server restore smo


【解决方案1】:

你需要在你的Log文件中选择一个正确的FileNumber,这个方法可以解决你的问题:

public static void restaurarBackup(string pathFileBak)
    {
        SqlConnection conn = new SqlConnection(Connection.getCon());
        Server smoServer = new Server(new ServerConnection(conn));

        string localFilePath = pathFileBak;
        string db_name = "ETrade";
        string defaultFolderEtrade = @"C:\ETrade\";
        Restore rs = new Restore();
        rs.NoRecovery = false;
        rs.ReplaceDatabase = true;
        BackupDeviceItem bdi = default(BackupDeviceItem);
        bdi = new BackupDeviceItem(localFilePath, DeviceType.File);
        rs.Devices.Add(bdi);
        DataTable dt = rs.ReadFileList(smoServer);
        foreach (DataRow r in dt.Rows)
        {
            string logicalFilename = r.ItemArray[dt.Columns["LogicalName"].Ordinal].ToString();
            string physicalFilename = defaultFolderEtrade + Path.GetFileName(r.ItemArray[dt.Columns["PhysicalName"].Ordinal].ToString());
            rs.RelocateFiles.Add(new RelocateFile(logicalFilename, physicalFilename));
        }
        DataTable backupHeaders = rs.ReadBackupHeader(smoServer);
        rs.FileNumber = Convert.ToInt32(backupHeaders.AsEnumerable().Max(backupInfo => backupInfo["Position"]));
        rs.Database = db_name;
        smoServer.KillAllProcesses(rs.Database);
        Microsoft.SqlServer.Management.Smo.Database db = smoServer.Databases[rs.Database];
        db.DatabaseOptions.UserAccess = DatabaseUserAccess.Single;
        rs.SqlRestore(smoServer);

        db = smoServer.Databases[rs.Database];
        db.SetOnline();
        smoServer.Refresh();
        db.Refresh();
    }

如果您想在日志文件中查看备份,see this query:

SELECT database_name, name, backup_start_date, 
backup_finish_date, datediff(mi, backup_start_date, backup_finish_date) [tempo (min)],
 position, first_lsn, last_lsn, server_name, recovery_model, 
 type, cast(backup_size/1024/1024 as numeric(15,2)) [Tamanho (MB)], B.is_copy_only
FROM msdb.dbo.backupset B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多