C#.NET SQL数据库备份与还原解决方案
http://www.csframework.com/archive/1/arc-1-20110924-1841.htm

开发框架V2.2(快速开发版)系统管理模块已集成数据库的备份与还原功能。

数据库列表:帐套数据库与系统数据库列表。
备份文件列表:数据源来自master.dbo.sys_BackupHistory表。


首先在master数据库建立3个存储过程及一个备份历史表:
1. p_BackupDB
2. p_RestoreDB
3. p_CreateJob
4. sys_BackupHistory --备份历史表

(脚本在下面找)


1. p_BackupDB 备份数据库存储过程

ALTER PROC [dbo].[p_BackupDB]

@DBNAME SYSNAME='',       --要备份的数据库名称,不指定则备份当前数据库

)='', --备份文件的存放目录,不指定则使用SQL默认的备份目录

)='',--备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间

)='DB',--备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份

@APPENDFILE BIT=1         --追加/覆盖备份文件

AS

BEGIN

/*

p_BackupDB 'CSFramework22.Normal','C:\db_backup\'

p_BackupDB 'CSFramework22.Test','C:\db_backup\'

p_BackupDB 'CSFramework22.System','C:\db_backup\'

*/

)

IF ISNULL(@DBNAME,'')=''  SET @DBNAME=DB_NAME()--当前数据库

IF ISNULL(@BKPATH,'')=''  SET @BKPATH=dbo.f_GetDBPath(NULL)

IF ISNULL(@BKFNAME,'')='' SET @BKFNAME='\DBNAME\_\DATE\_\TIME\.BAK'

SET @BKFNAME=REPLACE(REPLACE(REPLACE(@BKFNAME,'\DBNAME\',@DBNAME)

))

),':',''))

SET @SQL='BACKUP '+CASE @BKTYPE WHEN 'LOG' THEN 'LOG ' ELSE 'DATABASE ' END

+'['+@DBNAME+']'

+' TO DISK='''+@BKPATH+@BKFNAME

