备份数据库存储过程

原文:备份数据库存储过程

由于使用SSMS创建的维护计划中,完整备份的话,会打断别的备份的顺序链,而由于管理原因,往往需要有几套备份计划,所以经过时间,本人编写了一个存储过程实现我的想法。不管你用不用,反正我用了。

首先,创建一个表,用于记录备份信息。因为用DMV和系统视图的话往往要编写很多东西,对于一般人很难记住那么多表。所以使用一个表来记录更加方便。以前之前已经创建了一个库 AuditDB,用于监控数据库的DDL操作,所以这里没有再编写建库脚本。只是在这个库里面创建一个表。

USE AuditDB
GO
IF OBJECT_ID(‘BackupHistory‘) IS NOT NULL
DROP TABLE BackupHistory
GO
CREATE TABLE BackupHistory
(
	DatabaseName		NVARCHAR(128),--数据库名
	CreateDate			DATETIME,--创建时间
	Compatibilitylevel	TINYINT,--数据库兼容级别
	RecoveryModel		CHAR(10),--恢复模式
	BackupStartData		DATETIME, --备份开始时间
	BackupEndData		DATETIME, --备份结束时间
	BackupSpace			NVARCHAR(128), --备份文件大小
	Operator			NVARCHAR(128),--执行操作者
	Servername			NVARCHAR(128),	--服务器名称
	[FILENAME]			NVARCHAR(256) --备份文件名
);

建了表之后,在msdb或者AuditDB中创建这个存储过程。一般不要在客户数据中创建。

/*
注意:由于用GUI备份会导致备份链中断,而作业无法实现“仅复制备份”,所以使用脚本备份
create by huangzj 20120510
EXEC Backup_By_DBA ‘auditdb‘,‘e:\新建文件夹\‘
*/

ALTER PROC Backup_By_DBA
(
@dbname NVARCHAR(128),
@bakpath NVARCHAR(128)=‘E:\‘
)
AS
--不备份系统表
IF @dbname IN ( ‘master‘, ‘msdb‘, ‘model‘, ‘tempdb‘ )
    BEGIN
        RETURN
    END
ELSE
    BEGIN
--定义备份时间,精确到秒
        DECLARE @date NVARCHAR(64)
        SELECT  @date = SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 1, 4)
                + ‘_‘ + SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 6, 2)
                + ‘_‘ + SUBSTRING(CONVERT(VARCHAR(20), GETDATE(), 121), 9, 2)
                + ‘_‘ + CONVERT(CHAR(2), DATEPART(hh, GETDATE()))
                + CONVERT(CHAR(2), DATEPART(mi, GETDATE()))
                + CONVERT(CHAR(2), DATEPART(ss, GETDATE()))
--定义要备份的数据库名
        DECLARE @db NVARCHAR(20)
        SET @db = ‘‘ + ‘‘ + @dbname + ‘‘ + ‘‘
--定义备份文件的全名
        DECLARE @bakname NVARCHAR(128)
        SELECT  @bakname = @db + ‘_‘ + @date
--定义备份存放路径
        DECLARE @disk NVARCHAR(256)
        SELECT  @disk = @bakpath + @bakname + ‘.bak‘
--定义备份描述
        DECLARE @name NVARCHAR(128)
        SELECT  @name = @db + ‘-完整 数据库 备份‘
--定义错误信息
        DECLARE @error NVARCHAR(128)
        SELECT  @error = ‘验证失败。找不到数据库“‘ + @db + ‘”的备份信息。‘

        BACKUP DATABASE @db TO  DISK = @disk WITH  COPY_ONLY, NOFORMAT, NOINIT,
NAME [email protected], SKIP, NOREWIND, NOUNLOAD,  STATS = 10, CHECKSUM ;
        DECLARE @backupSetId AS INT
        SELECT  @backupSetId = position
        FROM    msdb..backupset
        WHERE   database_name = @db
                AND backup_set_id = ( SELECT    MAX(backup_set_id)
                                      FROM      msdb..backupset
                                      WHERE     database_name = @db
                                    )
        IF @backupSetId IS NULL
            BEGIN
                RAISERROR(@error, 16, 1)
            END
        RESTORE VERIFYONLY FROM  DISK = @disk WITH  FILE = @backupSetId,  NOUNLOAD,  NOREWIND

        INSERT INTO AuditDB.dbo.BackupHistory(DatabaseName,CreateDate,Compatibilitylevel,RecoveryModel,BackupStartData,BackupEndData,BackupSpace,Operator,Servername,[FILENAME])
        SELECT a.[name] ,create_date,a.[compatibility_level] ,recovery_model_desc,S.backup_start_date,S.backup_finish_date,CONVERT(VARCHAR(20),CONVERT(DECIMAL(10,2),S.compressed_backup_size/(1024*1024)))+‘MB‘,
        S.[user_name],S.[server_name],physical_device_name
        FROM sys.databases a INNER JOIN msdb.dbo.backupset S ON a.name=S.database_name Inner Join
            msdb.dbo.backupmediafamily M ON S.media_set_id =M.media_set_id
        WHERE a.name=db_name() AND [email protected]
    END

备注:此处只是完整备份的例子,如果需要别的备份,那么要修改脚本。

				
时间: 2024-11-05 00:32:04

