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 ...
随机推荐
- excel to datatable (c#用NPOI将excel文件内容读取到datatable数据表中)
将excel文件内容读取到datatable数据表中,支持97-2003和2007两种版本的excel 1.第一种是根据excel文件路径读取excel并返回datatable /// <sum ...
- SQL处理数组,字符串转换为数组
原文转载自:http://hi.baidu.com/gagahjt/item/fd081316450f05028ebde413 一.按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串 ...
- 收藏的Android学习资源
1. Android中混合开发系列 Android中Java与JavaScript的交互,可用来实现网页与本地APP的交互,信息的传递等: 谈谈App的混合开发,可以让一部分功能由html5开发,这部 ...
- MongoDB安装
安装 1>设置MongoDB目录 cd /home/apps 附:centOS下创建目录命令 mkdir /home/apps 2>下载mongodb curl -O http ...
- Socket网络编程二
SocketServer socketserver一共有这么几种类型 class socketserver.TCPServer(server_address, RequestHandlerClass, ...
- 关于Vue vuex vux 文档
01. vue 链接 http://vuejs.org.cn/guide/ 02. vuex ----->>状态管理模块儿<<------- https://vuex.vue ...
- C# winform 跨线程更改窗体控件的属性
当winform程序中新开一个线程,是无法改变主线程中窗体控件的属性的,否则运行时会报错. 若想在其他线程中控制主线程中的窗体控件,则必须利用BeginInvoke方法. 例如:添加一个名为textb ...
- Python之实用的IP地址处理模块IPy
实用的IP地址处理模块IPy 在IP地址规划中,涉及到计算大量的IP地址,包括网段.网络掩码.广播地址.子网数.IP类型等 别担心,Ipy模块拯救你.Ipy模块可以很好的辅助我们高效的完成IP的规划工 ...
- WinForm任务栏最小化
在C#编写的WinForm里,在FormBorderStyle设为None的时候,任务栏点击程序图标,不会自动最小化.在主窗口WinForm.cs里加入如下代码后,即可恢复该功能. protected ...
- tomcat 远程调试
1.服务端查看cataline.sh 中的描述 cataline jpda start 开启服务端远程调试 远程调试端口JPDA_ADDRESS="8000" 2.本地代码参考 ...