度量快速开发平台-专业、快速的软件定制快开平台

标题: SQL 实现定期备份数据库 [打印本页]

作者: fteair    时间: 2020-2-9 17:32
标题: SQL 实现定期备份数据库
  1. --------------------------------------------------------------------------
  2. --Subject:数据库批量备份存储过程(判断盘符、路径,错误盘符返回,不存在的路径自动创建)
  3. --适用环境:SQL Server 2005及以上版本(主要用于作业中调用以及程序开发中调用)
  4. --------------------------------------------------------------------------
  5. ---通过使用sp_configure启用‘xp_cmdshell’
  6. USE [master]
  7. GO
  8. sp_configure 'show advanced options',1
  9. reconfigure
  10. go
  11. sp_configure 'xp_cmdshell',1
  12. reconfigure
  13. go
  14. ---下面开始备份数据库操作

  15. USE master
  16. GO
  17. --1.周期性备份数据库代码(保留原来备份的):
  18. --备份文件名为:原数据库名称+'_'+备份日期.bak
  19. IF OBJECT_ID('sp_backupdatabase') IS NOT NULL
  20.     DROP PROC sp_backupdatabase
  21. GO
  22. CREATE PROC sp_backupdatabase
  23. @path NVARCHAR(100)--路径
  24. AS
  25. --路径名格式标准化
  26. IF RIGHT(@path,1)<>'\' SET @path=@path+'\'
  27. --获取文件夹信息
  28. DECLARE @t TABLE(id INT IDENTITY,a INT,b INT,c INT)
  29. DECLARE @fpath NVARCHAR(3)
  30. SET @fpath=LEFT(@path,3)
  31. INSERT @t EXEC master..xp_fileexist @fpath
  32. INSERT @t EXEC master..xp_fileexist @path
  33. --如果指定盘符有误不存在,则返回错误提示:
  34. IF EXISTS(SELECT 1 FROM @t WHERE id=1 AND c=0)
  35. BEGIN
  36.     RAISERROR(N'输入的盘符不存在,请重新输入!',16,1)
  37.     RETURN
  38. END
  39. --如果不存在指定的文件夹,则创建:
  40. ELSE IF EXISTS(SELECT 1 FROM @t WHERE b=0 AND id=2)
  41. BEGIN
  42.     DECLARE @mddir NVARCHAR(100)
  43.     SET @mddir='md '+@path
  44.     EXEC MASTER..xp_cmdshell @mddir
  45. END
  46. --开始备份数据库到指定的目录
  47. DECLARE @s nvarchar(4000)
  48. SELECT @s=ISNULL(@s+';','')
  49.         +N'BACKUP database ['+name+'] TO DISK = '''
  50.         +@path+name+'_'+CONVERT(NVARCHAR(8),getdate(),112)+N'.bak'''
  51. FROM master..sysdatabases
  52. WHERE name NOT IN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库
  53. AND NAME ='book09'--此处可以指定任意某个数据库,也可以屏蔽该行则全部备份
  54. EXEC(@S)
  55. GO
  56. --调用方法:
  57. EXEC sp_backupdatabase 'e:\DB\ByDate\testBackupDB'
  58. /*
  59. --返回信息:
  60. 已为数据库 'book09',文件 'book09_Data' (位于文件 1 上)处理了 224 页。
  61. 已为数据库 'book09',文件 'book09_Log' (位于文件 1 上)处理了 1 页。
  62. BACKUP DATABASE 成功处理了 225 页,花费 0.358 秒(4.910 MB/秒)。
  63. --备份后的文件列表:
  64. book09_20130310.bak
  65. */


  66. --2.周期性备份数据库代码(自动删除原备份文件):
  67. --备份文件名为:原数据库名称.bak
  68. IF OBJECT_ID('sp_backupdatabase') IS NOT NULL
  69.     DROP PROC sp_backupdatabase
  70. GO
  71. CREATE PROC sp_backupdatabase
  72. @path NVARCHAR(100)--路径
  73. AS
  74. --路径名格式标准化
  75. IF RIGHT(@path,1)<>'\' SET @path=@path+'\'
  76. --获取文件夹信息
  77. DECLARE @t TABLE(id INT IDENTITY,a INT,b INT,c INT)
  78. DECLARE @fpath NVARCHAR(3)
  79. SET @fpath=LEFT(@path,3)
  80. INSERT @t EXEC master..xp_fileexist @fpath
  81. INSERT @t EXEC master..xp_fileexist @path
  82. --如果指定盘符有误不存在,则返回错误提示:
  83. IF EXISTS(SELECT 1 FROM @t WHERE id=1 AND c=0)
  84. BEGIN
  85.     RAISERROR(N'输入的盘符不存在,请重新输入!',16,1)
  86.     RETURN
  87. END
  88. --如果不存在指定的文件夹,则创建:
  89. ELSE IF EXISTS(SELECT 1 FROM @t WHERE b=0 AND id=2)
  90. BEGIN
  91.     DECLARE @mddir NVARCHAR(100)
  92.     SET @mddir='md '+@path
  93.     EXEC master..xp_cmdshell @mddir
  94. END
  95. --开始备份数据库到指定的目录
  96. DECLARE @s nvarchar(4000)
  97. SELECT @s=ISNULL(@s+';','')
  98.         +N'BACKUP database ['+name+'] TO DISK = '''
  99.         +@path+name+N'.bak''  WITH INIT'
  100. FROM master..sysdatabases
  101. WHERE name NOT IN('master','tempdb','model','msdb','pubs')--这里筛选不参加备份的数据库
  102. AND NAME ='book09'--此处可以指定任意某个数据库,也可以屏蔽该行则全部备份
  103. EXEC(@S)
  104. GO
  105. --调用方法:
  106. EXEC sp_backupdatabase 'e:\DB\ByDate\testBackupDB'
  107. /*
  108. --返回信息:
  109. 已为数据库 'book09',文件 'book09_Data' (位于文件 1 上)处理了 224 页。
  110. 已为数据库 'book09',文件 'book09_Log' (位于文件 1 上)处理了 1 页。
  111. BACKUP DATABASE 成功处理了 225 页,花费 0.456 秒(3.854 MB/秒)。
  112. --备份后的文件列表:
  113. book09.bak
  114. */
复制代码

作者: 张兴康    时间: 2020-2-10 14:09

作者: 张兴康    时间: 2020-2-10 14:12
学习了




欢迎光临 度量快速开发平台-专业、快速的软件定制快开平台 (http://bbs.delit.cn/) Powered by Discuz! X3.2