Sql Server数据库备份脚本以及如何在阿里云云数据库RDS还原数据库(代码源自阿里云)
今天研究阿里云服务数据库的迁移,备份和还原的时候,在阿里云web后台发现了一个很好用的sql脚本,就默默地偷了过来,它可以支持全量备份,差异备份和日志备份,代码解释也都很清楚,我也尝试着跑了一下,性能也还是蛮不错的,本地电脑运行压缩后1个多G的数据备份用了二十多秒

我们可以将下面代码放到SQL作业里面,然后定期的去做全量和差异的备份,这不免也算是一种不错的数据库备份方案了,当然这种备份功能完全可以用SqlServer自带的数据库维护计划功能代替,而且阿里云等类似的云数据库都是会提供数据备份服务的,不需要开发人员自己做数据备份。
代码如下,如果有用阿里云服务器的码友可以直接到用户后台下载最新源码
USE master
GO /**
* author:
* jianming.wjm@alibaba-inc.com of Alibaba Cloud Team.
*
* @purpose:
* Backup your databases to local directory (no matter destination folder exist or not).
* You can personal your backup type, support three backup types include(FULL, DIFF, LOG).
* This script also support just check to see details or run directly.
*
* if you find something happen unhappy, please kindly tell us via the author email. thanks.
*
* @usage:
* Copy all the script (ctrl + a) into SSMS, fill out the public variables and then F5 or Execute it.
*
* @parameters:
* @backup_databases_list: databases list needed to backup
* @backup_type: which backup type needed, choice one of ['FULL', 'DIFF', 'LOG']
* @backup_folder: where backup files located
* @is_run: I want to run or just check, 1: run; 0: just check.
*
* @version:
* 1.0.0, 2018/03/02 15:20: Create script.
*
* @Tips:
* We'd like to advice you to change your databases to FULL recovery model to improve migrate to RDS.
* example: ALTER DATABASE [db_simple] SET RECOVERY FULL WITH NO_WAIT
* pay attention to the SSMS output messages, and correct the error if have any.
**/ SET NOCOUNT ON -- declare public variables
DECLARE
@backup_databases_list NVARCHAR(max),
@backup_type SYSNAME,
@backup_folder SYSNAME,
@is_run TINYINT
; -- YOU HAVE TO INIT PUBLIC VARIABLES HERE!!!!
SELECT
/**
* Databases list needed to backup, delimiter is ; or ,
* empty('') or null: means all databases excluding system database
* example: '[testdb];TestDR,Test,readonly'
**/
@backup_databases_list = N'[TestA];[TestB],readonly,Test',
@backup_type = N'FULL', -- Backup Type? FULL: FULL backup; DIFF: Differential backup; LOG: Log backup
@backup_folder = N'C:\BACKUP', -- Backup folder to store backup files.
@is_run = 1 -- Check or run? 1, run directly; 0, just check
; -- variables checking
IF @backup_type NOT IN(N'FULL', N'DIFF', N'LOG')
BEGIN
RAISERROR('Backup type %s is not supported!', 16, 1, @backup_type)
RETURN
END
; IF ISNULL(@backup_folder, N'') = N''
BEGIN
RAISERROR('backup_folder is not allow empty!', 16, 1)
RETURN
END IF @is_run NOT IN(0, 1)
BEGIN
RAISERROR('is_run parameter should be 0 or 1 !', 16, 1)
RETURN
END -- declare private variables
DECLARE
@database_name SYSNAME,
@database_state TINYINT,
@database_state_desc NVARCHAR(60),
@database_count INT,
@database_do INT,
@flag_edition BIT,
@exec_sql NVARCHAR(MAX),
@timestamp VARCHAR(20),
@context_info VARCHAR(20),
@backup_databases_list_XML XML
; -- private variables init.
SELECT
@database_name = N'',
@database_state = 11,
@database_state_desc = N'',
@database_count = 0,
@database_do = 1,
@flag_edition = CASE
WHEN CONVERT(sysname, SERVERPROPERTY(N'Edition')) LIKE N'Enterprise%' THEN 1
ELSE 0
END,
@exec_sql = N'',
@timestamp = REPLACE(REPLACE(REPLACE(CONVERT(VARCHAR(19), GETDATE(),120), N'-', N''), N':', N''), CHAR(32), N''),
@backup_folder = CASE
WHEN RIGHT(@backup_folder, 1) = N'\' THEN @backup_folder
ELSE @backup_folder + N'\'
END,
@context_info = N'0x1256698449',
@backup_databases_list_XML =
N'<V><![CDATA[' +
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
REPLACE(
@backup_databases_list, '[', ''
), ']', ''
), ';', ','
),CHAR(10),']]></V><V><![CDATA['
),',',']]></V><V><![CDATA['
),CHAR(13),']]></V><V><![CDATA['
)
+ ']]></V>'
; -- temp table declare to save databases splitted
IF OBJECT_ID('tempdb..#tmp_databases', 'U') IS NOT NULL
DROP TABLE #tmp_databases
CREATE TABLE #tmp_databases(
RowId INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
Database_name SYSNAME
)
; -- get databases name
IF ISNULL(@backup_databases_list, N'') > N''
BEGIN
INSERT INTO #tmp_databases
SELECT DISTINCT
[Database_name] = T.C.value('(./text())[1]','sysname')
FROM @backup_databases_list_XML.nodes('./V') AS T(C)
WHERE T.C.value('(./text())[1]','sysname') IS NOT NULL
;
END
ELSE
BEGIN
INSERT INTO #tmp_databases
SELECT DISTINCT name
FROM sys.databases WITH (NOLOCK)
WHERE name NOT IN (N'master', N'tempdb', N'model', N'msdb', N'distribution')
END -- decalre cursor to loop each database.
DECLARE CUR_DatabaseList CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY
FOR
SELECT DISTINCT name, state, state_desc
FROM sys.databases WITH (NOLOCK)
WHERE name IN(SELECT [Database_name] FROM #tmp_databases) -- Open cursor and get the rowcount
OPEN CUR_DatabaseList
FETCH NEXT FROM CUR_DatabaseList INTO @database_name, @database_state, @database_state_desc
SET @database_count = @@CURSOR_ROWS; -- prepare folder on local host.
IF @database_count > 0
BEGIN
EXEC sys.xp_create_subdir @backup_folder
END WHILE @@FETCH_STATUS = 0
BEGIN
-- contact the backup script for each backup type.
SET
@exec_sql =
CASE
WHEN @backup_type = N'FULL'
THEN N'BACKUP DATABASE ' + QUOTENAME(@database_name)
+ N' TO DISK = N' + QUOTENAME(@backup_folder + @database_name + N'_' + @backup_type + N'_' + @timestamp + N'.bak', '''')
+ N' WITH STATS = 1' + CASE
WHEN @flag_edition = 1 THEN N', COMPRESSION;'
ELSE N';'
END
WHEN @backup_type = N'DIFF'
THEN N'BACKUP DATABASE ' + QUOTENAME(@database_name)
+ N' TO DISK = N' + QUOTENAME(@backup_folder + @database_name + N'_' + @backup_type + N'_' + @timestamp + N'.bak', '''')
+ N' WITH DIFFERENTIAL, STATS = 1' + CASE
WHEN @flag_edition = 1 THEN N', COMPRESSION;'
ELSE N';'
END
WHEN @backup_type = N'LOG'
THEN N'BACKUP LOG ' + QUOTENAME(@database_name)
+ N' TO DISK = N' + QUOTENAME(@backup_folder + @database_name + N'_' + @backup_type + N'_' + @timestamp + N'.bak', '''')
+ N' WITH STATS = 1' + CASE
WHEN @flag_edition = 1 THEN N', COMPRESSION;'
ELSE N';'
END
ELSE N''
END
; RAISERROR('--==============%d/%d: Working on database: %s', 10, 1, @database_do , @database_count, @database_name) WITH NOWAIT; --Only online database can be Backup.
IF @database_state = 0
BEGIN
RAISERROR('-- %s', 10, 1, @exec_sql) WITH NOWAIT; IF @is_run = 1
BEGIN
SET
@exec_sql = N'SET CONTEXT_INFO ' + @context_info + N';' + @exec_sql
;
EXEC sys.sp_executesql @exec_sql
END
END
ELSE
BEGIN
RAISERROR('-- database %s state: %s can''t be backup, skipped.', 10, 1, @database_name, @database_state_desc) WITH NOWAIT;
END SET @database_do = @database_do + 1;
FETCH NEXT FROM CUR_DatabaseList INTO @database_name, @database_state, @database_state_desc
END -- close and release cursor.
CLOSE CUR_DatabaseList
DEALLOCATE CUR_DatabaseList
GO
还有一点需要注意的是阿里云云数据库RDS是不支持数据库直接操作还原的,在云数据库上操作还原数据库会报如下错误

那么我们如何在阿里云数据库还原数据呢?人家阿里云爸爸也提供了相应的解决方案——OSS备份数据恢复,它可以将指定数据库文件还原到云数据库
相关功能可以参考链接 https://help.aliyun.com/document_detail/68310.html
Sql Server数据库备份脚本以及如何在阿里云云数据库RDS还原数据库(代码源自阿里云)的更多相关文章
- sql server 定时备份 脚本
) DECLARE @date DATETIME SELECT @date = GETDATE() SELECT @filename = 'G:\backup\NewPlulishSQL-' + CA ...
- Ubuntu Server下MySql数据库备份脚本代码
明: 我这里要把MySql数据库存放目录/var/lib/mysql下面的pw85数据库备份到/home/mysql_data里面,并且保存为mysqldata_bak_2012_04_11.tar. ...
- SQL Server 2008备份数据库失败,拒绝访问的原因
原文:SQL Server 2008备份数据库失败,拒绝访问的原因 备份数据到特定目录是出现拒绝访问,然后测试备份到C盘根目录正常. 查了下原因: 是因为那个目录没有Authenticated Use ...
- sql server 2000备份还原数据库
转载请注明出处:http://blog.csdn.net/neochan1108/article/details/79248017 备份: -- Create the backup device fo ...
- SQL Server差异备份的备份/还原原理
SQL Server差异备份的备份/还原原理 记住一点:差异备份是基于最后一次完整备份的差异,而不是基于最后一次差异的差异 备份过程: 1-完整备份之后有无对数据库做过修改,如果有,记录数据库的最 ...
- Python数据库备份脚本
Python数据库备份脚本 #!/usr/bin/env python # author: liudong # -*- coding: utf-8 -*- # filename: db_bak.py ...
- Windows下MySQL数据库备份脚本(一)
说明: MySQL数据库安装目录:C:\Program Files\MySQL\MySQL Server 5.0 MySQL数据库存放目录:C:\Program Files\MySQL\MySQL S ...
- 使用PowerShell 命令集进行SQL Server 2012 备份和还原
最近心相不错,所以打算翻译一些英文文档做福利,原文在此,翻译有不足的地方还请各位兄弟指点. 讨论什么是DBA最重要的工作的时候,你最常听到就是一条就是DBA只要做好备份和恢复.事实如此,如果你不做备份 ...
- SQL Server的备份
原文:SQL Server的备份 0.参考文献 1.恢复模式 SQL Server 备份和还原操作发生在数据库的恢复模式的上下文中. 恢复模式旨在控制事务日志维护. “恢复模式”是一种数据库属性,它控 ...
- SQL Server 远程备份详解
例1: 有A数据库服务器,B本机: 我现在想通过在B机器上通过代码调用SQL来执行A数据库的备份到B机器上 调用的SQL语句为:Backup Database MYDATABASE To Disk=' ...
随机推荐
- Git 命令操作记录
1.安装完git软件之后(win系统的) 1)配置用户名密码: 设置本地机器默认commit的昵称与Email. 请使用有意义的名字与email. git config --global user.n ...
- 基于TrueLicense实现产品License验证功能
受朋友所托,需要给产品加上License验证功能,进行试用期授权,在试用期过后,产品不再可用. 通过研究调查,可以利用Truelicense开源框架实现,下面分享一下如何利用Truelicense实现 ...
- 生成类似于MongoDB产生的ObjectId
package com.jt.boot.utils; import com.google.common.base.Objects; import java.net.NetworkInterface; ...
- EF Core 实现多租户
目录 SAAS 和多租户 多租户数据隔离方案 使用 EF Core 简单实现多租户 单数据库实现 多数据库实现 源代码 参考 SAAS 和多租户 SaaS(软件及服务)区别于其他应用程序的主要特征就是 ...
- Oracle数据库之PL/SQL程序基础设计
一.PL/SQL块结构 前边我们已经介绍了PL/SQL块的结构,再来回顾一下: DECLARE /* * 声明部分——定义常量.变量.复杂数据类型.游标.用户自定义异常 */ BEGIN /* * 执 ...
- [BZOJ 5074]小B的数字
Description 题库链接 给你一个长度为 \(n\) 的序列 \(a_1,a_2,\cdots,a_n\) ,让你生成另一个序列 \(b_1,b_2,\cdots,b_n\) ,使得 \(\f ...
- Day1:了解APICloud平台、理解APICloud应用设计思想、掌握平台使用流程。学习如何对一款APP进行需求分析、功能分解和架构设计等编码之前重要的准备工作
学习目标 总体上了解一下APICloud平台,重点介绍相关的学习资源,入门资料,常见的FAQ等 明确我们这七天要开发一个什么样的APP,明确功能需求,跟上每天的课程节奏,可以课前预习 梳理出对于一款A ...
- select SCOPE_IDENTITY()用法
select SCOPE_IDENTITY() 返回上面操作的数据表最后row的IDENTITY 列的值: 返回插入到同一作用域中的 IDENTITY 列内的最后一个 IDENTITY 值.一个作用域 ...
- 【redis中键的生存时间(expire) 】
1.redis中可以使用expire命令设置一个键的生存时间,到时间后redis会自动删除它 expire 设置生存时间(单位/秒) pexpire 设置生存时间( ...
- Java8简明学习之Optional
Java在8的版本,新增了Optional和lambda表达式,使得日常开发中对于NullPointException的判断变的优雅. 现在来个例子看看在Optional之前对空的判断. @Test ...