1、在阿里云数据库里面找到最近的一次完整备份,没有就做一次完整备份
2、下载完整备份到本地并还原,本地不用创建数据库,还原的时候会自动生成
3、选择完整的备份文件过后,窗口会改变状态为“就绪” ,然后勾选要还原的备份资源
4、转到选项,恢复状态选择第三个“restore with standby”,解释一下对其他两个状态的理解
“restore with recovery ”:还原过后可以立即使用数据库
“restore with norecovery ”:还原过后,数据库处于“正在还原中”的状态,并且无法使用,后续还可以继续对数据库进行还原操作。如果要正常使用数据库,执行命令“restore database [数据库名称] with recovery ”就可以了,数据库的状态就正常了。
所以我们之类选择的第三种,还原过后,数据库可以使用,也可以继续还原。
备用文件这里需要拷贝一下,后续的还原还会用到。
可以点一下脚本,工具会将我们的操作,生成命令的方式,让我们更好的理解。
USE [master]
RESTORE DATABASE [TestRestore] FROM
DISK = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\TestRestore.bak'
WITH FILE = 1,
MOVE N'data1' TO N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER2016\MSSQL\DATA\TestRestore.mdf',
MOVE N'log' TO N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER2016\MSSQL\DATA\TestRestore_log.ldf',
STANDBY = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Backup\TestRestore_RollbackUndo_2022-01-10_15-06-24.bak',
NOUNLOAD, STATS = 5
GO
如果是默认的数据库名字(不修改),那就不需要move的两个参数,如果要修改名称,最好将数据集所在路径为数据库名称,日志的路径为数据库名称+“_log”。也可以在文件选项页面勾选“将所有文件重新定位到文件夹”
点击确定,提示成功还原
在对象资源管理器看到数据库的状态是“只读”的,没毛病,因为我们的需求就是根据阿里云的数据库来还原,需求本就是单项传输。
5、下载阿里云日志备份文件
阿里云的开发文档,说的很明白了,仔细一点看入参和出现。
注意检索的时间的的格式“yyyy-MM-ddTHH:mmZ”,这里的时间和我们的时间相差8小时,我们上面全量备份开始时间是在“2022年1月9日 02:11:00”,我们检索的开始时间就应该是“2020-01-08T18:00Z”。
6、下载日志备份文件,进行还原
选择还原的方式为“事务日志”
如果工具中的“事务日志”和“页”是灰色的,就是数据库还原的时候,模式错误,一定要选择“restore with standby”。
点击脚本,看看具体的sql命令
use master;
RESTORE LOG [TestRestore] FROM
DISK = N'D:\LogBackup\2_hins20409680_2022010612430876102306\TestRestore.lbak'
WITH FILE = 1,
STANDBY = N'D:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER2016\MSSQL\Backup\TestRestore_RollbackUndo.bak',
NOUNLOAD, STATS = 10
出现错误了,“该 LSN 太早”或者“该 LSN 太晚”,证明数据库的事务没链接上,这种还原方式必须是依次累计的,可以理解为增量。必须是“完整备份”之后的日志,逐个按照“LogBeginTime”顺序进行还原。
找到正确顺序的日志备份文件进行还原,成功了
错误1:无法处理数据库 'TestRestore',因为它正由此会话使用
解决方案:左上角选择的数据替换为master,或者,命令加入“use master”。
错误2:无法打开备份设备“……”
解决方案:注意看disk后面的路径、文件名、文件后缀是否正确,阿里云备份文件的文件后缀为“lbak”
错误3:无法还原日志备份或差异备份,因为没有文件可用于前滚。经过测试,如果同样的日志备份成功还原过后 ,再次执行,就会出现这样的错误
解决方案:删除数据库,从头开始恢复,所以在还原语句里一定要加上STANDBY 文件,测试反复恢复同一个日志文件都不会再出现错误
错误4:因为数据库正在使用,所以无法获得对数据库的独占访问权。
总结
1、完整备份数据库,进行还原,选择模式为“restore with standby”。
2、还原方式为“事务日志”,并且只能是依次顺序的。
3、Restore Log 一定加入参数“STANDBY = '完整备份还原那里standby文件完整路径' ”,否则一旦实现错误,导致错误3的情况,数据库的状态发生改变,只能重头还原了。
文档里写了很多语句,因为需求是要和程序结合一起实现的,后面在程序中都会用到。
2022-03-23 更新
项目中可能用到对多个库进行还原,我们只下载日志还原文件到指定的目录。比如数据库在112,113,114,文件下载到服务器111。数据库是访问不了111的文件的,所以我们需要对111设置文件共享,然后命令指向的文件会有所调整,如下:N'\\10.10.55.113\d\log\test.lbak'
RESTORE LOG [test] FROM DISK = N'\\10.10.55.111\d\log\test.lbak'
WITH FILE = 1,
STANDBY = N'E:\data\hins19261749_2022031212021216052915\test.bak',
NOUNLOAD, STATS = 5;
\\10.10.55.113\d\log,以IP地址的形式去指向,盘符后面不需要跟随冒号“:”。