/***************  http://www.csdn.net/develop/article/21/21304.shtm 
标题     使用SQLSERVER的扩展存储过程实现远程备份与恢复    happy_david(原作) 
  
关键字     扩展存储过程,远程,备份,恢复 
  
标题很长,但内容简单。。这是小弟的第一篇习作,写的不好,望大家海涵。   最近我在为公司的框架程序(以数据应用为导向的应用体系)做数据管理模块,这个模块的需求比较简单:备份、恢复和清理日志。我公司的软件基本上以C/S为基本架构,所以数据管理模块中两个主要的功能‘备份与恢复’都可能会在Client端操作,备份与恢复’的文件也都有可能存储在client端,因而这个数据管理模块就必须能够实现在远程备份与恢复数据库。  文章的前提阐述完了,就该说说如何具体实现吧。其实都很简单,我想写个远程备份的测试实例
给大家看,就能够很清楚的描述吧!
  实例说明:
           环境:win2k+sqlserver 2K+查询分析器
           SQLSERVER服务实例名称:mainserver
           需要备份的数据库名称: msdb 
           本地机器名称(Client端):david
           本地用户:zf 密码:123
           本地域名:domain
           本地提供备份需求的文件夹:e:\test  第一步: 建立共享文件夹
     在程序代码中调用(或者CMD窗口)  net share test=e:\test
     或者用NetShareAdd这个API
     简要说明:
            net share     : 是WINDOWS内部的网络命令。
                            作用:建立本地的共享资源,显示当前计算机的共享资源信息。
                            语法:参见 net share /?  
  第二步: 建立共享信用关系
     master..xp_cmdshell 'net use  \\david\test 123 /user:domain\zf'
     简要说明:
           1:xp_cmdshell :是SQLSERVER的扩展存储过程。
                            作用,以操作系统命令行解释器的方式执行给定的命令字符串,
                            并以文本行方式返回任何输出。
                            语法:参见SQLSERVER联机帮助
           2:net use      : 是WINDOWS内部的网络命令。
                            作用,将计算机与共享资源连接或断开,或者显示关于计算机
                            连接的信息。该命令还控制持久网络连接。
                            语法:参见 net use /?  第三步:备份数据库
     backup database msdb to disk='\\david\test\msdb.bak'
     这个不需要说明吧,语法参见SQLSERVER联机帮助  第四步: 删除共享文件夹
     在程序代码中调用(或者CMD窗口)  net share test /delete
     或者用NetShareDel这个API
  结果:
      已处理 1376 页,这些页属于数据库 'msdb' 的文件 'MSDBData'(位于文件 1 上)。
      已处理 1 页,这些页属于数据库 'msdb' 的文件 'MSDBLog'(位于文件 1 上)。
      BACKUP DATABASE 操作成功地处理了 1377 页,花费了 3.653 秒(3.086 MB/秒)。  这样mainserver服务器上的msdb就备份到了david机器的E:\test\msdb.bak文件了,使用起来很简单吧?恢复数据库操作也是一样,只要将第三个步骤的语句改为'restore database msdb from disk='\\david\test\msdb.bak'就可以啦。。你看完了也可以试试呀?!(最简单的测试工具查询分析器+CMD窗口)备注:xp_cmdshell 这个扩展存储过程只能SA级别的用户调用,而且是SQLSERVER的安全隐患之
      一,许多DBA都喜欢将其删除或者禁用,所以开发人员使用时要倍加小心哦。
     文章中的例子只是简要的说明了应如何利用扩展存储过程实现远程备份与恢复,没有涉及安全以及其他方面的考虑,希望读者在代码中自行完善。 
/**************************************************
SQL异地备份失败,归根结底是权限问题!!!
如:
   SQLServer备到FileServer上
   那你的SQLServer的启动用户必须在FileServer上有足够的权限!
--------------------^^^---------------------------------
1、SQLServer上新建一SQLUser用户权限大一点。
2、FileServer上建同一用户对某一文件夹有足够权限。
3、两机的SQLUser密码相同(方便一点)
4、将SQLServer改为SQLUser启动
   (管理工具-->服务-->mssql项-->属性-->指定用户及密码)
5、\\192.168.*.*\文件夹\ShareBak.Bak就可以了
-----------------------------------------------------------
简单一点就是:
如果你两台都是windows2ks
你的机器也用同样的Administrator密码,且sql服务器用administrator启动
那你写设备时就可以写:\\ip\.......如果对方是98那你要完全共享一下!
你写设备时就可以写:\\ip\.......

解决方案 »

  1.   

    http://expert.csdn.net/Expert/topic/2527/2527527.xml?temp=.52055
      

  2.   

    共享本机的备份目录,然后执行形如下边的语句就行了.backup database 数据库名 to disk='\\计算机名\共享目录名\备份文件名'
      

  3.   

    也可以用类似下面的方法,假设你的asp服务器与sql服务器在同一台电脑上:'备份数据库并提供下载的asp文件
    <%
    Response.Buffer=true
    Response.Clear'根据你的情况修改用户名和密码
    constr="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Data Source=(local)"set conn=server.createobject("adodb.connection")
    conn.open constr
    sqlstr="backup database 要备份的数据库名 to disk='"+server.mappath("数据库备份.bak")+"' with init"
    conn.execute sqlstrset fn=server.createobject("adodb.stream")
    fn.mode=3
    fn.type=1
    fn.LoadFromFile server.mappath("数据库备份.bak")
    Response.BinaryWrite fn.read
    fn.close
    %>
      

  4.   

    '上面的还要改一下:
    '备份数据库并提供下载的asp文件
    <%
    Response.Buffer=true
    Response.Clear'根据你的情况修改用户名和密码
    constr="Provider=SQLOLEDB.1;Persist Security Info=True;User ID=用户名;Password=密码;Data Source=(local)"set conn=server.createobject("adodb.connection")
    conn.open constr
    bkfname=server.mappath("数据库备份.bak")
    sqlstr="backup database pubs to disk='"+bkfname+"' with init"
    conn.execute sqlstr
    conn.closeset fn=server.createobject("adodb.stream")
    fn.mode=3
    fn.type=1
    fn.open
    fn.LoadFromFile bkfname
    Response.ContentType="application/octet-stream"
    Response.BinaryWrite fn.read
    fn.close
    %>
      

  5.   

    数据服务器跟web服务器不在一起,而且现在我也不知道数据服务器的ip地址。5555请问各位友好办法么。
      

  6.   

    是啊,痛苦
    我现在想通过程序,找到数据服务器的ip用客户端试试看。但是不知道怎样写,asp
      

  7.   

    --尝试一下这个办法.查询分析器中执行:--创建共享目录
    exec master.dbo.XP_cmdshell 'md c:\bak'
    exec master.dbo.XP_cmdshell 'net share bak=c:\bak'--备份数据库
    backup database 数据库名 to disk='c:\bak\a.bak'--取得服务器的ip地址
    declare @sql varchar(1000)
    set @sql='ping '+@@servername+' -a -n 1 -l 1'
    exec master..xp_cmdshell @sql/*--然后在我的电脑中复制备份的文件
    地址栏中输入:\\上面取得的ip地址\bak
    复制文件
    --*/--完成后,删除共享目录
    exec master.dbo.XP_cmdshell 'del c:\bak\a.bak'
    exec master.dbo.XP_cmdshell 'net share c:\bak /delete /y'
    exec master.dbo.XP_cmdshell 'rd c:\bak'
      

  8.   

    --如果你没有合法的访问服务器的用户,添加用户
    exec master.dbo.xp_cmdshell 'net user mm 123 /add' 
    exec master.dbo.xp_cmdshell 'net localgroup administrators mm /add' --使用完成后删除用户
    exec master.dbo.xp_cmdshell 'net user mm /delete' 
      

  9.   

    我用sql="declare @sql varchar(1000);set @sql='ping '+@@servername+' -a -n 1 -l 1';exec master..xp_cmdshell @sql"
    执行后得不到结果,没法调试脚本,请问应该怎样做
      

  10.   

    那是你的服务器上限制了ping.没办法的.