前言

最近公司服务器到期,需要进行数据迁移,而数据库属于多而繁琐,通过图形化界面一个一个备份所需时间成本很大,所以想着写一个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. 你需要知道的MySQL&InnoDB锁都在这里

    目录 一.前言 二.锁的类型 2.1 全局锁 2.2 表级锁 2.2.1 表锁 2.2.2 元数据锁(Meta Data Locks) 2.2.3 自增列锁(AUTO-INC Locks) 2.2.4 ...

  2. asp.net core使用identity+jwt保护你的webapi(三)——refresh token

    前言 上一篇已经介绍了identity的注册,登录,获取jwt token,本篇来完成refresh token. 开始 开始之前先说明一下为什么需要refresh token. 虽然jwt toke ...

  3. Spring事件,ApplicationEvent在业务中的应用

    前言 关于事件驱动模型,百度百科在有明确的解释.在JDK的Util包里抽象了事件驱动,有兴趣的朋友可以自行去看下相关类的定义.Spring事件模型ApplicationEvent是基于JDK里的事件模 ...

  4. 【Java技术专题】「性能优化系列」针对Java对象压缩及序列化技术的探索之路

    序列化和反序列化 序列化就是指把对象转换为字节码: 对象传递和保存时,保证对象的完整性和可传递性.把对象转换为有字节码,以便在网络上传输或保存在本地文件中: 反序列化就是指把字节码恢复为对象: 根据字 ...

  5. [JVM-6]类加载器

    定义 前面说过加载阶段是一个可以让设计人员高度自控的模块,因为类文件的源头可以是多种多样的,代码生成.反射生成或从网络中生成等.因此类加载器作为对这些文件的处理就显得尤为重要. 但类加载器的功能不仅如 ...

  6. 【原创】浅谈指针(五)const和指针

    前言 过了几个月再次更新.最近时间也不多了,快要期中考试了,暂且先少写一点吧. 本文仅在博客园发布,如在其他平台发现均为盗取,请自觉支持正版. 练习题 我们先来看几道题目.如果这几道题都不会的话,就先 ...

  7. 【UE4 C++】关卡切换、流关卡加载卸载

    切换关卡 基于 UGameplayStatics:: OenLevel UGameplayStatics::OpenLevel(GetWorld(), TEXT("NewMap") ...

  8. Java:并发笔记-04

    Java:并发笔记-04 说明:这是看了 bilibili 上 黑马程序员 的课程 java并发编程 后做的笔记 本章内容-3 线程状态转换 活跃性 Lock 3.10 重新理解线程状态转换 假设有线 ...

  9. 2021.8.14考试总结[NOIP模拟39]

    T1 打地鼠 全场就俩人没切,还有一个是忘关$freopen$了. $code:$ 1 #include<bits/stdc++.h> 2 #define rin register sig ...

  10. 一从二主IIC连接调试

    最近有个项目需要实现快速开机出摄像头预览(2s内),但是我的板子linux上的qt应用起来都要10s左右了,于是在硬件上增加了一个屏驱芯片TW8836,这是一个mcu,可以直接获取摄像头数据送到lcd ...