SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作
在开发或者测试环境的数据库中,经常会发现有开发或者测试人员误删除表或者数据的情况,
对于开发或者测试库,一般都没有安排定时的备份任务去备份数据库,
一方面是由于存储资源有限,不太可能给开发或者测试环境准备大量的存储空间,
二是必要性不是很强,开发或者测试库的数据库对象变化太多,通过还原备份的方式又有可能冲掉其最近新建的数据库对象。
但是不得不面对的问题就是个别人在执行update或者delete操作的时候“忘了加where条件”这种事情的发生。
这是开发或者测试环境的一个痛点,相信多数人都经历过,
当面对开发人员过来说“我刚才delete表的时候忘了加where条件,结果全删了,能不能还原一下?”这个问题的时候,
实则有点尴尬,只能告知无法还原,sqlserver不支持闪回功能,又因为测试数据库没有备份,确实无能为力。
此时,开发人员往往会报以鄙视+无奈的眼神,作为冒牌DBA,确实难以相助。
为了切实地解决这个问题,同时又能够以最小的代价来实现,可以定时给测试库打快照的这种轻量级的方式来解决误删除数据的问题。
一是快照占用的空间并不大,
二是可以通过轻量级的方式去还原单个表的数据
花了点时间,写了个全实例下用户数据库的生成快照操作,可以安排一个定时任务来完成定时对数据库生成快照的方式来做一个轻量级的备份。
因此就可以方便地解决执行update或者delete操作的时候“忘了加where条件”误删数据或者表的情况。
通过定时对开发环境的数据库打快照,一旦出现误删数据的情况,可以根据最近的快照中的数据还原误删的数据,同时可以根据实际情况,删除创建的已过期的快照。
简单测试了一下,应该可以达到目的,没有做完整的测试,原理很简单,双层while循环,就是通过循环每一个数据库对应的物理文件,动态生成一个创建数据库快照的语句
此种方式仅适应于开发或者测试环境数据库的轻量级备份,不适应于生产环境。
--生成全实例下的数据库快照
create proc [dbo].[CreateSnapshotForBackUp]
(
--数据库快照文件位置
@p_FilePath varchar(500),
--保留最近N个小时之内创建的快照,单位为小时
@p_RetainTime int
)
as
begin
set nocount on; declare @strSql varchar(2000)
declare @strDatetime varchar(20)
declare @strDBFileName varchar(200) set @strDatetime = replace(replace(replace(CONVERT(varchar, getdate(), 120 ),'-',''),' ',''),':','') if object_id('tempdb..#databaseName') is not null
begin
drop table #databaseName
end select name
into #databaseName
from sys.databases where database_id>6 and source_database_id is null declare @databaseName varchar(200);
declare @databaseCnt int;
select @databaseCnt = count(1) from #databaseName; while @databaseCnt>0
begin select top 1 @databaseName = name from #databaseName if object_id('tempdb..#dbFiles') is not null
begin
drop table #dbFiles
end select concat('(','name = ' , name , ',FileName = ''',@p_FilePath,name,'_',@strDatetime,'.ss'' )' ) as strFileName
into #dbFiles
from sys.sysaltfiles
where dbid=db_id(@databaseName) and status = 2 DECLARE @dbFileCnt int = 0;
SELECT @dbFileCnt = COUNT(1) FROM #dbFiles
while @dbFileCnt>0
begin
select top 1 @strDBFileName = strFileName from #dbFiles;
set @strSql=CONCAT(@strSql,',',@strDBFileName,char(10));
delete top (1) from #dbFiles;
select @dbFileCnt = count(1) from #dbFiles;
end set @strSql=stuff(@strSql,1,1,'') set @strSql = CONCAT('create database ' ,@databaseName,'_',@strDatetime, char(10),
' on ' , char(10), @strSql
,'as snapshot of ' , @databaseName) begin try
print @strSql
exec(@strSql)
select @databaseName+'snapshot create successful:'+@databaseName+@strDatetime
set @strSql = ''
end try
begin catch
select 'snapshot create fail'
throw
end catch delete top (1) from #databaseName
select @databaseCnt = count(1) from #databaseName
end --删除过期的数据库快照
begin try
if object_id('tempdb..#snapshotname') is not null
drop table #snapshotname select name
into #snapshotname
from sys.databases
where source_database_id is not null and create_date<dateadd(hh,-@p_RetainTime,getdate()); declare @cnt int = 0;
declare @strDBName varchar(200) = ''
declare @strDropDatabase varchar(max) = ''
select @cnt = count(1) from #snapshotname
while @cnt>0
begin
select top 1 @strDBName = name from #snapshotname;
set @strDropDatabase = 'drop database ' +@strDBName;
print @strDropDatabase
exec (@strDropDatabase);
delete top (1) from #snapshotname;
select @cnt = count(1) from #snapshotname
end end try
begin catch
select N'snapshot delete fail'
throw
end catch end

