为了能够恢复数据,数据库运维基础就是备份,备份自动化也是运维自动化首要进行的。
笔者的备份自动化,通过配置表快速配置为前提,同时记录备份过程,尽可能的减少人工操作。首先将SQL Server备份按用途分:
1、 业务数据库备份--本文主要内容
SQL Server提供多种备份方式,为业务数据库备份选择何种备份策略,可根据各自的数据量和业务情况而定。
备份策略需求:
- 可恢复到备份之前的任意时间点,尽量减少数据丢失
- 单个备份数据库已达TB
- 考虑还原效率、不可追加过多的日志
备份策略制定:
- 完整备份:每周一执行一次
- 差异备份:每天执行一次,周一不执行
- 日志备份:每1小时一次
- 备份副本:保存多份备份副本;上传一份副本到远程磁盘dbbackup文件夹
- 备份归档:归档远程磁盘备份到dbbackuphistory文件夹,只保留当月最早完整备份和所有日志备份,删除差异备份
- 通过配置表控制是否备份,备份路径等;并记录备份信息,备份大小,开始时间,结束时间等
注:在执行完整或差异备份的同时,可同时执行日志备份。
2、系统数据库、配置数据库、高可用配置、权限、Job、SSIS等备份;以下简称为“灾备”--后续文章介绍
灾备的目的在于,发生重大服务器故障,可迅速通过灾备恢复原有配置,权限用户等等。
基础备份架构如图所示:
方案一、将数据先备份到所在服务器的本地磁盘,再上传到远程磁盘柜(多份数据副本),最后针对磁盘柜的备份进行归档处理。之所以先备份到本地,是考虑备份最好保存多份,以防止文件损坏。
方案二、若本地磁盘空间不足,或者io压力较大,可直接备份到远程。
二、配置表
指定两张配置表,BackupRestoreSetting为备份配置信息,备份路径,上传路径,是否备份,是否上传控制;BackupFileList记录备份信息,备份文件名称、大小、开始时间、结束时间等。
2.1、BackupRestoreSetting备份还原配置信息表
如下图所示,插入该数据库的备份还原配置信息,备份磁盘路径,上传路径,是否备份是否上传等信息。后续脚本封装将读取这些配置信息进行备份。
注:由于还原是以备份信息为基础,所以配置信息需要放在一起。此处暂时刻忽略还原内容。
--运维配置库,收集本地服务器所有自动化信息;包括dmv,扩展事件,计数器,备份,日常维护脚本封装等。 USE [Configdb] GO --备份还原配置表 CREATE TABLE [dbo].[BackupRestoreSetting]( [Servername] [sysname] NOT NULL,--服务器名称 [DBname] [sysname] NOT NULL,--数据库名称 [V_DBname] [nvarchar](128) NULL,--还原数据库名称 [Backup_drive] [char](1) NULL,--备份磁盘 [Backup_path] [varchar](100) NULL,--备份路径 [Restore_drive] [char](1) NULL,--还原磁盘 [Restore_path] [varchar](100) NULL,--还原路径 [Copy_path] [varchar](100) NULL,--上传路径 [IsBackup] [char](1) NULL,--是否备份 [IsCopy] [char](1) NULL,--是否上传 [IsRestore] [char](1) NULL,--是否还原 [RestoreStatus] [char](1) NULL,--还原状态 [Priority] [smallint] NULL,--还原优先级 [Net_Ip] [varchar](100) NULL,--远程磁盘柜IP CONSTRAINT [PK_BackupRestoreSetting] PRIMARY KEY CLUSTERED ( [Servername] ASC, [DBname] ASC ) ) ON [PRIMARY]
2.2、BackupFilelist备份信息记录表
记录备份大小,开始时间,结束时间,上传时间等等;以便统计和备份异常处理。
--备份信息记录表 CREATE TABLE [dbo].[BackupFilelist]( [id] [int] IDENTITY(1,1) NOT NULL, [Servername] [varchar](50) NULL,--服务器名称 [Dbname] [varchar](50) NULL,--数据库名称 [Backupset] [varchar](4) NULL,--备份模式,完整FULL 差异DIFF 日志LOG [Filename] [varchar](100) NULL,--备份文件名称 [Filesize] [varchar](20) NULL,--备份文件大小 [Backup_start_time] [datetime] NULL,--备份开始时间 [Backup_end_time] [datetime] NULL,--备份结束时间 [Copy_end_time] [datetime] NULL,--上传开始时间 [Copy_status] [char](1) NULL,--上传状态 [ReCopyTimes] [int] NULL,--重复上传次数 [Media_set_id] [int] NULL,--上传文件meidaid [Error_Msg] [varchar](max) NULL,--错误信息 [Cmd] [varchar](max) NULL,--上传命令 CONSTRAINT [PK_BackupFilelist] PRIMARY KEY CLUSTERED ( [id] ASC ) ) GO
三、spx_Backup_DelFile删除本地备份
若备份存放在本地,需要定期删除本地备份,以防止本地磁盘不足;建议在执行完整FULL备份之前来删除本地备份,以保证可快速还原完整备份之后的任意时间点。
删除本地备份脚本spx_Backup_DelFile
USE [Configdb] GO /****************************** 功能描述:<本地备份文件删除> * 创建者:<HuangCH〉 * 创建日期:<2015-12-03> * 备注说明:<@Retain_weeks 保留周数,默认全部删除> ########## Change Log ########## Date Changer Description -------------------------------------------------- <2015-12-03> <HuangCH> <新建> -------------------------------------------------- ***************************/ CREATE PROCEDURE [dbo].[spx_Backup_DelFile] @servername [SYSNAME], @dbname [SYSNAME], @Retain_weeks INT=0 AS SET nocount on ----=============================== DECLARE @retcode INT DECLARE @cmd VARCHAR(2000) DECLARE @backup_drive CHAR(1)--本地备份磁盘 DECLARE @backup_path VARCHAR(200)--本地备份路径' SELECT @backup_drive = backup_drive, @backup_path = backup_path FROM dbo.BackupRestoreSetting WITH (nolock) WHERE servername=@servername and dbname = @dbname IF @Retain_weeks=0 BEGIN --删除备份 SET @cmd='del '+@backup_drive +':\'+@backup_path+'\'+ @dbname + '_??????????????_*_???.bak' EXEC master..Xp_cmdshell @cmd END ELSE IF @Retain_weeks>0 BEGIN DECLARE @delday Datetime SET @delday=CONVERT(VARCHAR,DATEADD(WEEK,-@Retain_weeks,GETDATE()),23) WHILE @delday>=DATEADD(WEEK,-@Retain_weeks-3,GETDATE()) BEGIN SET @delday=DATEADD(D,-1,@delday) SET @cmd='del '+@backup_drive +':\'+@backup_path+'\'+ @dbname + '_'+CONVERT(VARCHAR,@delday,112)+'*_*_???.bak' EXEC master..Xp_cmdshell @cmd END END