一次用 Sql语句完成SqlServer数据库备份还原的历程
上级Leader让我整两个新接口给测试用
之前做过Mysql的备份还原感觉问题不大,开搞
USE master;BACKUP DATABASE Siemens_eTimeSheet TO disk = 'E:\share\bak\eTimeSheet.bak' with init
由百度搜索可以知道 备份语句简直So Easy
刚开始以为备份到软件根目录的bak文件 然后代码就写成了这样
var DateBaseName = "Siemens_eTimeSheet";
var SavePath = Path.Combine(GetAppPath.Path, "bak");
if (Directory.Exists(SavePath))
{
Directory.CreateDirectory(SavePath);
}
string ExSql = string.Format(@"USE master;BACKUP DATABASE {0} TO disk = '{1}'", DateBaseName, SavePath+"\\eTimeSheet.bak");
var ExNumber = Db.Ado.ExecuteCommand(ExSql);
本地执行 nice 发到测试环境试试
运行很多次,语句也正常执行了,但是我的项目根目录里bak文件夹就是没有bak文件,
看sql日志语句也正确执行了,有点奇怪,继续排查
突然~意料到一个问题,软件服务器和数据库服务器好像 不是一个 艹了,
那就先导到数据库文件夹
备份后面加个 with init
如果两次文件名和地址指向同一个位置数据库就会覆盖这个bak文件 相当的人性化
修改后的代码
var DateBaseName = "Siemens_eTimeSheet";
string ExSql = string.Format(@"USE master;BACKUP DATABASE {0} TO disk = '{1}' ", DateBaseName, "E:\\share\\bak\\eTimeSheet.bak");
//这里我用的Orm是SqlSuger
var ExNumber = Db.Ado.ExecuteCommand(ExSql);
return ExNumber == -1;
勉勉强强完成备份功能之后 开始还原功能
还原语句
// 完整还原
RESTORE DATABASE wht_SM FROM DISK='E:\share\bak\eTimeSheet.bak' WITH NORECOVERY
可以看到没有权限 给这个登录的用户加点权限 RESTORE也相当于创建数据库了 所以给个 dbcreator 权限不过分吧
给完权限果然 错误改变了
无法获得数据库的独占权 这个时候百度出场了 第一条就是解释
所以让我们杀完进程之后在执行 还原语句 先查询所有进程
首先先把管理进程的服务器角色加上 就是processadmin
@dbname 改成你的 数据库名称 下面还原的地方也要改一下
USE master
DECLARE
@dbname VARCHAR ( 50 )
SET @dbname = 'Siemens_eTimeSheet' DECLARE
@SQL VARCHAR ( 50 ) DECLARE
cs_result CURSOR LOCAL FOR SELECT
'kill ' + CAST ( spid AS VARCHAR ( 50 ) )
FROM
sys.sysprocesses
WHERE
db_name( dbid ) =@dbname OPEN cs_result FETCH NEXT
FROM
cs_result INTO @SQL
WHILE
@@fetch_status = 0 BEGIN
EXECUTE ( @SQL ) FETCH NEXT
FROM
cs_result INTO @SQL
END CLOSE cs_result DEALLOCATE cs_result;
RESTORE DATABASE Siemens_eTimeSheet
FROM
DISK = N'E:\share\bak\eTimeSheet.bak' WITH Replace;
执行之后 Nice
查看数据库确实是还原之前的那个版本 这 还原 就告一段落,再回想leader交代的任务
备份数据库 √
还原数据库 √
还原完成删除数据库 ×
但是第三点实在访问不到 软件和数据库不在一个服务器 咋能删另一个服务器的东西呢
直到看到 远程备份 sqlserver数据库详解 但是这有点入不敷出啊,有点没必要啊,就是给测试小姐姐做测试使用 ,先这样吧。也算是另一种方式实现了第三条,
备份就会覆盖(没有的话是创建)还原的话有文件就会还原成功 √
效果是一样的 leader不满意的话在重新搞一搞