实话讲,已经完全忘记了T-SQL中游标的语法了,通过while循环临时表的方式,也可以达到游标循环的效果,并且这种语法逻辑结构上更清晰简便,根本不会忘记,呵呵。
SQL Server中使用数据库快照的方式来完成测试环境中数据库的轻量级备份还原操作的更多相关文章
- SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案
原文:SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Serv ...
- JMeter - 如何在多个测试环境中运行多个线程组
概述: 作为性能测试的一部分,我不得不为我们的应用程序提供各种用例/业务工作流程的性能测试脚本.当我设计我的性能测试脚本时,我将确保我有本文中提到的可重用测试脚本. JMeter - 如何创建可重用和 ...
- 【转】sql server 订阅发布、快照发布(一)
原文链接:https://blog.csdn.net/tiandi_5000/article/details/11646023 SQL SERVER 2012 使用订阅发布同步数据库(一) 2013年 ...
- SQL Server -- 回忆笔记(三):ADO.NET之C#操作数据库
SQL Server知识点回忆篇(三):ADO.NET之C#操作数据库 1.连接数据库 (1)创建连接字符串: 使用windows身份验证时的连接字符串: private string conStr= ...
- SQL Server信息偏差影响表联结方式统计
SQL Server统计信息偏差影响表联结方式案例浅析 我们知道数据库中的统计信息的准确性是非常重要的.它会影响执行计划.一直想写一篇关于统计信息影响执行计划的相关博客,但是都卡在如何构造一个合适 ...
- SQL Server已提交读快照隔离级别的设置
如果要把SQL Server数据库事务隔离级别设置为已提交读快照隔离 如果直接运行下面的语句: ALTER Database [mydbname] SET READ_COMMITTED_SNAPSHO ...
- 《Pro SQL Server Internals, 2nd edition》的CHAPTER 2 Tables and Indexes中的Clustered Indexes一节(翻译)
<Pro SQL Server Internals> 作者: Dmitri Korotkevitch 出版社: Apress出版年: 2016-12-29页数: 804定价: USD 59 ...
- 《Pro SQL Server Internals, 2nd edition》的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows(翻译)
数据页和数据行 数据库中的空间被划分为逻辑8KB的页面.这些页面是以0开始的连续编号,并且可以通过指定文件ID和页号来引用它们.页面编号都是连续的,这样当SQL Server增长数据库文件时,从文件中 ...
- SQL Server 2014与TFS 2013的错误(TF53001:管理员已取消数据库操作)
服务器环境: - TFS 2013 with Update 2 - SQL Server 2014(两个节点数据库服务器配置了AlwaysOn高可用性) - Windows Server 2012 R ...
随机推荐
- SpringBoot的学习【3.HelloWorld配置细节】
/** * @SpringBootApplication用来标注主程序类. */ @SpringBootApplication public class First { public static v ...
- linux 内存使用情况详解
一:首先是先登录 二:查看当前目录 命令:df -h 三:查看具体文件夹占用情况 命令:du --max-depth=1 -h /data/ 或者:为了快算显示,同时也只是想查看目录整体占用大小 命 ...
- 深入理解Java中的同步静态方法和synchronized(class)代码块的类锁
一.回顾学习内容 在前面几篇博客中我我们已经理解了synchronized对象锁.对象锁的重入.synchronized方法块.synchronized非本对象的代码块, 链接:https://www ...
- centos安装VirtualBox增强包VBoxGuestAdditions
1.如果你的CentOS 版本早于 6,那么需要在 /etc/grub.conf 中添加一行 divider=10,以将这个参数传递给核心,以减少 idle CPU load. 2.#yum up ...
- 13.python错误和异常
一.错误和异常1.程序中的错误分为俩种:(1)语法错误:不按照语言的规则,必须在程序执行前就改正(2)逻辑错误2.异常就是程序运行时发生错误的信号,分为三部分(1)Traceback:异常追踪的信息( ...
- ubuntu 初始安装完成后的一些设置
处于安全考虑最好,使用普通用户登录. 首先以超级用户登入系统,然后执行以下步骤 第一步:设置普通用户 以下<user_name>代表普通用户的用户名 useradd -g users -d ...
- Go Example--defer
package main import ( "fmt" "os" ) func main() { f := createFile("/tmp/defe ...
- python中str函数isdigit、isdecimal、isnumeric的区别
num = "1" #unicodenum.isdigit() # Truenum.isdecimal() # Truenum.isnumeric() # True num = & ...
- qsort函数排序各种类型的数据。
qsort函数是库函数中的一员,我们先来看看官方文档是怎么写的: 其中qsort的参数void* base是传入一个数组,size_t num 为数组整体大小,size_t size 为单个元素的大小 ...
- 第一章 HTML+CSS(上)
HTML 网页的组成 HTML简介 HTML的语法 HTML的常用标签 HTML中的表格和表单 CSS的简单应用 我们这里使用WebStorm开发工具 配置浏览器 常用插件: CodeGlance 代 ...