[总结]Ms Sql 2000资料库备份方案

相关存储过程

 

/*-----------------------------------------------------------------------------------------------------------------------
名  称:收缩数据库 
调用对像:
备注说明:
程序作者:
-------------------------------------------------------------------------------------------------------------------------
修改日期        修改内容
-------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------*/
CREATE PROCEDURE [dbo].[UP_ShrinkDb]
(
    @DbName varchar(100)        ----Database Name
)
AS
BEGIN
    SET NOCOUNT ON
    
        --DUMP TRANSACTION @DbName WITH NO_LOG
        
        BACKUP LOG @DbName WITH NO_LOG
        
        DBCC SHRINKDATABASE(@DbName)

    SET NOCOUNT OFF
END
GO

 

/*-----------------------------------------------------------------------------------------------------------------------
名  称:备份资料库
调用对像:
备注说明:
程序作者:
-------------------------------------------------------------------------------------------------------------------------
--备份当前数据库    一星期做一次
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_Full.Bak',
    @BakType = 'DB',
    @AppendFile = 1

--差异备份当前数据库    一天做一次
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_Dif.Bak',
    @BakType = 'DF',
    @AppendFile = 1

--备份当前数据库日志    一个小时做一次
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_Log.Bak',
    @BakType = 'Log',
    @AppendFile = 1
-------------------------------------------------------------------------------------------------------------------------
修改日期        修改内容
-------------------------------------------------------------------------------------------------------------------------

-----------------------------------------------------------------------------------------------------------------------*/
CREATE PROCEDURE [dbo].[UP_BackupDb]
(
    @DbName SYSNAME='',                    --要备份的数据库名称,不指定则备份当前数据库
    @BakPath NVARCHAR(260),                    --备份文件的存放目录
    @BakFileName NVARCHAR(260)='',                --备份文件名,文件名中可以用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间
    @BakType NVARCHAR(10)='DB',                --备份类型:'DB'备份数据库,'DF' 差异备份,'LOG' 日志备份
    @AppendFile BIT=1                    --追加/覆盖备份文件
)
AS
BEGIN
    SET NOCOUNT ON
    
    DECLARE @Sql VARCHAR(8000)
    IF ISNULL(@DbName,'')='' SET @DbName=DB_NAME()
    IF ISNULL(@BakFileName,'')='' SET @BakFileName='\DBNAME\_\DATE\_\TIME\.BAK'
    
    IF Right(@BakPath,1)<>'\' SET @BakPath=@BakPath+'\'
    SET @BakPath = @BakPath + CAST(DATEPART(YEAR,GETDATE()) AS VARCHAR(10)) + '_' + CAST(DATEPART(Week,GETDATE()) AS VARCHAR(10))+'\'
    
    DECLARE @Cmd VARCHAR(500)
    SELECT @Cmd='MD '+ @BakPath
    Exec master..xp_cmdshell @Cmd,no_output
    
    SET @BakFileName=REPLACE(REPLACE(REPLACE(@BakFileName,'\DBNAME\',@DbName)
    ,'\DATE\',CONVERT(VARCHAR,GETDATE(),112))
    ,'\TIME\',REPLACE(CONVERT(VARCHAR,GETDATE(),108),':',''))
    SET @Sql='BackUp ' + Case @BakType WHEN 'LOG' THEN 'Log ' Else 'DataBase ' End + @DbName +' To Disk=''' + @BakPath + @BakFileName + ''' With ' + Case @BakType WHEN 'DF' THEN 'DIFFERENTIAL,' Else '' End + Case @AppendFile WHEN 1 THEN 'NOINIT' Else 'INIT' END
    SET @Sql = @Sql + ',Name=''' + Case @BakType WHEN 'DB' THEN 'DB Full Bak' WHEN 'DF' THEN 'DB Differential Bak' ELSE 'DB Log Bak' End + ''''
    PRINT(@Sql)
    EXEC(@Sql)

    SET NOCOUNT OFF
END
GO

 

--做测试时新增数据的Sql

declare @i int;set @i=1;
while @i<=10000
begin
    INSERT INTO Test
    (
        Name,
        CrUID,
        LastMoUID
    )
    VALUES
    (
        'TEST','admin','admin'
    )
    set @i=@i+1
end
--显示行数、保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间。
exec sp_spaceused Test
GO

SELECT COUNT(*) FROM Test --30001
TRUNCATE TABLE Test

备份方案

/*
* 完整备份,因资料量大,建议一星期做一次,可以每星期天01:10开始处理
* 在做完整备份前建议先做好日志备份,再做数据库收缩,这样做完整备份会相对小
* 当然第一次做完整备份的时候可以不做日志备份,前面没有完整备份做这个也没有意义。
* 
*  
*/
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_\TIME\_Log.Bak',
    @BakType = 'Log',
    @AppendFile = 1
EXEC UP_ShrinkDb
    @DbName = 'Northwind'
EXEC UP_BackupDb
     @DbName = 'Northwind',
     @BakPath = 'C:\Northwind\',
     @BakFileName = '\DBNAME\_\DATE\_\TIME\_Full.Bak',
     @BakType = 'DB',
     @AppendFile = 1

/*
* 差异备份当前数据库,相对前一次完整备份的差异数据,建议一天做一次。
* 可以在每晚的23:10开始处理
* 在做差异备份前建议先做日志备份,再做数据库收缩。
* */
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_\TIME\_Log.Bak',
    @BakType = 'Log',
    @AppendFile = 1
EXEC UP_ShrinkDb
    @DbName = 'Northwind'
EXEC UP_BackupDb
     @DbName = 'Northwind',
     @BakPath = 'C:\Northwind\',
     @BakFileName = '\DBNAME\_\DATE\_\TIME\_Dif.Bak',
     @BakType = 'DF',
     @AppendFile = 1

/*
* 日志备份,建议一小时做一次。
* 每一个整点做一次日志备份,
* */
EXEC UP_BackupDb
    @DbName = 'Northwind',
    @BakPath = 'C:\Northwind\',
    @BakFileName = '\DBNAME\_\DATE\_\TIME\_Log.Bak',
    @BakType = 'Log',
    @AppendFile = 1
    

 

 如下图所示,点击相应菜单后会出现图二。

             (图一)

 

          (图二)

上图中很清楚的列出了数据库的备份数据,选择“数据库”还原方式时,很方便在这里恢复到还原点。

另外我们再说一说其它两种还原方式:

[从文件组或文件]方式还原:

文件和文件组备份只能恢复到其所属的数据库。您不能使用相同的结构和文件名创建一个新的空白数据库,然后尝试还原单个文件组备份 ;必须将它还原到现有的数据库,或在其他位置执行完整数据库还原。

 

[从设备]方式还原:

还原时需从完整备份再到最后一个差异备份,接著再还原日志备份,日志备份还原时需要从最早的到最晚的一个一个还原。

 

注意事项

1,不论是差异还是日志备份,前是都必需要有完整备份。
2,在截断日志前一定要做日志备份,同样遇到资料库问题时也需要先做日志备份。这样才可以保证恢复到故障点。
3,差异备份备份的是从上次完整备份后的差异数据。
4,日志备份备份的是自上次备份【无论是完整,差异,日志】后的日志

 

参考资料

http://www.cnblogs.com/Athrun/archive/2007/12/17/1003810.html

http://blog.csdn.net/fenghlc/article/details/6002056

原文地址:https://www.cnblogs.com/Athrun/p/mssql_backup.html