精华内容
下载资源
问答
  • SQL数据库备份与恢复

    2011-08-15 14:50:59
    SQL数据库备份与恢复 数据库备份 手动备份数据库与恢复数据库
  • C#实现SQL数据库备份与恢复
  • SQL数据库备份与恢复器 v1.0
  • oracle与sql数据库备份与恢复工具

    热门讨论 2013-08-05 17:30:01
    oracle与sql数据库备份与恢复工具
  • C#实现SQL数据库备份与恢复.txt
  • SQl数据库备份与恢复

    2010-01-24 14:40:47
    [code="java"] “备份”是数据的副本,用于在系统发生故障后还原和恢复数据。备份使您能够在发生故障后还原数据。通过适当的备份,可以从多种故障中恢复,包括: ...要备份数据库的名...

    “备份”是数据的副本,用于在系统发生故障后还原和恢复数据。备份使您能够在发生故障后还原数据。通过适当的备份,可以从多种故障中恢复,包括:
    媒体故障。
    用户错误(例如,误删除了某个表)。
    硬件故障(例如,磁盘驱动器损坏或服务器报废)。
    自然灾难。

    创建完整备份:
    执行 BACKUP DATABASE 语句来创建完整备份,同时指定:
    要备份的数据库的名称。
    写入完整备份的备份设备

    BACKUP DATABASE stuinfo
    TO DISK='D:\backup\stuinfo.bak'

    完整还原数据库
    RESTORE DATABASE stuinfo FROM DISK='D:\backup\stuinfo.bak'


    展开全文
  • 数据库恢复工具,自动备份恢复数据库,方便实用!
  • SQL 数据库备份与恢复模型

    千次阅读 2007-11-06 11:38:00
    恢复模型: SQL SERVER有3个恢复模型,简单恢复,完全恢复和大容量日志恢复,每个模型各有自己的特点,也适用于不同的企业备份需求,模型之间可以相互切换,这也是个比较容易出问题的地方 简单恢复: 就 像其名字...

    恢复模型:
    SQL SERVER
    3个恢复模型,简单恢复,完全恢复和大容量日志恢复,每个模型各有自己的特点,也适用于不同的企业备份需求,模型之间可以相互切换,这也是个比较容易出问题的地方

    简单恢复:
    像其名字一样,这种恢复模型是最简单的,他只支持数据库完整备份和差异备份,另外对于节省日志文件空间也有很好的支持,因为在检查点处会自动截断日志,所 以日志文件几乎不会增长,但提交较大的事务时情况令当别论,由于备份能力有限,其风险指数也是很高的,如果数据库损坏,只能恢复到上次完整备份或最后一次 差异备份,对于后面的事务处理就无能为力了,准确一点应该是非活动的事务日志都被删除了
       
    大容量日志恢复:
    这个模型很像后面 将提到的完全恢复,但还是有很多不同,他支持数据库完整,差异和日志备份,对于诸如SELECT INTOBULK INSERT,BCP等操作大容量的日志操作提供了性能上的优化,在完全恢复模式下,日志会记录上述操作的具体细节,而本模式中只会在日志中记载有这么一 回事,具体细节忽略不计,这样存储速度就有很大提高,也节约了日志空间,问题也就出现了,由于日志记录中包含有忽略细节的最小日志更改,所以大容量恢复模 型不支持具体时间点的恢复,也就是说不能在restore log中指定stopat子句,下面是操作和出错信息

    /*
    大容量日志恢复模型
    restore database chj733 from disk = 'e:chj733_dat.bck' with norecovery
    go
    restore log chj733 from disk = 'e:chj733_log.bck' with file = 1,stopat = '2004-11-09 15:06:04.810',recovery
    go
    已处理 2016 页,这些页属于数据库 'chj733' 的文件 'chj733'(位于文件 1 上)。
    已处理 1 页,这些页属于数据库 'chj733' 的文件 'chj733_log'(位于文件 1 上)。
    RESTORE DATABASE
    操作成功地处理了 2017 页,花费了 3.687 秒(4.479 MB/秒)。
    服务器: 消息 4327,级别 16,状态 1,行 1
    此备份集中的日志包含最小日志记录更改。禁止进行时点恢复。RESTORE 将前滚到日志的结尾,而不恢复数据库。
    已处理 7152 页,这些页属于数据库 'chj733' 的文件 'chj733'(位于文件 1 上)。
    已处理 1736 页,这些页属于数据库 'chj733' 的文件 'chj733_log'(位于文件 1 上)。
    RESTORE LOG
    操作成功地处理了 8888 页,花费了 6.668 秒(10.919 MB/秒)。
    */
    时在大容量日志模式下备份事务日志需要访问数据文件,而很多灾难发生后基本上数据文件就没法访问了,所以采用这种模式时你的防着这一点,很有可能你会丢失 自上次事务备份以后所有的数据,一般可以在准备进行大量数据装载或建立比较庞大的索引时将模型切换到大容量日志方式,操作完成后在切换回完全模式。

    完全恢复:
    种模式风险是最小的,联机帮助上宣称这种模式可以将数据库恢复到任何即时点,理论上可以将数据丢失的可能性减至0(事实上并非如此),上述两个模型中打 NO的在这里基本上可以打YES,他支持所有的备份和恢复方式,支持指定即时点,日志对BCP等大数据装载操作有详细记载,等等,这些特性也引发了一些问 题,日志文件开销较大,需要频繁转存日志

    恢复模型就讲到这,大家可以试着用BCP加载一些数据看看,在各个模式下观察下日志文件的大小变 化是不是符合上面的说法,做之前最好先压缩下日志文件,如果日志文件里面有足够的空间,你加载的数据份量又不够的话,你会看不到文件的变化的

    备份类型:
    先抛开文件备份,SQL SERVER3种备份类型,完整备份,差异备份,日志备份,你必须先明白每种备份从哪里开始,从哪里结束,他里面的内容是什么

    完整备份是数据库的一个完整拷贝,包括事务日志,数据库中的所有对象,等等

    差异备份从上次完整备份之后开始,创建所有修改页的拷贝,注意,他是从上次完整备份后开始的,所以应用差异备份时只需最后的一次备份,而不是逐个应用所有的差异备份,当然你有这个闲功夫,也可以这么干

    日志备份是备份上次日志备份后所有的事务记录,记住,不是上次完整备份。在应用事务日志备份时将前滚所有的事务记录,并且这些记录应该是连续的,另外也会回滚没有COMMIT的日志记录
       
    这些老掉牙的话应该好好的理解,最起码在面试的时候应该很流利的背出来,下面看一个比较常见的错误。

    问题1
    /*
    服务器: 消息 4305,级别 16,状态 1,行 2
    此备份集中的日志开始于 LSN 641000000005900001,该 LSN 太晚,无法应用到数据 库。包含 LSN 641000000005600001 的较早的日志备份可以还原。
    服务器: 消息 3013,级别 16,状态 1,行 2
    RESTORE LOG
    操作异常终止。
    */


    信这个信息只要是做过备份的人都知道,在应用完整备份+日志备份恢复数据库时提示只能应用数据库备份,而日志备份由于LSN太早或太晚无法应用,这是怎么 回事阿???LSN表示事务日志记录的唯一序号,SQL SERVER会记录对数据库的每次操作,这些操作总有个先来后到的,LSN就是系统发给他们的顺序号,日志备份恢复时要求所有的备份集叠加时能生成一个连 续的LSN链,这个就是问题所在(如果对上述日志概念不了解的话可以阅读精华区SQL日志概念这一篇,或是看BOL)。查看下备份文件就可以知道答案


    restore headeronly from disk = 'e:chj733_dat.bck'  ――
    数据库备份
    restore headeronly from disk = 'e:chj733_log.bck'  ――
    日志备份
    结果(我只列出了比较有用的几项)
    ―――――――――――――――――――――――――――――――――――――
    Position              FirstLsn                   LastLsn
      1           641000000005400001        641000000005600001   ――
    数据备份
      1           641000000005900001        641000000006100001   ――
    日志备份
    ―――――――――――――――――――――――――――――――――――――

    position 表示这个设备中备份集的位置,不是可以在一个设备里多次备份的吗?每备份一次就生成一个备份集,按先后顺序一直排列下来,Position就可以定位你想 应用那个备份集,对应于restore中的with file的值,这里我只备份了一次,所以就只有一个集。


    FirstLsn
    LastLsn:分别标识这个备份集中的起始事务链号和终止事务链号


    你运用这两个备份还原数据库时,系统会读取备份集的头信息,判断这些链号是不是连续的,很显然数据备份最后的是641000000005600001,日 志开头的是641000000005900001,中间差了一截,所以从这个以后的所有日志备份都不能运用了,就像火车车厢一样,前面断了,你后面连得再 好也跑不起来,你会发现有时候日志的FirstLsn会小于数据的LastLsn,这个也征实了日志备份是从上次日志备份结尾处开始的说法,但日志备份的 LastLsn不能小于数据备份的LastLsn。

    一般容易出现像这种日志脱节的操作是切换恢复模型,从简单切换到完全恢复,很多新手都是这样,数 据库建好了用了几天,做个完整备份,然后在做日志备份,结果报错说简单模型不能做日志备份,于是切换到完全模型继续日志备份,这样日志链就脱节了,解决方 法是备份后用restore headeronly查看下日志链是否完整,不完整的话需要重做完整备份或差异备份,再继续日志备份,如果到数据库出现故障时再检查,那就太晚了。

    这应该比较细的东西了,没有真正做过又怎会知道里面的来龙去脉呢?记得公司有个同事曾对我说:备份很简单阿,就是几条load语句 嘛,记住就搞定啦我从不说备份很难,但我敢肯定,叫他来做备份,不哭爹喊娘才怪!!!另外如果你只是在像pubs这种只有50M的数据库上非常流畅的运 行了上面所说的各种语句的话,你就可以对大家说你会写备份语句,但不要说你会备份,遇到一个900G的数据库,情况就大不一样了,就像打星际一样,掌握 如何造兵,是怎么个顺序,每个兵的攻击范围很容易,但如何在短时间既要侦察敌情,防止敌人骚扰,又要造出数量可观的兵种,灵活搭配应付各种各样的战争场面 就难了

    最后的话题:
    也许有人对恢复语句后面的with file子句不大理解,或是对于备份集,家族成员,媒体集这些概念混淆不清,其实这些概念不需要记住,你只要知道备份是以什么个形式存在就可以了,当备份 到一个设备上时,可以追加备份,也可以覆盖以前的备份,每追加一次,这个设备上的文件就多了一个,这个文件就是说说的备份集,with file = 2就标识你要应用这个设备上的第二个备份集来还原数据库,查看备份集信息可以使用restore headeronly from device_name命令,有时候你可能为了加快备份执行速度,将数据库备份到多个设备上(比如磁带机或不同的物理磁盘),利用并行写入来提高IO ,:

    Backup database chj733 to disk = ‘c:data_bck1.bck’,disk = ‘i:data_bck2.bck’
    这样两个设备在一起就组成了一个媒体集,每个设备称为集内的家族成员,他们就是一个整体了,每次恢复和转存时必须使用所有家族成员,下面的出错信息大家应该明白是怎么回事


    /*
    加载数据库
    Restore database chj733 from disk = ‘c:data_back1.bck’
    服务器: 消息 3132,级别 16,状态 1,行 1
    数据库 ‘chj733 ‘ 的媒体集有 2 个家族成员,但只提供了 1 个。必须提供所有的成员。
    服务器: 消息 3013,级别 16,状态 1,行 1
    RESTORE DATABASE
    操作异常终止。
    */

    /*转存数据库
    Backup database chj733 to disk = ‘c:data_back1.bck’
    服务器: 消息 3132,级别 16,状态 1,行 1
    数据库 'chj733' 的媒体集有 2 个家族成员,但只提供了 1 个。必须提供所有的成员。
    服务器: 消息 3013,级别 16,状态 1,行 1
    BACKUP DATABASE
    操作异常终止。
    */

    看媒体集信息可使用restore labelonly from device_name命令,如果你选择用多个家族成员的媒体集来备份数据库,你就得保证每个成员的安全,任何一个成员的丢失都将导致整个备份的失败, 果你想让某个设备从媒体集退出,再重新做别的备份,基本上只有利用format重写所有的媒体头,具体实现可以参考BOLbackup语句的with format,init,skip子句,注意他们之间的相互搭配

     
    展开全文
  • if exists(select * from sysobjectswhere name='pr_backup_db' and xtype='p')begindrop proc pr_backup_dbend go /*备份数据库*/create proc pr_backup_db@flag varchar(10) out,@backup_db_name varchar(128),@...

    if exists(
    select * from sysobjects
    where name='pr_backup_db' and xtype='p'
    )
    begin
    drop proc pr_backup_db
    end

    go

    /*备份数据库*/
    create proc pr_backup_db
    @flag varchar(10) out,
    @backup_db_name varchar(128),
    @filename varchar(1000) --路径+文件名字
    as
    declare @sql nvarchar(4000),@par nvarchar(1000)
    select @par='@filename varchar(1000)'
    select @sql='BACKUP DATABASE '+@backup_db_name+' to disk=@filename with init'
    execute sp_executesql @sql,@par,@filename
    select @flag='ok'
    go


    if exists(
    select * from sysobjects
    where name='fn_GetFilePath' and xtype='fn'
    )
    begin
    drop function fn_GetFilePath
    end
    go

    /*创建函数,得到文件得路径*/
    create function fn_GetFilePath(@filename nvarchar(260))
    returns nvarchar(260)
    as
    begin
    declare @file_path nvarchar(260)
    declare @filename_reverse nvarchar(260)
    select @filename_reverse=reverse(@filename)
    select @file_path=substring(@filename,1,len(@filename)+1-charindex('\',@filename_reverse))
    return @file_path
    end

    go


    if exists(
    select * from sysobjects
    where name='pr_restore_db' and xtype='p'
    )
    begin
    drop proc pr_restore_db
    end
    go

    create proc pr_restore_db /*恢复数据库*/
    @flag varchar(20) out, /*过程运行的状态标志,是输入参数*/
    @restore_db_name nvarchar(128), /*要恢复的数据名字*/
    @filename nvarchar(260) /*备份文件存放的路径+备份文件名字*/
    as
    declare @proc_result tinyint /*返回系统存储过程xp_cmdshell运行结果*/
    declare @loop_time smallint /*循环次数*/
    declare @max_ids smallint /*@tem表的ids列最大数*/
    declare @file_bak_path nvarchar(260) /*原数据库存放路径*/
    declare @flag_file bit /*文件存放标志*/
    declare @master_path nvarchar(260) /*数据库master文件路径*/
    declare @sql nvarchar(4000),@par nvarchar(1000)
    declare @sql_sub nvarchar(4000)
    declare @sql_cmd nvarchar(4000)
    /*
    判断参数@filename文件格式合法性,以防止用户输入类似d: 或者 c:\a\ 等非法文件名
    参数@filename里面必须有'\'并且不以'\'结尾
    */
    if right(@filename,1)<>'\' and charindex('\',@filename)<>0
    begin
    select @sql_cmd='dir '+@filename
    EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
    IF (@proc_result<>0) /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
    begin
    select @flag='not exist' /*备份文件不存在*/
    return /*退出过程*/
    end
    /*创建临时表,保存由备份集内包含的数据库和日志文件列表组成的结果集*/
    create table #tem(
    LogicalName nvarchar(128), /*文件的逻辑名称*/
    PhysicalName nvarchar(260) , /*文件的物理名称或操作系统名称*/
    Type char(1), /*数据文件 (D) 或日志文件 (L)*/
    FileGroupName nvarchar(128), /*包含文件的文件组名称*/
    [Size] numeric(20,0), /*当前大小(以字节为单位)*/
    [MaxSize] numeric(20,0) /*允许的最大大小(以字节为单位)*/
    )
    /*
    创建表变量,表结构与临时表基本一样
    就是多了两列,
    列ids(自增编号列),
    列file_path,存放文件的路径
    */
    declare @tem table(
    ids smallint identity, /*自增编号列*/
    LogicalName nvarchar(128),
    PhysicalName nvarchar(260),
    File_path nvarchar(260),
    Type char(1),
    FileGroupName nvarchar(128)
    )
    insert into #tem
    execute('restore filelistonly from disk='''+@filename+'''')
    /*将临时表导入表变量中,并且计算出相应得路径*/
    insert into @tem(LogicalName,PhysicalName,File_path,Type,FileGroupName)
    select LogicalName,PhysicalName,dbo.fn_GetFilePath(PhysicalName),Type,FileGroupName
    from #tem
    if @@rowcount>0
    begin
    drop table #tem
    end
    select @loop_time=1
    select @max_ids=max(ids) /*@tem表的ids列最大数*/
    from @tem
    while @loop_time<=@max_ids
    begin
    select @file_bak_path=file_path
    from @tem where ids=@loop_time
    select @sql_cmd='dir '+@file_bak_path
    EXEC @proc_result = master..xp_cmdshell @sql_cmd,no_output
    /*系统存储过程xp_cmdshell返回代码值:0(成功)或1(失败)*/
    IF (@proc_result<>0)
    select @loop_time=@loop_time+1
    else
    BREAK /*没有找到备份前数据文件原有存放路径,退出循环*/
    end
    select @master_path=''
    if @loop_time>@max_ids
    select @flag_file=1 /*备份前数据文件原有存放路径存在*/
    else
    begin
    select @flag_file=0 /*备份前数据文件原有存放路径不存在*/
    select @master_path=dbo.fn_GetFilePath(filename)
    from master..sysdatabases where name='master'
    end
    select @sql_sub=''
    /*type='d'是数据文件,type='l'是日志文件 */
    /*@flag_file=1时新的数据库文件还是存放在原来路径,否则存放路径和master数据库路径一样*/
    select @sql_sub=@sql_sub+'move '''+LogicalName+''' to '''
    +case type
    when 'd' then case @flag_file
    when 1 then File_path
    else @master_path
    end
    when 'l' then case @flag_file
    when 1 then File_path
    else @master_path
    end
    end
    +case type
    when 'd' then @restore_db_name+'_'+LogicalName+'_data.mdf'','
    when 'l' then @restore_db_name+'_'+LogicalName+'_log.ldf'','
    end
    from @tem
    select @sql='RESTORE DATABASE @db_name FROM DISK=@filename with '
    select @sql=@sql+@sql_sub+'replace'
    select @par='@db_name nvarchar(128),@filename nvarchar(260)'
    print @sql
    execute sp_executesql @sql,@par,@db_name=@restore_db_name,@filename=@filename
    select @flag='ok' /*操作成功*/
    end
    else
    begin
    SELECT @flag='file type error' /*参数@filename输入格式错误*/
    end

     


    --备份数据库test_database
    declare @fl varchar(10)
    execute pr_backup_db @fl out,'test_database','c:\test_database.bak'
    select @fl

    --恢复数据库,输入的参数错误
    declare @fl varchar(20)
    exec pr_restore_db @fl out,'sa','c:\'
    select @fl


    --恢复数据库,即创建数据库test_database的复本test_db
    declare @fl varchar(20)
    exec pr_restore_db @fl out,'test_db','c:\test_database.bak'
    select @fl

    转载于:https://www.cnblogs.com/tonybinlj/archive/2009/04/03/1428885.html

    展开全文
  • 通过执行Sql语句来实现注意,用Sql语句实现备份与还原操作时,最好不要使用需要备份或还原的数据库连接,而使用master,否则可能会出现如下三个问题:(1)超时时间已到。在操作完成之前超时时间已过或服务器未响应。...

    有两种方法,都是保存为.bak文件。一种是直接用Sql语句执行,另一种是通过引用SQL Server的SQLDMO组件来实现:

     1.通过执行Sql语句来实现
    注意,用Sql语句实现备份与还原操作时,最好不要使用需要备份或还原的数据库连接,而使用master,否则可能会出现如下三个问题:(1)超时时间已到。在操作完成之前超时时间已过或服务器未响应。(2)  在向服务器发送请求时发生传输级错误。(provider:共享内存提供程序,error:0-系统无法打开文件。)  (3)从服务器接收结果时发生传输级错误。(provider:共享内存提供程序,error:0   -   系统无法打开文件。) ,如果一定要用这个连接的话,要注意在执行Sql语句前加个Sql语句:use master,这样可能会解决以上问题。
         (1)数据备份语句:backup database  数据库名 to disk='保存路径/dbName.bak'
         (2)数据恢复语句:restore database 数据库名 from disk='保存路径/dbName.bak'   WITH MOVE 'dbName_Data' TO 'c:/tcomcrm20041217.mdf', --数据文件还原后存放的新位置
    MOVE 'dbName_Log' TO 'c:/comcrm20041217.ldf' ----日志文件还原后存放的新位置
    关于这两个语句还有更详细的介绍:http://blog.csdn.net/holyrong/archive/2007/08/29/1764105.aspx
                //数据库备份与恢复实例
                private void btnBak_Click(object sender, EventArgs e) //备份
            {
                string saveAway = this.tbxBakLoad.Text.ToString().Trim();
                string cmdText = @"backup database " + System.Configuration.ConfigurationSettings.AppSettings["dbName"] + " to disk='" + saveAway + "'";
                BakReductSql(cmdText,true);            
            }
            private void btnReduct_Click(object sender, EventArgs e)  //恢复
            {
                string openAway = this.tbxReductLoad.Text.ToString().Trim();//读取文件的路径
                string cmdText = @"restore database " + System.Configuration.ConfigurationSettings.AppSettings["dbName"] + " from disk='" + openAway + "'";           
                BakReductSql(cmdText,false);
            }
            /// <summary>
            /// 对数据库的备份和恢复操作,Sql语句实现
            /// </summary>
            /// <param name="cmdText">实现备份或恢复的Sql语句</param>
            /// <param name="isBak">该操作是否为备份操作,是为true否,为false</param>
            private void BakReductSql(string cmdText,bool isBak)
            {
                SqlCommand cmdBakRst = new SqlCommand();
                SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=master;uid=sa;pwd=;");
                try
                {
                    conn.Open();
                    cmdBakRst.Connection = conn;
                    cmdBakRst.CommandType = CommandType.Text;
                    if (!isBak)     //如果是恢复操作
                    {
                        string setOffline = "Alter database GroupMessage Set Offline With rollback immediate ";
                        string setOnline = " Alter database GroupMessage Set Online With Rollback immediate";
                        cmdBakRst.CommandText = setOffline + cmdText + setOnline;
                    }
                    else
                    {
                        cmdBakRst.CommandText = cmdText;
                    }
                    cmdBakRst.ExecuteNonQuery();
                    if (!isBak)
                    {
                        MessageBox.Show("恭喜你,数据成功恢复为所选文档的状态!", "系统消息");
                    }
                    else
                    {
                        MessageBox.Show("恭喜,你已经成功备份当前数据!", "系统消息");
                    }
                }
                catch (SqlException sexc)
                {
                    MessageBox.Show("失败,可能是对数据库操作失败,原因:" + sexc, "数据库错误消息");
                }
                catch (Exception ex)
                {
                    MessageBox.Show("对不起,操作失败,可能原因:" + ex, "系统消息");
                }
                finally
                {
                    cmdBakRst.Dispose();
                    conn.Close();
                    conn.Dispose();
                }
            }
    另外,如果出现:“尚未备份数据库的日志尾部”错误,可以在还原语句后加上 With Replace 或 With stopat
                       
    2.用SQLDMO实现(下面代码引用别人的)
        //数据库备份
            string backaway =textbox1.Text.Trim();
                SQLDMO.Backup oBackup = new SQLDMO.BackupClass();
                SQLDMO.SQLServer oSQLServer = new SQLDMO.SQLServerClass();
                try
                {
                    oSQLServer.LoginSecure = false;
                    //下面设置登录sql服务器的ip,登录名,登录密码
                    oSQLServer.Connect(serverip, serverid, serverpwd);
                    oBackup.Action = 0;
                   //下面两句是显示进度条的状态
                    SQLDMO.BackupSink_PercentCompleteEventHandler pceh = new SQLDMO.BackupSink_PercentCompleteEventHandler(Step2);
                    oBackup.PercentComplete += pceh;
                    //数据库名称:
                    oBackup.Database = "k2";
                    //备份的路径
                    oBackup.Files = @backaway;
                    //备份的文件名
                    oBackup.BackupSetName = "k2";
                    oBackup.BackupSetDescription = "数据库备份";
                    oBackup.Initialize = true;
                    oBackup.SQLBackup(oSQLServer);
                    MessageBox.Show("备份成功!", "提示");
                }
                catch
                {
                    MessageBox.Show("备份失败!", "提示");
                }
                finally
                {
                    oSQLServer.DisConnect();
                }



    //数据库恢复
            //获取恢复的路径
            string dbaway = textbox2.Text.Trim();
                SQLDMO.Restore restore = new SQLDMO.RestoreClass();
                SQLDMO.SQLServer server = new SQLDMO.SQLServerClass();
                server.Connect(serverip, serverid, serverpwd);

                //KILL DataBase Process
                conn = new 工资管理系统.CCUtility.connstring();
                conn.DBOpen();
                SqlCommand cmd = new SqlCommand("use master Select spid FROM sysprocesses ,sysdatabases Where sysprocesses.dbid=sysdatabases.dbid AND sysdatabases.Name='k2'", conn.Connection);
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    server.KillProcess(Convert.ToInt32(dr[0].ToString()));
                }
                dr.Close();
                conn.DBClose();

                try
                {
                    restore.Action = 0;
                    SQLDMO.RestoreSink_PercentCompleteEventHandler pceh = new SQLDMO.RestoreSink_PercentCompleteEventHandler(Step);
                    restore.PercentComplete += pceh;
                    restore.Database = "k2";
                    restore.Files = @dbaway;
                    restore.ReplaceDatabase = true;
                    restore.SQLRestore(server);
                    MessageBox.Show("数据库恢复成功!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                finally
                {
                    server.DisConnect();
                }

    恢复相关的参数和备份相同,不再解释,自己看一下.

    上面两个函数调用到了更改进度条的两个函数:

           private void Step2(string message, int percent)
            {
                progressBar2.Value = percent;
            }

            private void Step(string message, int percent)
            {
                progressBar1.Value = percent;
            }

    setp对应备份,,setp2对应恢复....
    放这儿,以后学习用
    展开全文
  • sqlserver数据库备份与恢复的代码
  • sql server 备份与恢复系列"都是集中在用户数据库上。sql server还维护着一组系统数据库,这些系统数据库对于服务器实例的运行至关重要。在每次进行系统更新后必须备份多个系统数据库。必须备份的系统数据库...
  • SQL SERVER 数据库备份与恢复 在对SQL SERVER 数据库操作过程中,一定要作好对数据库的经常性备份操作,及时对误操作数据后针对数据库进行恢复处理。手工操作都很简单,因此下面详细说下通过SQL语句对数据库的备份、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,157
精华内容 1,262
关键字:

sql数据库备份与恢复