在LAN系统上生成备份和还原SQL数据库

时间:2017-12-22 09:54:49

标签: c# sql-server winforms

我正在创建一个Windows桌面应用程序,但我仍然需要SO开发人员的指导。

我的要求:

我的主要要求是创建一个可以将一个系统的数据库复制到另一个系统的Windows窗体应用程序。

见下文。

enter image description here

我到底尝试了什么?

我成功创建备份文件并使用C#在本地系统中恢复它,但现在它只适用于本地系统(系统A )。

我面临哪些问题?

我想用C#实现这一点。 我可以使用共享文件夹处理所有这些,但不建议这样做。

  1. 如何访问在另一个LAN系统中生成的备份,因为我们永远无法访问其他系统的目录。我想我可以使用共享文件夹来完成它,但有没有其他方法可以复制备份文件并将其存储在运行我的应用程序的系统中。

  2. 如何将备份文件还原到其他LAN系统。据我所知,SQL没有权限从外部本地目录恢复数据库。

  3.   

    有没有其他方法可以实现这种(复制数据库)功能?

    任何与流程或任何参考相关的帮助都将受到赞赏。

4 个答案:

答案 0 :(得分:5)

您可以将数据库备份创建到远程位置。例如,系统B 将在 System C 的共享文件夹中创建备份。然后,您可以在 System C 上恢复备份。您也可以反过来这样做,在系统B 上创建共享文件夹,在此文件夹中创建备份,并从远程位置恢复 System C 上的备份。

考虑到你想要完成的事情的性质,我假设如下:

  1. 系统A 上运行应用程序的用户帐户有足够的权限来访问系统B 系统C 中的两个SQL Server实例。
  2. 如果遵循recommendations,则使用Windows身份验证模式创建SQL Server Logins。如果是这种情况,那么系统A 中的应用程序将使用运行该应用程序的用户帐户向两台服务器进行身份验证。
  3. 应在 System C 上创建共享文件夹。为了举例,我们可以将D:\TEST\分享为\\SYSTEM C\TEST\
  4. 系统A 上运行应用程序的用户帐户应获得足够的优惠,以便从 System C
  5. 访问和写入共享文件夹

    如果可以满足所有先前的条件,那么从系统A 中的应用程序,您可以在系统B 上执行以下命令:

    BACKUP DATABASE [MyDataBase] TO  DISK = N'\\SYSTEM C\TEST\MyDataBase.bak' WITH NOFORMAT, INIT,  NAME = N'MyDataBase-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    

    假设\\SYSTEM C\TEST\D:\TEST\的远程地址(显然在系统C 中),那么,从系统A 中的应用程序,您可以在 System C

    上执行以下命令
    RESTORE DATABASE [MyDataBaseCopy] FROM  DISK = N'D:\TEST\MyDataBase.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5
    

    这两个命令都可以从SqlCommand个实例,一个connection系统B ,另一个与系统C 连接

    希望它有所帮助。

    编辑1

    感谢@ PMF的评论指出,可能存在这样的情况,即该解决方案不起作用。如果你遇到这种错误:

    Msg 3201, Level 16, State 1, Line 1
    Cannot open backup device '\\SYSTEM C\TEST\MyDataBase.bak. Operating system error 5(Access is denied.).
    

    根据您的方案,您可以尝试以下选项之一:

    1. 如果您的网络位于Windows域下且系统B 中的SQL Server服务帐户是managed service account或域帐户,则您可以在<共享文件夹中授予写入权限< strong> System C 到SQL Server的服务帐户。这被认为是最佳做法。
    2. 如果您的网络位于Windows域下且系统B 中的SQL Server服务帐户 managed service account或域帐户,则可以设置SQL Server的服务帐户是其中之一并继续执行选项1.这被认为是最佳实践。
    3. 在任何其他情况下,如果您不介意将文件夹共享给所有人,请执行此操作以授予写入权限。在这种情况下,无论SQL Server运行何种帐户,您都不会遇到此解决方案的问题。这不是最佳做法。

答案 1 :(得分:2)

如果您运行的帐户无法访问这些计算机,但您有另一个管理员帐户...您可以使用模拟(模拟更高权限的帐户)和管理员共享(例如\ servername \ c $来访问一台机器驱动器。我之前使用过这个模拟类...调用其中的更高权限方法https://www.codeproject.com/Articles/10090/A-small-C-Class-for-impersonating-a-User

答案 2 :(得分:2)

而不是备份和恢复,听起来你正试图将数据库从一个服务器复制到另一个服务器。 MSDN上有一个关于如何使用多个选项的完整链接。

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/f5ee85c7-c9d3-438e-a835-daa2c785026b/copy-sql-database-tables-to-another-sql-server?forum=sqlgetstarted

您可以考虑在SSIS中构建转移过程(以及您可能希望包括的任何其他步骤,例如数据清理和其他准备工作),然后从您的应用程序本地调用该SSIS包或让应用程序调用SQL代理执行包的任务。

答案 3 :(得分:1)

我的第一直觉当有人说'#34;我想在C#中复制数据库&#34;是:那是95%的可支持性错误的轨道。在DB或OS层中执行此操作。试图在C#中实现这一目标只会增加一大堆开销和可能出错的东西。

它认为你最终想要的是系统C有一个系统B的副本。数据库的术语是复制。特别是如果您希望系统C成为备份数据库,如果系统B出现故障,则最好采用正确的复制/集群方法。 https://en.wikipedia.org/wiki/Replication_(computing)#Database_replication

大多数商业DBMS甚至都支持这种东西,你最好只使用它。 如果你不能使用那些:祝你好运。