一次用 Sql语句完成SqlServer数据库备份还原的历程

一次用 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不满意的话在重新搞一搞

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值