繁体   English   中英

如何使用C#从Azure存储容器还原数据库

[英]How to restore database from azure storage container using c#

我们有一个天蓝色的存储容器,每天我们都在其中保存数据库备份文件。 现在,我们正在开发使用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存储容器中还原备份文件,或者我的代码有什么问题?

我发现了问题。 SQL Server 2012或更早版本不支持从块Blob还原数据库。 因此,我将SQL Server更新为SQL Server 2017,还更改了代码。 您需要在SQL Server中创建凭据,从天蓝色还原时将使用该凭据。

                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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM