远程数据库备份到本地(本地无数据库)

   

最近查了一下网上远程备份数据库的方法,好像还是个挺麻烦的事情。但是项目里必须加入这个模块,所以也只有死磕出一个了。最后总结出2个方案:

第一种方案,是我个人比较喜欢的方案:

首先用SqlDataAdapter将所有表加载到DataSet中,用DataSet类的写入XML方法,将所有的信息全部写入到XML中。

需要还原的时候,首先用SqlDataAdapter去查询加载数据库的内容,然后再读取DataSet,最后用SqlDataAdapter的update()就行了。

具体代码就不写了,这种方法很简单,用起来也方便。

 

 

第二种方案,是真正的备份数据库文件。

我们都知道,直接远程备份数据库并没有什么问题,但是备份文件只能在服务器上,通过什么传送到客户端是个难点。但是数据库有个功能是cmdshell,可以通过它向数据库所在的服务器发送DOS命令,直接操作服务器。呵呵,是不是很有黑客的味道?但是这种做法并不难,可以完全通过SQL语句来完成。

 

1.首先需要开启数据库的cmdshell功能:

EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;

好了,现在我们已经完全控制了服务器。如果服务器的登录用户名不允许操作服务器,你可以新建用户,提升权限

exec   xp_cmdshell 'net user mm 123 /add' --添加一用户
exec xp_cmdshell 'net localgroup administrators mm /add' --为用户添加管理员权限

 

2.在客户端建立一个共享文件夹。

3.服务器建立到共享文件夹的映射。

exec master..xp_cmdshell 'net use z: //客户端IP/共享文件夹的共享名 "客户端的WINDOWS登录密码" /user:服务器IP/客户端的WINDOWS用户名'

Z,就是映射名。如果不知道什么是映射,可以自己试着建一个。右键我的电脑,映射网络驱动器。随便映射到某个共享文件夹。这样在我的电脑里面,就会多一个"Z盘",进去后直接就是这个共享文件夹了。需要注意的是,这里涉及到一些网络方面的知识,比如你和服务器不在同一个域,建映射可能就会出问题。而数据库给你的提示总是很奇怪的,比如什么错误的用户名。

 

4.备份服务器上的数据库  with init覆盖 ¦ noinit添加

backup database 库名 to disk='C:/备份文件名.bak' with init

 

5.将备份文件拷贝到映射盘

exec master..xp_cmdshell 'copy C:/备份文件名.bak z:'

 

6.清除痕迹(黑客来过了,当然要清理痕迹啦)

--exec master..xp_cmdshell 'del C:/备份文件名.bak'   删除备份文件

--exec master..xp_cmdshell 'net use z: /delete'       删除映射

 

注意点:
需要注意的是,如果建立映射失败,或者删除映射失败,数据库只是返回一个失败原因,对于程序来说依然算“得到查询结果”,而不是返回异常。所以在用C#写代码的时候,不要用catch去捕获失败的操作。而是因为根据返回结果的值来判断。

 

 

再附上设置本地文件夹为共享的代码:

/// <summary>
        /// 设置文件夹共享
        /// </summary>
        /// <param name="FolderPath">文件夹路径</param>
        /// <param name="ShareName">共享名</param>
        /// <param name="Description">共享注释</param>
        /// <returns></returns>
        public int ShareNetFolder(string FolderPath, string ShareName, string Description)
        {

            try
            {
                ManagementClass managementClass = new ManagementClass("Win32_Share");
                // Create ManagementBaseObjects for in and out parameters
                ManagementBaseObject inParams = managementClass.GetMethodParameters("Create");
                ManagementBaseObject outParams;
                // Set the input parameters
                inParams["Description"] = Description;
                inParams["Name"] = ShareName;
                inParams["Path"] = FolderPath;
                inParams["Type"] = 0x0; // Disk Drive
                //Another Type:
                //        DISK_DRIVE = 0x0
                //        PRINT_QUEUE = 0x1
                //        DEVICE = 0x2
                //        IPC = 0x3
                //        DISK_DRIVE_ADMIN = 0x80000000
                //        PRINT_QUEUE_ADMIN = 0x80000001
                //        DEVICE_ADMIN = 0x80000002
                //        IPC_ADMIN = 0x8000003
                //inParams["MaximumAllowed"] = int maxConnectionsNum;
                // Invoke the method on the ManagementClass object
                outParams = managementClass.InvokeMethod("Create", inParams, null);
                // Check to see if the method invocation was successful
                if ((uint)(outParams.Properties["ReturnValue"].Value) != 0)
                {
                    throw new Exception("Unable to share directory.");
                }
            }
            catch
            {
                return -1;
            }
            return 0;
        }

 

 

/// <summary>
        /// 取消文件夹共享
        /// </summary>
        /// <param name="ShareName">文件夹的共享名</param>
        /// <returns></returns>
        public int CancelShareNetFolder(string ShareName)
        {
            try
            {
                SelectQuery selectQuery = new SelectQuery("Select * from Win32_Share Where Name = '" + ShareName + "'");
                ManagementObjectSearcher searcher = new ManagementObjectSearcher(selectQuery);
                foreach (ManagementObject mo in searcher.Get())
                {
                    mo.InvokeMethod("Delete", null, null);
                }
            }
            catch
            {
                return -1;
            }
            return 0;
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你想要将MyEclipse中的本地数据库远程数据库进行同步。可以按照以下步骤操作: 1. 首先,确保你已经有了本地数据库远程数据库的连接信息,包括数据库名称、用户名、密码、主机名和端口号。 2. 在MyEclipse中打开数据库视图。如果没有显示数据库视图,可以通过选择"Window"菜单下的"Show View",然后选择"Other"来找到并打开它。 3. 在数据库视图中,右键单击并选择"New Database Connection"来创建一个新的数据库连接。 4. 在弹出的对话框中,选择你使用的数据库类型(如MySQL、Oracle等),然后填写连接信息,包括数据库名称、用户名、密码、主机名和端口号。点击"Test Connection"按钮来测试连接是否成功。 5. 如果连接测试通过,点击"Finish"按钮来创建数据库连接。 6. 重复步骤3至5,创建远程数据库的连接。 7. 在数据库视图中,展开本地数据库连接和远程数据库连接,以查看它们的表、视图等对象。 8. 如果你希望将本地数据库中的表同步到远程数据库中,可以选择本地数据库中的表,在右键菜单中选择"Copy to...",然后选择远程数据库连接来进行同步操作。 9. 同样地,如果你希望将远程数据库中的表同步到本地数据库中,可以选择远程数据库中的表,在右键菜单中选择"Copy to...",然后选择本地数据库连接来进行同步操作。 请注意,同步操作可能会导致数据的添加、更新或删除,请在执行操作前进行备份以防止数据丢失。此外,根据你使用的数据库类型和版本,具体的操作步骤可能会有所不同。建议你参考相关数据库的文档或官方网站获取更详细的指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值