前言

最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个sql脚本来执行。

开始

  1. 数据库单个备份

  2. 数据库批量备份

  3. 数据库还原

  4. 数据库还原报错问题记录

  5. 总结

1.数据库单个备份

图形化界面备份这里就不展示了,可以自信百度,下面直接贴代码

USE MASTER

IF EXISTS ( SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[BackupDataProc]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

DROP PROCEDURE BackupDataProc

go

create proc BackupDataProc

@FullName Varchar(200)--入参(数据库名)

as

begin

Declare @FileFlag varchar(50)

Set @FileFlag='C:\myfile\database\'+@FullName+'.bak'--备份到哪个路径(C:\myfile\database\)根据自己需求来定

BackUp DataBase @FullName To Disk=@FileFlag with init--核心代码

end

exec BackupDataProc xxx

执行成功后便会生成一个.bak文件到指定文件夹中,如图

2.数据库批量备份(时间有点长,请等待)

USE MASTER

if exists(SELECT * FROM sys.types WHERE name = 'AllDatabasesNameType')

drop type AllDatabasesNameType

go

create type AllDatabasesNameType as table--自定义表类型用于存储数据库名称

(

rowNum int ,

name nvarchar(60),

filename nvarchar(300)

)

go

IF EXISTS ( SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[BachBackupDataProc]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

DROP PROCEDURE BachBackupDataProc

go

create proc BachBackupDataProc

@filePath nvarchar(300)--入参,备份时的目标路径

as

begin

Declare @AllDatabasesName as AllDatabasesNameType --用于存储系统中的数据库名

Declare @i int --循环变量

insert into @AllDatabasesName(name,filename,rowNum) select name,filename,ROW_NUMBER() over(order by name) as rowNum from sysdatabases where name not in('master','tempdb','model','msdb') --赋值

set @i =1

--循环备份数据库

while @i <= (select COUNT(*) from @AllDatabasesName)

begin

Declare @FileFlag varchar(500)

Declare @FullName varchar(50)

Select @FullName =name from @AllDatabasesName where rowNum = @i

Set @FileFlag=@filePath+@FullName+'.bak'

BackUp DataBase @FullName To Disk=@FileFlag with init

set @i = @i + 1

end

end

exec BachBackupDataProc 'C:\myfile\database\'

执行结果效果如下图:

3.数据库还原

IF EXISTS ( SELECT * FROM sysobjects WHERE id = OBJECT_ID(N'[ReductionProc]') AND OBJECTPROPERTY(id, N'IsProcedure') = 1 )

DROP PROCEDURE ReductionProc

go

create proc ReductionProc

@Name nvarchar(200)--入参 数据库名称

as

begin

Declare @DiskName nvarchar(500)

Declare @FileLogName nvarchar(100)

Declare @FileFlagData nvarchar(500)

Declare @FileFlagLog nvarchar(500)

Set @FileLogName = @Name + '_log'

Set @DiskName = 'C:\myfile\database\'+@Name+'.bak' ---(源)备份文件路径

Set @FileFlagData='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\'+@Name+'.mdf'---(目标)指定数据文件路径

Set @FileFlagLog='C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\'+@FileLogName+'.ldf'---目标)指定日志文件路径

RESTORE DATABASE @Name --为待还原库名

FROM DISK = @DiskName ---备份文件名

WITH MOVE @Name TO @FileFlagData, ---指定数据文件路径

MOVE @FileLogName TO @FileFlagLog, ---指定日志文件路径

STATS = 10, REPLACE

end

go

exec ReductionProc xxx

执行后便能还原库(我是拿这三个库做测试,截的图可能没什么变化,你们可以尝试下)

4.数据库还原报错问题记录

当然还原的过程可能会遇到一些问题,比如:

1.版本不一样

2.SQL Sql 逻辑文件'XXXXX ' 不是数据库'YYY'的一部分。请使用 RESTORE FILELISTONLY 来列出逻辑文件名。

版本的话我试过了,高版本可以向下兼容,但是低版本不能向上兼容,可以统一版本来解决(如有更好的解决方案欢迎打扰)

第二个问题呢就是脚本中‘MOVE’ 他只能跟逻辑名,而有些数据库的逻辑名并不是数据库名称,所以需要替换一下,

下面是查询数据库逻辑名的sql语句:

USE MASTER

restore filelistonly from disk='D:\sql201database\Sence.bak'--根据自己的需求要变更路径

如图,

对于这些逻辑名与数据库名称不一致的情况可以单独拿出来重新执行一下即可:

USE MASTER --这里注意要使用MASTER,以免出现待还原库被占用的情况

RESTORE DATABASE Sence --为待还原库名

FROM DISK = 'D:\sql201database\Sence.bak' ---备份文件名

WITH MOVE 'Sence_Guangxi' TO 'D:\Database\Data\Sence.mdf', ---指定数据文件路径

MOVE 'Sence_Guangxi_log' TO 'D:\Database\Data\Sence_log.ldf', ---指定日志文件路径

STATS = 10, REPLACE

GO

5.总结

数据是无价的,对数据库操作时备份是必须的。

数据是无价的,对数据库操作时备份是必须的。

数据是无价的,对数据库操作时备份是必须的。(重要的事说三遍)

初次发文,请斧正!!!

SQL Server2019数据库备份与还原脚本,数据库可批量备份的更多相关文章

  1. 快速备份和还原 MySQL 数据库的另一种方法

    一直使用 SQL Server 作为公司产品的数据库来存储系统数据,所以备份还原一直都不是问题,因为 SQL Server 的备份还原非常迅速和易用.但今年公司改变策略,使用起 MySQL 数据库作为 ...

  2. ORACLE RMAN备份及还原 RMAN能够进行增量备份:数据库,表空间,数据文件

    ORACLE RMAN备份及还原   RMAN能够进行增量备份:数据库.表空间.数据文件 仅仅有使用过的block能够被备份成backup set 表空间与数据文件相应关系:dba_data_file ...

  3. 使用数据泵expdp、impdp备份和还原oracle数据库

    前面我已经整理过EXP 和 IMP备份和还原Oracle数据库的方法 今天我们只讲使用数据泵 expdp 和impdp的方法,有的同学会问他们有什么差别呢? EXP和IMP是客户端工具程序,它们既可以 ...

  4. Java在线备份和还原MySQL数据库。

    2018年6月29日14:00:48 阅读数:1534 今天整了整整一整天,终于使用Java在线备份和还原MySQL数据库了,哎,备份倒是很快,就是在还原的时候遇到了一个问题,也不报错,结果将sql语 ...

  5. SQL SERVER完整、差异和事务日志备份及还原(脚本和GUI实现) [原创]

    一.完整备份.差异备份和事务日志备份的脚本 --完整备份数据库 BACKUP DATABASE Test_Bak TO DISK = 'E:\20150609_75\bak\Test_bak_full ...

  6. 备份与还原mysql 数据库的常用命令。

    一.备份数据: Mysqldump常用命令: mysqldump -u用户名 -p密码 --databases 数据库1 数据库2 > xxx.sql 常见选项: -u: 用户名 -p: 密码 ...

  7. mysql数据库-备份与还原-Percona XtraBackup 2.4备份工具使用

    目录 xtrabackup 特点 备份生成的相关文件 xtrabackup 安装 xtrabackup 用法 1 备份 2 预备份 3 还原 4 其他 还原注意事项 xtrabackup实现完全备份及 ...

  8. 备份与还原ORACLE数据库(通过CMD命令执行)

    31.1:(若用程序调用cmd,则在备份和还原 末尾语句加上 2>&1 ,直接运行则不需要加) --备份:     1) exp SA/"""abc@123 ...

  9. MSSQL数库备份与还原脚本(多个库时很方便)

    每次通过 Management Studio 的界面操作备份或还原数据库,对于单个数据库还好,要是一次要做多个.那就还是用脚本快些,下面有两段脚本分享一下. ===================== ...

随机推荐

  1. sqlserver 2000 insert注入的问题

    一个sql server 2000的注入点猜测语句如下:insert into t1(col1, col2, col3) values('注入点1','数据点2','xxx');注入点1的值可以通过o ...

  2. Sentry 监控 - 全栈开发人员的分布式跟踪 101 系列教程(第一部分)

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  3. 前端快闪四: 拦截axios请求和响应

    马甲哥继续在同程艺龙写一点大前端: 今天我们来了解一下 如何拦截axios请求/响应? axios是一个基于 promise 的网络请求库,可以用于浏览器和 node.js, promise 类似于C ...

  4. Idea进行java应用的远程调试Remote debugging

    本文可以解决如下两个问题: 1.如何处理和调试那些只发生在生产环境(或其他远程环境)而本地开发环境可能没办法重现的"问题". 2.只有一个可以部署的war/jar包,只有class ...

  5. 使用CSS选择器(第二部分)

    伪类跟伪元素一样,并不是直接针对文档元素的,而是为你基于某些共同特征选择元素提供方便. 使用结构性伪类选择器 使用结构性伪类选择器能够根据元素在文档中的位置选择元素.这类选择器都有一个冒号字符前缀(: ...

  6. SpringBoot之日志注解和缓存优化

    SpringBoot之日志注解和缓存优化 日志注解: 关于SpringBoot中的日志处理,在之前的文章中页写过: 点击进入 这次通过注解+Aop的方式来实现日志的输出: 首先需要定义一个注解类: @ ...

  7. ubuntu修改软件源的方法

    最快方法--替换法 刚安装好的ubutun,打开source.list后,用vim替换的方法将所有的us提付出替换为 cn,然后保存退出,更新即可. # vim /etc/apt/source.lis ...

  8. el-scrollbar滚动条置底

    <el-scrollbar ref="leftScrollbar" style="height: 600px"></el-scrollbar& ...

  9. kiyv Button参数属性

    from kivy.uix.button import Button from kivy.uix.floatlayout import FloatLayout from kivy.app import ...

  10. str数组