【问题标题】:How to restore database from azure storage container using c#如何使用 c# 从 azure 存储容器中恢复数据库
【发布时间】:2018-07-18 17:44:13
【问题描述】:

我们有一个 azure 存储容器,我们每天都在其中保存数据库备份文件。现在我们正在使用 SMO (C#) 开发一个应用程序来从 Azure 存储容器中恢复数据库。从本地设备恢复工作正常,但我没有得到任何关于使用 c# 从 azure 容器恢复的帮助。

当我使用 azure blob 恢复备份时,出现以下错误

无法打开备份设备 'https://myaccount.blob.core.windows.net/backupcontainer/Database_e95aec6ab14a43a3a14a62f82b2c7208_20180718022621-04.bak'。 操作系统错误3(系统找不到指定的路径。)。 RESTORE FILELIST 异常终止

我的代码是

Restore restoreDB = new Restore();
restoreDB.Action = RestoreActionType.Database;
restoreDB.Database = databaseName;
BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.Url, CredentialName);
restoreDB.Devices.Add(deviceItem);
restoreDB.ReplaceDatabase = true;

RelocateFile DataFile = new RelocateFile();
string MDF = restoreDB.ReadFileList(smoServer).Rows[0][1].ToString();
DataFile.LogicalFileName = restoreDB.ReadFileList(smoServer).Rows[0][0].ToString();
DataFile.PhysicalFileName = smoServer.Databases[databaseName].FileGroups[0].Files[0].FileName;

RelocateFile LogFile = new RelocateFile();
string LDF = restoreDB.ReadFileList(smoServer).Rows[1][1].ToString();
LogFile.LogicalFileName = restoreDB.ReadFileList(smoServer).Rows[1][0].ToString();
LogFile.PhysicalFileName = smoServer.Databases[databaseName].LogFiles[0].FileName;

restoreDB.RelocateFiles.Add(DataFile);
restoreDB.RelocateFiles.Add(LogFile);
restoreDB.NoRecovery = false;
restoreDB.PercentComplete += new PercentCompleteEventHandler(rstDatabase_PercentComplete);
restoreDB.Complete += new ServerMessageEventHandler(rstDatabase_Complete);
restoreDB.SqlRestore(smoServer);

谁能帮助我如何使用 c# 从 azure 存储容器中恢复备份文件,或者我的代码有什么问题?

【问题讨论】:

  • 服务器是否有权限访问该文件?
  • 是的服务器有权限。我正在提供 CredentialName(存储容器和共享访问签名)
  • Azure 存储中的 blob 与本地磁盘上的文件不同;也就是说,它不能通过标准文件 I/O 访问。它有自己的 SDK(或 REST API)。您需要先将 blob 内容复制到本地某处(例如 VM 磁盘)。
  • 但是如果 blob 类型是 page blob 那么肯定可以直接从 azure 存储恢复

标签: c# azure database-restore


【解决方案1】:

我发现了问题。 SQL Server 2012 或以前的版本不支持从块 blob 还原数据库。所以我将我的 SQL Server 更新为 SQL Server 2017 并更改了我的代码。您需要在 SQL Server 中创建从 azure 还原时使用的凭据。

                if (!smoServer.Credentials.Contains(CredentialName))
                {
                    Credential cr = new Credential(smoServer, CredentialName);
                    cr.Create("SHARED ACCESS SIGNATURE", AzureDataModel.SharedAccessKey);
                }

                Restore restoreDB = new Restore();
                restoreDB.Action = RestoreActionType.Database;
                restoreDB.Database = databaseName;
                BackupDeviceItem deviceItem = new BackupDeviceItem(backUpFile, DeviceType.Url);
                restoreDB.Devices.Add(deviceItem);
                restoreDB.ReplaceDatabase = true;
                if (!smoServer.Databases.Contains(databaseName)) {
                    Database db = new Database(smoServer, databaseName);
                    db.Create();
                }

                RelocateFile DataFile = new RelocateFile();
                string MDF = restoreDB.ReadFileList(smoServer).Rows[0][1].ToString();
                DataFile.LogicalFileName = restoreDB.ReadFileList(smoServer).Rows[0][0].ToString();
                DataFile.PhysicalFileName = smoServer.Databases[databaseName].FileGroups[0].Files[0].FileName;

                RelocateFile LogFile = new RelocateFile();
                string LDF = restoreDB.ReadFileList(smoServer).Rows[1][1].ToString();
                LogFile.LogicalFileName = restoreDB.ReadFileList(smoServer).Rows[1][0].ToString();
                LogFile.PhysicalFileName = smoServer.Databases[databaseName].LogFiles[0].FileName;

                restoreDB.RelocateFiles.Add(DataFile);
                restoreDB.RelocateFiles.Add(LogFile);
                restoreDB.NoRecovery = false;
                restoreDB.PercentComplete += new PercentCompleteEventHandler(rstDatabase_PercentComplete);
                restoreDB.Complete += new ServerMessageEventHandler(rstDatabase_Complete);
                restoreDB.SqlRestore(smoServer);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 2010-11-30
    • 1970-01-01
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    相关资源
    最近更新 更多