C#.NET SQL数据库备份与还原解决方案

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

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

ALTER PROC [dbo].[p_BackupDB]
    @DBNAME SYSNAME=‘‘,       --要备份的数据库名称,不指定则备份当前数据库
    @BKPATH NVARCHAR(260)=‘‘, --备份文件的存放目录,不指定则使用SQL默认的备份目录
    @BKFNAME NVARCHAR(260)=‘‘,--备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
    @BKTYPE NVARCHAR(10)=‘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\‘
*/
    DECLARE @SQL VARCHAR(8000)
    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)
    ,‘\DATE\‘,CONVERT(VARCHAR,GETDATE(),112))
    ,‘\TIME\‘,REPLACE(CONVERT(VARCHAR,GETDATE(),108),‘:‘,‘‘)) 

    SET @SQL=‘BACKUP ‘+CASE @BKTYPE WHEN ‘LOG‘ THEN ‘LOG ‘ ELSE ‘DATABASE ‘ END
    +‘[‘[email protected]+‘]‘
    +‘ TO DISK=‘‘‘[email protected]+@BKFNAME
    +‘‘‘ WITH ‘+CASE @BKTYPE WHEN ‘DF‘ THEN ‘DIFFERENTIAL,‘ ELSE ‘‘ END
    +CASE @APPENDFILE WHEN 1 THEN ‘NOINIT‘ ELSE ‘INIT‘ END
    PRINT @SQL
    EXEC(@SQL) 

    IF @@ERROR=0
    BEGIN
       PRINT ‘备份日志‘
       INSERT INTO dbo.sys_BackupHistory(DBName,BackupFileName,BackupPath,BackupTime) VALUES
       (@DBNAME,@BKFNAME,@BKPATH+@BKFNAME,GETDATE())
    END
END

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

CREATE PROC [dbo].[p_RestoreDB]
    @BKFILE NVARCHAR(1000),   --定义要恢复的备份文件名
    @DBNAME SYSNAME,          --定义恢复后的数据库名,默认为备份的文件名
    @RETYPE NVARCHAR(10)=‘DB‘,--恢复类型:‘DB‘完整恢复数据库,‘DBNOR‘ 为差异恢复,日志恢复进行完整恢复,‘DF‘ 差异备份的恢复,‘LOG‘ 日志恢复
    @FILENUMBER INT=1,        --恢复的文件号
    @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‘
*/

    DECLARE @SQL VARCHAR(8000)
    --得到恢复后的数据库名
    IF ISNULL(@DBNAME,‘‘)=‘‘
       SELECT @SQL=REVERSE(@BKFILE)
       ,@SQL=CASE WHEN CHARINDEX(‘.‘,@SQL)=0 THEN @SQL
       ELSE SUBSTRING(@SQL,CHARINDEX(‘.‘,@SQL)+1,1000) END
       ,@SQL=CASE WHEN CHARINDEX(‘\‘,@SQL)=0 THEN @SQL
       ELSE LEFT(@SQL,CHARINDEX(‘\‘,@SQL)-1) END
       ,@DBNAME=REVERSE(@SQL)
    --生成数据库恢复语句
    SET @SQL=‘RESTORE ‘+CASE @RETYPE WHEN ‘LOG‘ THEN ‘LOG ‘ ELSE ‘DATABASE ‘ END
       +‘[‘[email protected]+‘]‘
       +‘ FROM DISK=‘‘‘[email protected]+‘‘‘‘
       +‘ 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 [‘[email protected]+‘] SET OFFLINE WITH ROLLBACK IMMEDIATE‘)
    --恢复数据库
    EXEC(@SQL)
    --设当前数据库连线状态
    EXEC(‘ALTER DATABASE [‘[email protected]+‘] 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

补充:

如果遇到如下情况

遇到这种情况别急,查看控制面板,卸载

本图为已处理过的,卸载2012的Client和LocalDB

OK,解决

时间: 2024-11-09 05:21:01

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

SQL Server 数据库备份与还原

1.相同SQL Server版本(2008为例)之间数据库备份与还原 (1)数据库备份 相同SQL Server服务器版本之间数据库的备份还原操作相对来说比较简单. 首先找到需要备份的数据库实例,[右键]->[任务]->[备份...],界面下边选择备份路径,点击确定,备份成功后即可在选择的备份路径下找到后缀名为.bak的备份文件. (2)数据库还原 对于需要还原的.bak数据库文件,一般会先拷贝到 C:\Program Files\Microsoft SQL Server\MSSQL10.MS

第三章 数据库备份和还原

一.数据库恢复模式 1.完整:能够让数据库恢复到出现故障的时间点和指定时间点(主要是日志文件完 整备份) 2.大容量日志:数据库日志不记录对数据修改的时间(即指定的时间点)效率高只 能通过日志恢复到故障点 3.简单:对事务日志不活跃的逻辑日志文件覆盖重复利用(日志写满后覆盖完成的 提交的事务日志)不能利用日志还原数据库,只能利用完整数据库文件恢 复 1)简单恢复模式 数据库备份和还原策略 数据小 数据变化不大 数据库不能恢复到出现故障的时间点(重复擦写日志文件) 完整数据库备份  完整的数据库备

