繁体   English   中英

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

[英]Generate backup and restore the SQL Database on LAN systems

我正在创建一个Windows桌面应用程序,但我陷入了需要SO开发人员指导的地步。

我的要求:

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

见下面的图片。

在此输入图像描述

我到底尝试了什么?

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

我面临的问题是什么?

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

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

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

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

任何与流程或任何参考相关的帮助将不胜感激。

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

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

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

如果可以满足所有先前条件,则可以从系统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\\的远程地址(显然在System C中 ),然后,从系统A中的应用程序,您可以在System C上执行以下命令:

RESTORE DATABASE [MyDataBaseCopy] FROM  DISK = N'D:\TEST\MyDataBase.bak' WITH  FILE = 1,  NOUNLOAD,  REPLACE,  STATS = 5

这两个命令都可以从SqlCommand实例中解析出来,一个与System B 连接 ,另一个与System 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服务帐户是托管服务帐户或域帐户,则可以将System C中的共享文件夹的写入权限授予SQL Server的服务帐户。 这被认为是最佳做法。
  2. 如果您的网络位于Windows域下,并且系统B中的 SQL Server服务帐户不是 托管服务帐户或域帐户,则可以将SQL Server的服务帐户设置为其中之一并继续执行选项1.这被认为是最佳选择。实践。
  3. 在任何其他情况下,如果您不介意将文件夹共享给每个人,那么这样做授予写访问权限。 在这种情况下,无论SQL Server运行何种帐户,您都不会遇到此解决方案的问题。 这不是最佳做法。

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

而不是备份和恢复,这听起来像是在尝试将数据库从一个服务器复制到另一个服务器。 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代理任务包裹。

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

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

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

暂无
暂无

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

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