备份数据库存储过程的相关文章

oracle 备份数据库对象(存储过程PROCEDURE,FUNCTION,VIEW,TRIGGER...)

开发过程中,需要不停的备份数据库对象, 特别是存储过程, 每次手动备份不免很低能啊 历经几次修改终于, 完美了,O(∩_∩)O哈哈~      (当然,你也可以再改简便一点~~~) select dbms_metadata.get_ddl('PROCEDURE',"PROCEDURE_NAME",'NAG') 遇到大存储过程老是丢东西不说, 对象名 还老是 "用户名"."对象名" 的格式,腻烦人!~ CREATE OR REPLACE PROCE

SqlServer定时备份数据库和定时杀死数据库死锁解决

PS:Sqlserver 2008 R2,windows 8 64位 1.备份数据库 因为要备份,我们就要用到Sqlserver的代理,默认数据库的代理是不开启的.需要我们手动开启的. 执行备份数据库脚本,现在将脚本公布,其实将这一段代码中需要保存的文件路径和数据库名称替换一下就可以实现备份了.但是还没有达到定时备份的目的 ? 1 2 3 4 5 6 7 8 9 10 11 --自动备份并保存最近5天的SQL数据库作业脚本 宋彪 20130310 DECLARE @filename VARCHA

sql server 2008 R2 压缩备份数据库

今天需要把一个省外项目的数据库从服务器上备份.拷贝到本机(跨地域传输数据库备份文件). 连上VPN,通过远程桌面连接,连接上服务器,发现数据库文件已经有20G以上大小了. 文件太大,公司网络也不稳定,根本不可能通过网络传输过来. 于是,把数据库的恢复模式由"完整"模式设置为"简单"模式,接着收缩数据库, 数据库瞬间由20G变成1G多点. 在SSMS中,新建查询窗口,执行数据库备份语句: --定义变量,把备份数据库的QL脚本赋值给变量 declare @SqlBack

Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作

Oracle如何实现创建数据库.备份数据库及数据导出导入的一条龙操作 Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般都是建建表.查查数据的操作居多,较少会考虑系统的整个Oracle的完整备份操作.但是在我们一些发布操作中,我们必须考虑如何把Oracle的对象.表数据导出到Sql脚本中,并且把创建Oracle表空间.创建Oracle数据库的操作也

局域网备份数据库和文件

一.前情提要 把服务器架设在VirtualBox虚拟机上,对应服务器的数据库文档也备份在虚拟机上.现由于某种意外,虚拟机挂了,需要我们去修复虚拟机或者将虚拟机里面的文件拷贝出来重新架在新的虚拟机上,如果能成功当然是好的,可是很不幸的是以目前掌握的技术修复不了数据也拷贝不出来,这下怎么办呢???只能哭了~~~~ 二.经验教训 为了避免再出现数据拷不出来造成不必要的麻烦,我们就设定让虚拟机里的重要文件定时备份到实体机上,实体机自然是比较稳定的,而且就算系统挂了也懂得怎么把数据拷回来. 三.数据库备份

定时备份数据库到其他服务器

master数据库下创建存储过程 USE [master]GO /****** Object: StoredProcedure [dbo].[bakup_DataBase_Demo] Script Date: 01/07/2015 10:01:09 ******/SET ANSI_NULLS ONGO SET QUOTED_IDENTIFIER ONGO --Full BackUp --Use Master create proc [dbo].[bakup_DataBase_Demo] asDe

MSSQL Express版本自动备份数据库

由于Express版本的数据库没有自动备份数据库的功能,所以需要自己搭建好备份功能 一.具体原理: 1.利用SQL备份命令:Backup Database 2.使用sqlcmd执行备份命令 3.使用系统计划任务定时执行备份 二.具体操作步骤: 1.在数据库创建一个存储过程:sp_BackupDataBase 问:为什么要存储过程来执行Backup命令呢? 答:因为可以有更多的自定义操作 USE [master] GO /****** Object: StoredProcedure [dbo].[

[转]Oracle如何实现创建数据库、备份数据库及数据导出导入的一条龙操作

本文转自:http://www.cnblogs.com/wuhuacong/archive/2012/03/09/2387680.html Oracle中对数据对象和数据的管理,无疑都是使用PL/SQL Developer来进行管理,该工具也提供给我们很多方便.快捷的操作,使得我们不再为Oracle本身丑陋.难用的UI而抱怨.由于我们一般都是建建表.查查数据的操作居多,较少会考虑系统的整个Oracle的完整备份操作.但是在我们一些发布操作中,我们必须考虑如何把Oracle的对象.表数据导出到Sq

System.Data.SqlClient.SqlError: 尚未备份数据库的日志尾部

SQL还原时出现下面的错误,System.Data.SqlClient.SqlError: 尚未备份数据库 "***" 的日志尾部.如果该日志包含您不希望丢失的工作,请使用 BACKUP LOG WITH NORECOVERY 备份该日志.请使用 RESTORE 语句的 WITH REPLACE 或 WITH STOPAT 子句来只覆盖该日志的内容. (Microsoft.SqlServer.Smo)原因分析:    这是因为在线还原的数据库在最后备份后又产生了新的日志,所以按照默认设