此代码在本地SQL Server Express实例上运行良好:
Dim thisSMOBackup As New Backup()
With thisSMOBackup
.Database = singleDatabase.Name 'This contains the database name
.Action = BackupActionType.Database
.Devices.AddDevice(DatabaseFileName, DeviceType.File)
.Incremental = False
.LogTruncation = BackupTruncateLogType.Truncate
End With
Try
thisSMOBackup.SqlBackup(thisServer) 'thisServer is setup w/ valid connection string and reads back data OK from the SQL server
System.IO.File.AppendAllText(logfileName, singleDatabase.Name & " - backed up")
Catch ex As Exception
System.IO.File.AppendAllText(logfileName, singleDatabase.Name & " - " & ex.InnerException.Message & vbCrLf)
End Try
当我将相同的代码应用于共享主机SQL Server时,它会产生以下内部异常错误消息:
无法打开备份设备' D:\ aFolderName \ aBackupName \ theDatabaseName.bak'。操作系统错误3(系统找不到指定的路径。)。 BACKUP DATABASE异常终止。
消息#:3201
似乎有不同的方式连接到服务器。对于SQL Server Express实例,我使用.ServerInstance
属性,对于我使用.ConnectionString
属性的托管服务器。这与SMO代码的运作方式有什么关系吗?
我已经读过共享SQL托管服务器可能有难以通过的限制,但在我放弃之前我想要求输入。
错误本身表明SMO无法找到写入文件的位置,但它就在那里,我将文件夹的安全性设置为" Everyone"用"完全控制"。但是,错误似乎并不总是意味着他们所说的。我想知道是否还需要设置其他参数才能使此操作成功,或者其他地方要查看。
答案 0 :(得分:1)
当您尝试在共享托管环境中创建备份时,备份文件将写入该远程服务器计算机的文件系统(不您的您自己的本地D:
驱动器!)您的SQL Server正在运行。
最有可能的是,远程运行SQL Server的用户帐户无权写入该目录。
另外:这是好事!毕竟,您不希望您不知道且无法控制的远程服务器计算机能够直接写入您自己的本地计算机 - 现在就可以了吗?
您可以做什么(特别是在企业环境中)是将备份写入 UNC路径(\\server\share\path
),其中远程SQL Server都是计算机具有写入权限,并且您至少具有读访问权限,因此您可以根据需要将.bak
文件复制到本地计算机。对于商业托管公司,这种选择很少存在,但是....