SQL Server 备份和还原

SQL Server 备份和还原 SQL Server 备份 恢复模式 SQL Server 数据恢复模式分为三种:完整恢复模式.大容量日志恢复模式.简单恢复模式. 完整恢复模式 默认的恢复模式,它会完整记录下操作数据库的每一个步骤,使用完整恢复模式可以将一个数据库恢复到一个特定的时间点,这个时间点可以是最近一次可用的备份.一个特定的日期和时间的事务. 大容量日志恢复模式 它是对完整恢复模式的补充,就是要对大容量操作进行最小日志记录,节省日志文件的空间. 比如说一次在数据库中插入几十万条记录时,

Centos7.3 下SQL Server 备份及还原的两种方式

Centos7.3 下SQL Server 备份及还原的两种方式 我们前面两篇文章介绍了Centos7.3下SQL Server的安装配置及使用Powershell的管理介绍,今天我们接着介绍如何实现Centos7.3 下SQL Server  备份及还原,有两种方式:1.使用SSMS备份及还原,该方式最为简单也最方便操作的方式,2.使用Linux下SQL Server自带功能命令备份,具体见下: 我们上一篇中创建了一个测试数据库,我们接着拿这个数据库进行测试,我们首先使用第一种方式,使用SSM

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

Mysql数据库备份和还原常用的命令是进行Mysql数据库备份和还原的关键,没有命令,什么都无从做起,更谈不上什么备份还原,只有给系统这个命令,让它去执行,才能完成Mysql数据库备份和还原的操作,下面就是操作的常用命令. 一.备份命令 1.备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename>backupfile.sql 2.备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有

MySQL数据库备份与还原

备份数据库 1.使用mysqldump命令备份 备份一个数据库:mysqldump -u 用户名 -p密码 数据库名 [表名1,表名2...]>备份文件路径及名字.sql 如果没有表名,则备份整个数据库 eg: mysql -u root -p test studentinfo >D:\test.sql 备份多个数据库:mysqldump -u 用户名 -p --databases 数据库1,数据库2...  >  备份文件路径及名字.sql 备份所有数据库:mysqldump -u 用

SQL Server 备份和还原全攻略

原文:SQL Server 备份和还原全攻略 一.知识点 完全备份: 备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件.(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性).完全备份也叫完整备份. 差异备份: 差异备份是针对完全备份:备份上一次的完全备份后发生变化的所有文件.(差异备份过程中,只备份有标记的那些选中的文件和文件夹.它不清除标记,即:备份后不标记为已备份文件,换言之,不清除存档属性). 增量备份: 增量备份是针对于上一次备份(无论是

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

MySQL数据库备份和还原的常用命令小结,学习mysql的朋友可以参考下: 备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库为带删除表的格式备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库. mysqldump ---add-drop-table -uusername -ppassword databasena

MySQL数据库备份和还原的常用命令小结

MySQL数据库备份和还原的常用命令小结,学习mysql的朋友可以参考下: 备份MySQL数据库的命令 mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql 备份MySQL数据库为带删除表的格式备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库. mysqldump ---add-drop-table -uusername -ppassword databasena