+''' WITH '+CASE @BKTYPE WHEN 'DF' THEN 'DIFFERENTIAL,' ELSE '' END

+CASE @APPENDFILE WHEN 1 THEN 'NOINIT' ELSE 'INIT' END

PRINT @SQL

EXEC(@SQL)

BEGIN

PRINT '备份日志'

INSERT INTO dbo.sys_BackupHistory(DBName,BackupFileName,BackupPath,BackupTime)VALUES

(@DBNAME,@BKFNAME,@BKPATH+@BKFNAME,GETDATE())

END

END

2. p_RestoreDB 还原数据库存储过程

ALTER PROC [dbo].[p_RestoreDB]

),   --定义要恢复的备份文件名

@DBNAME SYSNAME,          --定义恢复后的数据库名,默认为备份的文件名

)='DB',--恢复类型:'DB'完整恢复数据库,'DBNOR' 为差异恢复,日志恢复进行完整恢复,'DF' 差异备份的恢复,'LOG' 日志恢复

,        --恢复的文件号

@OVEREXIST BIT=1          --是否覆盖已经存在的数据库,仅@RETYPE为

AS

BEGIN

/*

--还原数据库

p_RestoreDB 'C:\db_backup\CSFramework22.Normal_20110924_213838.BAK','CSFramework22.Normal'

--查看备份文件的内容

RESTORE FILELISTONLY FROM DISK='C:\db_backup\CSFramework22.Normal_20110924_213838.BAK'

*/

)

--得到恢复后的数据库名

IF ISNULL(@DBNAME,'')=''

SELECT @SQL=REVERSE(@BKFILE)

,@SQL=CASE WHEN CHARINDEX('.',@SQL)=0 THEN @SQL

,) END

,@SQL=CASE WHEN CHARINDEX('\',@SQL)=0 THEN @SQL

) END

,@DBNAME=REVERSE(@SQL)

--生成数据库恢复语句

SET @SQL='RESTORE '+CASE @RETYPE WHEN 'LOG' THEN 'LOG ' ELSE 'DATABASE ' END

+'['+@DBNAME+']'

+' FROM DISK='''+@BKFILE+''''

+' WITH FILE='+CAST(@FILENUMBER AS VARCHAR)

+CASE WHEN @OVEREXIST=1 AND @RETYPE IN('DB','DBNOR') THEN ',REPLACE' ELSE ''END

+CASE @RETYPE WHEN 'DBNOR' THEN ',NORECOVERY' ELSE ',RECOVERY' END

--设当前数据库离线状态

EXEC('ALTER DATABASE ['+@DBNAME+'] SET OFFLINE WITH ROLLBACK IMMEDIATE')

--恢复数据库

EXEC(@SQL)

--设当前数据库连线状态

EXEC('ALTER DATABASE ['+@DBNAME+'] SET ONLINE')

END

3.  p_CreateJob创建作业存储过程
  
(因SQLExpress 2005 没有代理服务,可以创建作业,但无法运行作业。SQL2008版本可以)

4. sys_BackupHistory 备份历史记录表

常见错误及解决方法:

1. 备份错误

SQL报错:

BACKUP DATABASE CSFrameworkPermission TO DISK='C:\CSFrameworkPermission_20110923_104732.BAK' WITH NOINIT
Msg 3201, Level 16, State 1, Line 1
Cannot open backup device 'C:\CSFrameworkPermission_20110923_104732.BAK'. Operating system error 5(拒绝访问。).
Msg 3013, Level 16, State 1, Line 1
BACKUP DATABASE is terminating abnormally.

提示操作系统错误(拒绝访问),是因为当前建立连接的用户(CSFramework)没有服务器建立文件的权限。

其它提示:

类似于NT AUTHORITY\SYSTEM权限不够的问题,请在服务管理中将SQL Server (MSSQLSERVER) 和 SQL Server Agent (MSSQLSERVER).的两个服务的登录(Log On)改为在 192.168.0.2上有权限的域帐号

解决方法:

打开SQL Server配置管理工具,在Log On页面有两种方式登录服务器。
1. Build-in account,选择Local System。
2. This account,指定一个登录用户,可以使用Administrator用户。

2. 还原错误

正常情况下设置好第一步有读写文件权限了,一般不会报错。如果仍有错误,将当前用户指定dbcreator角色。

3. 写备份历史记录时出错

 The SELECT permission was denied on the object 'sys_BackupHistory', database 'master', schema 'dbo'.

是因为当前用户没有master数据库读写权限。将csframework用户的User Mapping勾上master,设为dbo。


backup_restore_db.sql

下载:

 (VIP会员下载) 点击下载附件 (如下载失败,请邮件通知我们寄回给您,或QQ:23404761留言.)

C#.NET SQL数据库备份与还原解决方案的更多相关文章

  1. C#+SQL数据库备份和还原

    使用前要导入SQLDMO.dll(在com组件中导入Microsoft SQLDMO Object Library即可) /// /// DbOper类,主要应用SQLDMO实现对Microsoft ...

  2. SQL Server 2008数据库备份和还原(还原是必须有完整备份)

    转自lwccc, SQLserver2008数据库备份和还原问题(还原是必须有完整备份) 首先,我要说明的是你必须拥有完整的数据库备份,下面的还原教程,才算有用. 这个连接是某高手的异常恢复方法, 实 ...

  3. sql操作数据库(2)--->DQL、数据库备份和还原

    查询 查询表中的所有的行和列的数据 ​ select * from 表名; ​ select * from student; 查询指定列的数据:如果有多个列,中间用逗号隔开. select 列名1,列 ...

  4. Mysql数据库备份和还原常用的命令

    Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下 ...

  5. [转]MySQL数据库备份和还原的常用命令小结

    MySQL数据库备份和还原的常用命令小结,学习mysql的朋友可以参考下: 备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword datab ...

  6. SQL Server 备份和还原

    SQL Server 备份和还原   SQL Server 备份 恢复模式 SQL Server 数据恢复模式分为三种:完整恢复模式.大容量日志恢复模式.简单恢复模式. 完整恢复模式 默认的恢复模式, ...

  7. SQL Server 备份和还原全攻略

    原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份, ...

  8. MySQL具体解释(20)-----------数据库备份和还原

    数据备份: 使用mysqldump命令备份 mysqldump命令能够讲数据库中的数据备份成一个文本文件. 表结果和表中的数据将存储在生成的文本中.mysqldump的工作原理非常easy. 他先查出 ...

  9. 批处理(bat)实现SQLServer数据库备份与还原

    原文:批处理(bat)实现SQLServer数据库备份与还原 备份数据库.bat @echo off set path=%path%;C:\Program Files (x86)\Microsoft ...

随机推荐

  1. yum安装指定版本软件包__20160308

    举例子: 安装 libGL-devel 1. yum list libGL-devel 居然说没有匹配的包的信息... [root@CentOS6 ~]# yum list libGL-devel L ...

  2. Codeforces723E One-Way Reform【欧拉回路】

    题意:给你n点m边的图,然后让你确定每条边的方向,使得入度=出度的点最多 . 度数为偶数的点均能满足入度 = 出度. 证明:度数为奇数的点有偶数个,奇度点两两配对连无向边,则新图存在欧拉回路,则可使新 ...

  3. sscanf的用法(转)

    队长做上海邀请赛的I题时遇到一个棘手的问题,字符串的处理很麻烦,按传统的gets全部读入的话还要做N多处理,太浪费时间. 回来之后搜了一下sscanf的用法发现可以很好的解决这一类问题,各种百度,转来 ...

  4. Javascript 弱类型:除法结果是小数

    由于javascript是弱类型,只有一种var类型,所以在运算时不会自动强制转换,所以计算的结果是多少就是多少,但java中的17/10的结果就是1(强类型与弱类型)比如:console.log(M ...

  5. SciTE 文本编辑器

    个人一直使用,强大,轻型基于 Scintilla. http://www.scintilla.org/SciTEDownload.html 解压缩后,能右键文件打开 修改注册表, 使能资源管理器 右键 ...

  6. VIM 打造 c/c++ IDE

    1. vim 的安装 $sudo apt-get install vim vim-scripts vim-doc <br> 其中vim-scripts包含了vim的一些基本插件,包括语法高 ...

  7. enum类型

    1.设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式: enum weekday{sun,mon,tue,wed,thu,fri,sat}; enum weekday a,b,c; ...

  8. LinuxShell脚本攻略--第二章 命令之乐

    用 cat 进行拼接 文件查找与文件列表玩转 xargs 用 tr 进行转换排序临时文件命名与随机数分割文件和数据根据扩展名切分文件名mv 批量重命名文件交互输入自动化 cat: echo 'Text ...

  9. Perl 语法 - 基础

    perl语言的核心是正则表达式,在文本处理上非常有优势,与python类似,但语法不同,perl的语法很灵活,用多了才会觉得好用. 常用知识点总结: perl语法类似于C语言(perl源于Unix), ...

  10. VB6 GDI+ 入门教程[6] 图片

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[6] 图片 2009 年 6 月 19 日 15条评论 ...