“restore with recovery ”:还原过后可以立即使用数据库
“restore with norecovery ”:还原过后,数据库处于“正在还原中”的状态,并且无法使用,后续还可以继续对数据库进行还原操作。如果要正常使用数据库,执行命令“restore database [数据库名称] with recovery ”就可以了,数据库的状态就正常了。
所以我们之类选择的第三种,还原过后,数据库可以使用,也可以继续还原。
备用文件这里需要拷贝一下,后续的还原还会用到。
可以点一下脚本,工具会将我们的操作,生成命令的方式,让我们更好的理解。
USE [master] RESTORE DATABASE [TestRestore] FROM DISK = N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVERMSSQLBackupTestRestore.bak' WITH FILE = 1, MOVE N'data1' TO N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVER2016MSSQLDATATestRestore.mdf', MOVE N'log' TO N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVER2016MSSQLDATATestRestore_log.ldf', STANDBY = N'D:Program FilesMicrosoft SQL ServerMSSQL15.MSSQLSERVERMSSQLBackupTestRestore_RollbackUndo_2022-01-10_15-06-24.bak', NOUNLOAD, STATS = 5 GO
如果是默认的数据库名字(不修改),那就不需要move的两个参数,如果要修改名称,最好将数据集所在路径为数据库名称,日志的路径为数据库名称+“_log”。也可以在文件选项页面勾选“将所有文件重新定位到文件夹”
点击确定,提示成功还原
在对象资源管理器看到数据库的状态是“只读”的,没毛病,因为我们的需求就是根据阿里云的数据库来还原,需求本就是单项传输。
5、下载阿里云日志备份文件阿里云开放文档:阿里云 OpenAPI 开发者门户https://next.api.aliyun.com/api/Rds/2014-08-15/DescribeLogBackupFiles?sdkStyle=old¶ms=%7B%7D
阿里云的开发文档,说的很明白了,仔细一点看入参和出现。
注意检索的时间的的格式“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:LogBackup2_hins20409680_2022010612430876102306TestRestore.lbak' WITH FILE = 1, STANDBY = N'D:Program FilesMicrosoft SQL ServerMSSQL13.MSSQLSERVER2016MSSQLBackupTestRestore_RollbackUndo.bak', NOUNLOAD, STATS = 10
出现错误了,“该 LSN 太早”或者“该 LSN 太晚”,证明数据库的事务没链接上,这种还原方式必须是依次累计的,可以理解为增量。必须是“完整备份”之后的日志,逐个按照“LogBeginTime”顺序进行还原。
找到正确顺序的日志备份文件进行还原,成功了
错误1:无法处理数据库 'TestRestore',因为它正由此会话使用
解决方案:左上角选择的数据替换为master,或者,命令加入“use master”。
错误2:无法打开备份设备“……”
解决方案:注意看disk后面的路径、文件名、文件后缀是否正确,阿里云备份文件的文件后缀为“lbak”
错误3:无法还原日志备份或差异备份,因为没有文件可用于前滚。经过测试,如果同样的日志备份成功还原过后 ,再次执行,就会出现这样的错误
解决方案:删除数据库,从头开始恢复,所以在还原语句里一定要加上STANDBY 文件,测试反复恢复同一个日志文件都不会再出现错误
错误4:因为数据库正在使用,所以无法获得对数据库的独占访问权。
解决方案:删除数据库的所有进程微软mssql,杀掉指定数据库的进程_jieling07的博客-CSDN博客declare @sql nvarchar(500),@temp varchar(1000);declare @spid int;declare @dbname varchar(100);set @dbname='数据库名称';set @sql='declare getspid cursor for select spid from sysprocesses where dbid=db_id('''+@dbname+''') and spid > 50 and spid <>.https://blog.csdn.net/jieling07/article/details/122413615
总结1、完整备份数据库,进行还原,选择模式为“restore with standby”。
2、还原方式为“事务日志”,并且只能是依次顺序的。
3、Restore Log 一定加入参数“STANDBY = '完整备份还原那里standby文件完整路径' ”,否则一旦实现错误,导致错误3的情况,数据库的状态发生改变,只能重头还原了。
文档里写了很多语句,因为需求是要和程序结合一起实现的,后面在程序中都会用到。
2022-03-23 更新项目中可能用到对多个库进行还原,我们只下载日志还原文件到指定的目录。比如数据库在112,113,114,文件下载到服务器111。数据库是访问不了111的文件的,所以我们需要对111设置文件共享,然后命令指向的文件会有所调整,如下:N'\10.10.55.113dlogtest.lbak'
RESTORE LOG [test] FROM DISK = N'\10.10.55.111dlogtest.lbak' WITH FILE = 1, STANDBY = N'E:datahins19261749_2022031212021216052915test.bak', NOUNLOAD, STATS = 5;
\10.10.55.113dlog,以IP地址的形式去指向,盘符后面不需要跟随冒号“:”。



