为了能够恢复数据,数据库运维基础就是备份,备份自动化也是运维自动化首要进行的。

笔者的备份自动化,通过配置表快速配置为前提同时记录备份过程,尽可能的减少人工操作。首先将SQL Server备份按用途分:

1、 业务数据库备份--本文主要内容

SQL Server提供多种备份方式,为业务数据库备份选择何种备份策略,可根据各自的数据量和业务情况而定。

备份策略需求:

  • 可恢复到备份之前的任意时间点,尽量减少数据丢失
  • 单个备份数据库已达TB
  • 考虑还原效率、不可追加过多的日志

备份策略制定:

  • 完整备份:每周一执行一次
  • 差异备份:每天执行一次,周一不执行
  • 日志备份:每1小时一次
  • 备份副本:保存多份备份副本;上传一份副本到远程磁盘dbbackup文件夹
  • 备份归档:归档远程磁盘备份到dbbackuphistory文件夹,只保留当月最早完整备份和所有日志备份,删除差异备份
  • 通过配置表控制是否备份,备份路径等;并记录备份信息,备份大小,开始时间,结束时间等

注:在执行完整或差异备份的同时,可同时执行日志备份。

2、系统数据库、配置数据库、高可用配置、权限、Job、SSIS等备份;以下简称为“灾备”--后续文章介绍

   灾备的目的在于,发生重大服务器故障,可迅速通过灾备恢复原有配置,权限用户等等。

基础备份架构如图所示:

方案一、将数据先备份到所在服务器的本地磁盘,再上传到远程磁盘柜(多份数据副本),最后针对磁盘柜的备份进行归档处理。之所以先备份到本地,是考虑备份最好保存多份,以防止文件损坏。

方案二、若本地磁盘空间不足,或者io压力较大,可直接备份到远程。

1、SQL Server自动化运维 - 备份(一)业务数据库

二、配置表

指定两张配置表,BackupRestoreSetting为备份配置信息,备份路径,上传路径,是否备份,是否上传控制;BackupFileList记录备份信息,备份文件名称、大小、开始时间、结束时间等。

2.1、BackupRestoreSetting备份还原配置信息表

如下图所示,插入该数据库的备份还原配置信息,备份磁盘路径,上传路径,是否备份是否上传等信息。后续脚本封装将读取这些配置信息进行备份。

1、SQL Server自动化运维 - 备份(一)业务数据库

注:由于还原是以备份信息为基础,所以配置信息需要放在一起。此处暂时刻忽略还原内容。

--运维配置库,收集本地服务器所有自动化信息;包括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备份信息记录表

记录备份大小,开始时间,结束时间,上传时间等等;以便统计和备份异常处理。

1、SQL Server自动化运维 - 备份(一)业务数据库

--备份信息记录表
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
spx_Backup_DelFile

相关文章:

  • 2021-12-14
  • 2022-02-04
  • 2021-09-03
  • 2022-12-23
  • 2022-12-23
  • 2021-12-03
  • 2021-11-15
  • 2022-12-23
猜你喜欢
  • 2021-05-28
  • 2021-08-22
  • 2022-01-26
  • 2021-12-10
  • 2022-12-23
  • 2021-10-11
相关资源
相似解决方案