T-SQL Recipes之Database Backups
The Problem
在DBA和T-SQL码奴日常工作中,比如常规检查,服务管理,数据库管理, 是其中最具挑战性的一个领域。
在相似任务中,比如索引碎片管理,统计管理,数据库备份是异常重要的,对任何程序而言。
今天的重点就是讲动态SQL数据库备份
假设我们的需要是根据一个时间点来决定三种不同类型的备份:Full backups, differential backups, transaction log backups.
我们可以假定
- Full backups: 一个星期备份一次
- differential backups: 每隔一天运行一次
- transcation log backups:每天运行一次
The Solution
问题描述的差不多了,现在咱们开动吧。
IF OBJECT_ID('dbo.backup_plan', 'P') IS NOT NULL
BEGIN
DROP PROCEDURE dbo.backup_plan;
END
GO
CREATE PROCEDURE dbo.backup_plan
@differential_and_full_backup_time TIME = '00:00:00', -- Default to midnight
@full_backup_day TINYINT = 1, -- Default to Sunday
@backup_location NVARCHAR(MAX) = 'D:\SQLBackups\', -- Default to my backup folder
@print_output_only BIT = 1
AS
BEGIN
SET NOCOUNT ON;
DECLARE @current_time TIME = CAST(CURRENT_TIMESTAMP AS TIME);
DECLARE @current_day TINYINT = DATEPART(DW, CURRENT_TIMESTAMP);
DECLARE @datetime_string NVARCHAR(MAX) = FORMAT(CURRENT_TIMESTAMP , 'MMddyyyyHHmmss');
DECLARE @sql_command NVARCHAR(MAX) = '';
DECLARE @database_list TABLE
(
database_name NVARCHAR(MAX) NOT NULL ,
recovery_model_desc NVARCHAR(MAX)
);
INSERT INTO @database_list
( database_name ,
recovery_model_desc
)
SELECT name ,
recovery_model_desc
FROM sys.databases
WHERE databases.name NOT IN ( 'msdb', 'master', 'TempDB', 'model' );
-- Check if a full backup is to be taken now.
IF (@current_day = @full_backup_day) AND (@current_time BETWEEN @differential_and_full_backup_time AND DATEADD(MINUTE, 10, @differential_and_full_backup_time))
BEGIN
SELECT @sql_command = @sql_command + '
BACKUP DATABASE [' + database_name + ']
TO DISK = ''' + @backup_location + database_name + '_' + @datetime_string
+ '.bak'';'
FROM @database_list;
END
-- Check if a differential backup is to be taken now.
ELSE IF (@current_day <> @full_backup_day) AND (@current_time BETWEEN @differential_and_full_backup_time AND DATEADD(MINUTE, 10, @differential_and_full_backup_time))
BEGIN
SELECT @sql_command = @sql_command +
'
BACKUP DATABASE [' + database_name + ']
TO DISK = ''' + @backup_location + database_name + '_' + @datetime_string +
'.dif'' WITH DIFFERENTIAL;'
FROM @database_list;
END
-- If neither full or differential, then take a transaction log backup
ELSE
BEGIN
SELECT @sql_command = @sql_command + '
BACKUP LOG [' + database_name + ']
TO DISK = ''' + @backup_location + database_name + '_' + @datetime_string
+ '.trn'''
FROM @database_list
WHERE recovery_model_desc = 'FULL';
END
IF @print_output_only = 1
BEGIN
PRINT @sql_command;
END
ELSE
BEGIN
EXEC sp_executesql @sql_command;
END
END
从代码中可以看出,我们通过天数和时间点来判断三种不同类型的备份。我们还增加了一个只打印不运行的标志,现在我们来看看这三种不同类型的输出吧。
Full backups
EXEC dbo.backup_plan
@differential_and_full_backup_time = '11:16:00',
@full_backup_day = 2,
@backup_location = 'D:\SQLBackups',
@print_output_only = 1;
differential backups
EXEC dbo.backup_plan
@differential_and_full_backup_time = '11:16:00',
@full_backup_day = 3,
@backup_location = 'D:\SQLBackups',
@print_output_only = 1;
transcation log backups
EXEC dbo.backup_plan
@differential_and_full_backup_time = '17:16:00',
@full_backup_day = 3,
@backup_location = 'D:\SQLBackups',
@print_output_only = 1;
有了这个存储过程,以后我们备份数据库就方便许多了,当然你可以通过执行计划来备份的。
T-SQL Recipes之Database Backups的更多相关文章
- EF5中 执行 sql语句使用Database.ExecuteSqlCommand 返回影响的行数 ; EF5执行sql查询语句 Database.SqlQuery 带返回值
一: 执行sql语句,返回受影响的行数 在mysql里面,如果没有影响,那么返回行数为 -1 ,sqlserver 里面 还没有测试过 using (var ctx = new MyDbConte ...
- 关于pl/sql打开后database为空的问题解决办法
前置条件:楼主是在虚拟机里面进行安装oracle和pl/sql的,所以我的安装后,发现我的pl/sql显示的database是空的,当然楼主会检查我的tnsnames.ora是不是配置正确了,但是检查 ...
- SQL Server 2014 Database Mail重复发送邮件特殊案例
在一数据库服务器(Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64))发现有个作业调用Database Mail发送邮件时, ...
- SQL if exists database总是出现语法错误
SQL if exists总是出现语法错误.望高手纠正._百度知道 http://zhidao.baidu.com/link?url=7VyzcX0V1A3lhBQ1emNt2sTk7QGDuijOq ...
- PL/SQL错误提示 database character set(AL32UTF8) and Client character set(ZHS16GBK) are different
PL/SQL database character set(AL32UTF8) and Client character set(ZHS16GBK) are different 这是由于安装oracl ...
- csharp: SQL Server 2005 Database Backup and Restore using C#
1.第一种方式: using SQLDMO;//Microsoft SQLDMO Object Library 8.0 /// <summary> /// 数据库的备份 /// 涂聚文注: ...
- 解决PL/SQL管理工具database下拉为空和登录出现ORA-12154
前言:昨天捣鼓了一下午,终于可以用plsql连接上oracle了... 测试环境:win10 注意问题: (一).环境变量 我发现按网上别人说的那一大推环境配置,很容易出错,我把它们全删了,就留了两个 ...
- 如何得到EF(ADO.NET Entity Framework)查询生成的SQL? ToTraceString Database.Log
ADO.NET Entity Framework ToTraceString //输出单条查询 DbContext.Database.Log //这里有详细的日志
- sql server:alter database name
--step 1 : 修改数据库名称 USE master GO ALTER DATABASE GeovinDuCms SET SINGLE_USER WITH ROLLBACK IMMEDIATE ...
随机推荐
- git仓库的初始化
关于git仓库的初始化和git push的操作 git init git remote add origin ssh://myserver.com/home/git/myapp.git git pul ...
- $q -- AngularJS中的服务(理解)
描述 译者注: 看到了一篇非常好的文章,如果你有兴趣,可以查看: Promises与Javascript异步编程 , 里面对Promises规范和使用情景,好处讲的非常好透彻,个人觉得简单易懂. ...
- 在Web Api中集成protobuf
安装WebApiContrib.Formatting.ProtoBuf Install-Package WebApiContrib.Formatting.ProtoBuf 注册ProtoBufForm ...
- 从APP跳转到WI-FI
之前以为,苹果不支持直接从应用跳到系统设置里的WiFi界面.后来发现,这个小功能是可以实现的,而且实现起来并不麻烦.让我们一起来看看吧! 需求 从应用跳到系统设置里的WiFi界面有这个需求存在吗?答案 ...
- C#递归、动态规划计算斐波那契数列
//递归 public static long recurFib(int num) { if (num < 2) ...
- 创建Hello World程序(part-1)
写在前面: 2006年,刚上大学,班上有几个计算机文盲,1分钟打二十几个字都困难,很不幸,我就是其中的一个.强烈的自尊心驱使我不停恶补,翻遍了图书馆的计算机文化基础,知耻而后勇...后来,C语言居然考 ...
- 手把手教你玩转nginx负载均衡(一)----使用vitualBox创建虚拟机
引言 作为一个web程序员,有时候需要想尽办法来利用有限的资源来产生最大程度的负载,除了提高硬件配置,增加带宽之外,CDN加速,DNS加速,缓存,还可以利用反向代理.但是要说反向代理,就不的不说ngi ...
- Redis3重建Cluster
1.关闭cluster全部节点2.删除所有nodes.conf文件3.开启全部节点4.依次flushall5.重建集群即可 Share the post "Redis3重建Cluster&q ...
- [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解
原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...
- 基于Codeigniter框架实现的APNS批量推送—叮咚,查水表
最近兼职公司已经众筹成功的无线门铃的消息推送出现了问题,导致有些用户接收不到推送的消息,真是吓死宝宝了,毕竟自己一手包办的后台服务,影响公司信誉是多么的尴尬,容我简单介绍一下我们的需求:公司开发的是一 ...