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 ...
随机推荐
- thinkphp判断是否登录
自己写一个BasicController继承了官方的Controller,将判断登录的代码放在BasicController中,然后让其他自己编写的Controller都继承BasicControll ...
- PYTHON map()函数详解
map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回. 栗子如下↓ 图片来自于网上 def f(x,a): return x+x ...
- 《jQuery知识点总结》(一)
write less do more写更少的代码实现更多的功能DOM:document object model (文件对象模型)选择器(选择元素的对象或者节点)id 选择器 $("#id& ...
- DataReader
Datareader对象不能关使用new关键字创建.但可以使用ExecuteReader()方法创建. DataReader是一行一行的读取记录的.当记录中有数据时Read()返回TRUE,当到记录集 ...
- Anti XSS 防跨站脚本攻击库
https://wpl.codeplex.com/ Before understanding Anti-Cross Site Scripting Library (AntiXSS), let us u ...
- ffmpeg-20161003[04,05.06]-bin.7z
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 5 屏幕横向放大 20 像素 6 屏幕横向缩小 20 像素 S 下一帧 [ -2秒 ] +2 ...
- js_面向对象
面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...
- rsync参数及通信
rsync 支持: 本机数据 <-------> 远程数据/本地数据 意义: 支持增量拷贝 --> 备份,节省带宽,时间 rsync -avL 一.常用选项 ******* ...
- GroupBy(..)的四种声明方式的理解及调用
这里我们以 List<Student> studs作为 source,但是注意,studs中的学生可以是分别属于不同的班级和年级 先看GroupBy的第一种声明: public stati ...
- STL string的构造函数
前几天在网上,一位网友问我几个问题如下: , 'A'); string S1 = "abcdefg"; , ); ); cout << "s0 = " ...