首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >备份所有数据库的脚本

备份所有数据库的脚本
EN

Database Administration用户
提问于 2015-10-19 16:26:58
回答 3查看 7.7K关注 0票数 2

我正致力于在SQL2008SQLExpress上自动备份Server数据库。这些备份每天由Windows任务计划程序发起,它执行批处理文件,然后执行SQL脚本。我不能使用SQL代理,因为这是快速版本。

目前,我正在编写一个脚本,逐个备份每个数据库。但是,这是相当高的维护--每次添加、删除或重命名数据库时,我都必须修改这个脚本以反映这些更改。相反,我想编写一个单独的SQL脚本,它可以一次备份所有数据库,而不需要逐个显式地备份每个数据库。

这是当前用于备份单个数据库的脚本:

代码语言:javascript
运行
复制
Print 'Backing up MyDatabase...'
BACKUP DATABASE MyDatabase
TO DISK = 'F:\Backups\SQL Databases\MyDatabase.bak'
   WITH FORMAT,
      NAME = 'Full Backup of MyDatabase';
GO

如何枚举所有数据库的列表并执行循环对所有数据库执行此备份?

只是备份过程的一些附加说明:

  • Windows中的计划任务每天晚上9:00执行批处理文件
  • 批处理文件调用执行SQL脚本的OSQL。
  • OSQL输出保存结果的文本文件。
  • 大约有30个数据库需要备份。
  • 有些数据库超过2GB (因此需要一些时间)
  • 第三方备份服务获取所产生的备份文件,并在每晚午夜将其推送到场外。
EN

回答 3

Database Administration用户

发布于 2015-10-19 16:34:33

我相信您可以参考ola.hallengren。 SQL server备份脚本。

正如关于如何使用的说明:

没有Server代理。因此,必须使用cmd文件和Windows计划的任务来安排存储过程的执行。遵循以下步骤。

  • 下载MaintenanceSolution.sql。
  • 执行MaintenanceSolution.sql。此脚本创建所需的存储过程。
  • 创建用于执行存储过程的cmd文件;例如: sqlcmd -E -S .\SQLEXPRESS -d -Q "EXECUTE dbo.DatabaseBackup @Databases = 'USER_DATABASES',@Directory = N'C:\Backup',@BackupType = 'FULL'“-b -o C:\Log\DatabaseBackup.txt
  • 在Windows计划任务中,创建要调用cmd文件的任务。
  • 安排任务。
  • 启动任务并验证它们是否已成功完成。

现在,您可以根据需要轻松地修改它。

注意:在MaintenanceSolution中,您只能单独下载SQL server备份脚本。

票数 5
EN

Database Administration用户

发布于 2017-01-07 13:21:10

您可以像这样使用SELECT语句或游标:

代码语言:javascript
运行
复制
DECLARE @PathForBackUp VARCHAR(255)
SET @PathForBackUp = 'F:\Backup\User DB\'

SELECT 'BACKUP DATABASE [' + name + '] TO  DISK = N''' + @PathForBackUp + '' + name + '.bak''
WITH NOFORMAT, NOINIT,  NAME = N''' + name + '_FullBackUp'', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 5'
FROM sys.databases
WHERE database_id > 4

代码语言:javascript
运行
复制
DECLARE @DBName VARCHAR(255)  
DECLARE @PathForBackUp VARCHAR(255) 
DECLARE @FileName VARCHAR(255)  
DECLARE @DateFile VARCHAR(255)
DECLARE @SQL NVARCHAR(2048) 
SET @PathForBackUp = 'F:\Backup\User DB\'  
SET @DateFile = REPLACE(REPLACE(CONVERT(VARCHAR(20),GETDATE(),120) ,' ','T'), ':','') 

DECLARE BACKUPING CURSOR FOR   
SELECT name  
FROM master.dbo.sysdatabases WHERE dbid > 4 

OPEN BACKUPING    
FETCH NEXT FROM BACKUPING INTO @DBName    
WHILE @@FETCH_STATUS = 0    

BEGIN    
        SET @FileName = @PathForBackUp + @DBName + '_' + @DateFile + '.BAK'  
    SET @SQL = 'BACKUP DATABASE '+@DBName+ ' TO DISK = '''+@FileName+''' WITH COMPRESSION ' 
    PRINT @SQL 
    EXECUTE sp_executesql @sql   
    FETCH NEXT FROM BACKUPING INTO @DBName  

END    

CLOSE BACKUPING    
DEALLOCATE BACKUPING 
票数 0
EN

Database Administration用户

发布于 2015-10-19 23:09:06

虽然Microsoft不久将不再推荐sp_msforeachdb,但这对您来说应该是可行的。将其打包到存储过程/作业中,确保帐户有写入驱动器的权限。

代码语言:javascript
运行
复制
sp_msforeachdb @command1='
DECLARE @string NVARCHAR(500) 
SET @string = CONVERT(NVARCHAR(20),GETDATE(),120)
SET @string = REPLACE(REPLACE(REPLACE(@string,''
'',''''),'':'',''''),''-'','''')
SET @string = REPLACE(@string, '' '', '''')
SET @string = ''
BACKUP DATABASE # TO DISK = N''''F:\BACKUPS\SQL DATABASES\#_FULL_''+@string+''.bak''
SET @string = @string + ''''''
WITH FORMAT, NAME = N''''Full Backup of #''''''
IF ''#''not in(''master'', ''tempdb'',''msdb'',''model'')
begin PRINT @string  execute sp_executesql @string end' 
,@replacechar='#'

示例执行输出:

代码语言:javascript
运行
复制
BACKUP DATABASE DatabaseDuo TO DISK = N'F:\BACKUPS\SQL DATABASES\DatabaseDuo_FULL_20151019190410.bak'
WITH FORMAT, NAME = N'Full Backup of DatabaseDuo'

BACKUP DATABASE Databaaase TO DISK = N'F:\BACKUPS\SQL DATABASES\Databaaase_FULL_20151019190410.bak'
WITH FORMAT, NAME = N'Full Backup of Databaaase'

BACKUP DATABASE GarbageBase TO DISK = N'F:\BACKUPS\SQL DATABASES\GarbageBase_FULL_20151019190410.bak'
WITH FORMAT, NAME = N'Full Backup of GarbageBase'

请注意,这将忽略主数据库、msdb和模型数据库。但会为你备份其他一切。

票数 -1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/118482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档