时间:2021-07-01 10:21:17 帮助过:34人阅读
2. p_RestoreDB 还原数据库存储过程
- <strong><span style="color: #000000">CREATE PROC [dbo].[p_RestoreDB]
- @BKFILE NVARCHAR(</span><span style="color: #800080">1000</span>), --<span style="color: #000000">定义要恢复的备份文件名
- @DBNAME SYSNAME, </span>--<span style="color: #000000">定义恢复后的数据库名,默认为备份的文件名
- @RETYPE NVARCHAR(</span><span style="color: #800080">10</span>)=<span style="color: #800000">‘</span><span style="color: #800000">DB</span><span style="color: #800000">‘</span>,--恢复类型:<span style="color: #800000">‘</span><span style="color: #800000">DB</span><span style="color: #800000">‘</span>完整恢复数据库,<span style="color: #800000">‘</span><span style="color: #800000">DBNOR</span><span style="color: #800000">‘</span> 为差异恢复,日志恢复进行完整恢复,<span style="color: #800000">‘</span><span style="color: #800000">DF</span><span style="color: #800000">‘</span> 差异备份的恢复,<span style="color: #800000">‘</span><span style="color: #800000">LOG</span><span style="color: #800000">‘</span><span style="color: #000000"> 日志恢复
- @FILENUMBER INT</span>=<span style="color: #800080">1</span>, --<span style="color: #000000">恢复的文件号
- @OVEREXIST BIT</span>=<span style="color: #800080">1</span> --<span style="color: #000000">是否覆盖已经存在的数据库,仅@RETYPE为
- AS
- BEGIN
- </span><span style="color: #008000">/*</span><span style="color: #008000">
- --还原数据库
- p_RestoreDB ‘C:\db_backup\CSFramework22.Normal_20110924_213838.BAK‘,‘CSFramework22.Normal‘
- --查看备份文件的内容
- RESTORE FILELISTONLY FROM DISK=‘C:\db_backup\CSFramework22.Normal_20110924_213838.BAK‘
- </span><span style="color: #008000">*/</span><span style="color: #000000">
- DECLARE @SQL VARCHAR(</span><span style="color: #800080">8000</span><span style="color: #000000">)
- </span>--<span style="color: #000000">得到恢复后的数据库名
- IF ISNULL(@DBNAME,</span><span style="color: #800000">‘‘</span>)=<span style="color: #800000">‘‘</span><span style="color: #000000">
- SELECT @SQL</span>=<span style="color: #000000">REVERSE(@BKFILE)
- ,@SQL</span>=CASE WHEN CHARINDEX(<span style="color: #800000">‘</span><span style="color: #800000">.</span><span style="color: #800000">‘</span>,@SQL)=<span style="color: #800080">0</span><span style="color: #000000"> THEN @SQL
- ELSE SUBSTRING(@SQL,CHARINDEX(</span><span style="color: #800000">‘</span><span style="color: #800000">.</span><span style="color: #800000">‘</span>,@SQL)+<span style="color: #800080">1</span>,<span style="color: #800080">1000</span><span style="color: #000000">) END
- ,@SQL</span>=CASE WHEN CHARINDEX(<span style="color: #800000">‘</span><span style="color: #800000">\‘,@SQL)=0 THEN @SQL </span>
- ELSE LEFT(@SQL,CHARINDEX(<span style="color: #800000">‘</span><span style="color: #800000">\‘,@SQL)-1) END </span>
- ,@DBNAME=<span style="color: #000000">REVERSE(@SQL)
- </span>--<span style="color: #000000">生成数据库恢复语句
- SET @SQL</span>=<span style="color: #800000">‘</span><span style="color: #800000">RESTORE </span><span style="color: #800000">‘</span>+CASE @RETYPE WHEN <span style="color: #800000">‘</span><span style="color: #800000">LOG</span><span style="color: #800000">‘</span> THEN <span style="color: #800000">‘</span><span style="color: #800000">LOG </span><span style="color: #800000">‘</span> ELSE <span style="color: #800000">‘</span><span style="color: #800000">DATABASE </span><span style="color: #800000">‘</span><span style="color: #000000"> END
- </span>+<span style="color: #800000">‘</span><span style="color: #800000">[</span><span style="color: #800000">‘</span>+@DBNAME+<span style="color: #800000">‘</span><span style="color: #800000">]</span><span style="color: #800000">‘</span>
- +<span style="color: #800000">‘</span><span style="color: #800000"> FROM DISK=</span><span style="color: #800000">‘‘‘</span>+@BKFILE+<span style="color: #800000">‘‘‘‘</span>
- +<span style="color: #800000">‘</span><span style="color: #800000"> WITH FILE=</span><span style="color: #800000">‘</span>+<span style="color: #000000">CAST(@FILENUMBER AS VARCHAR)
- </span>+CASE WHEN @OVEREXIST=<span style="color: #800080">1</span> AND @RETYPE IN(<span style="color: #800000">‘</span><span style="color: #800000">DB</span><span style="color: #800000">‘</span>,<span style="color: #800000">‘</span><span style="color: #800000">DBNOR</span><span style="color: #800000">‘</span>) THEN <span style="color: #800000">‘</span><span style="color: #800000">,REPLACE</span><span style="color: #800000">‘</span> ELSE <span style="color: #800000">‘‘</span><span style="color: #000000"> END
- </span>+CASE @RETYPE WHEN <span style="color: #800000">‘</span><span style="color: #800000">DBNOR</span><span style="color: #800000">‘</span> THEN <span style="color: #800000">‘</span><span style="color: #800000">,NORECOVERY</span><span style="color: #800000">‘</span> ELSE <span style="color: #800000">‘</span><span style="color: #800000">,RECOVERY</span><span style="color: #800000">‘</span><span style="color: #000000"> END
- </span>--<span style="color: #000000">设当前数据库离线状态
- EXEC(</span><span style="color: #800000">‘</span><span style="color: #800000">ALTER DATABASE [</span><span style="color: #800000">‘</span>+@DBNAME+<span style="color: #800000">‘</span><span style="color: #800000">] SET OFFLINE WITH ROLLBACK IMMEDIATE</span><span style="color: #800000">‘</span><span style="color: #000000">)
- </span>--<span style="color: #000000">恢复数据库
- EXEC(@SQL)
- </span>--<span style="color: #000000">设当前数据库连线状态
- EXEC(</span><span style="color: #800000">‘</span><span style="color: #800000">ALTER DATABASE [</span><span style="color: #800000">‘</span>+@DBNAME+<span style="color: #800000">‘</span><span style="color: #800000">] SET ONLINE</span><span style="color: #800000">‘</span><span style="color: #000000">)
- END</span></strong>
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,解决
C#.NET SQL数据库备份与还原解决方案
标签: