我这边会定时备份数据库数据,备份采用 完整备份(1天)+日志备份(60分钟)。通过FTP把备份文件从A服务器传输给B服务器。通过批处理执行脚本还原。 先还原完整备份 然后再还原日志备份。然后回滚 。
2015年一切执行正常,但是在2016-01-01开始就还原失败,失败提示如下:
执行脚本:
1、磁盘只有C、E盘符,并且空间足够。根本就没有D盘,这是bak文件生成备份时之前A服务器上sqlserver的DATA路径。
2、B服务器上对应数据库里的DATA下只有mdf与ldf日志文件。根本就没有ndf文件存在。
3、通过命令去指定位置:
还是不行。提示一样,没有ndf文件存在。我手动在数据库sqlserver下DATA文件夹创建对应的ndf文件。还是不行。
4、手动执行完整备份。通过命令restore filelistonly from disk='c:/Northwind.bak'查询到只存在basedata.mdf与basedata_log.ldf文件。直接执行还原 OK。
5、通过从A服务器传过来的完整备份。通过命令得到除上面之外还存在30多个ndf文件。而对应需要还原的数据库下却没有ndf文件。然后执行。效果如下:
现在不知道是何原因导致。请大家帮忙看一下。多谢!
我觉得可能是完整备份bak文件的问题?有没有大神帮忙看看 ,提出解决方案?
小于5G就能还原成功?
对!大小在4G左右没有问题,当在5G左右就出现问题
@泪幽无痕: 建议首先确认一下2016-01-23这天的完整备份本身是否有问题了
@dudu: 应该不会,因为我分别测试了其他时间点的。bak大小在5G左右 都这样。其他的都没问题 不知道问题出在哪
@泪幽无痕: 是不是硬盘分区剩余空间不够了?
@泪幽无痕: 既然没有D盘,那还原时需要修改一下数据库文件的位置
@dudu: 哪为什么我之前没有指定位置就能成功? 我这边测试了一下 ,数据是在2016-01-01就开始出这个错了。不知道跟这个时间有没有关系? 还是对面的数据库在今年做了什么改动。我这边先试试,加上位置路径
@dudu: 直接完整备份里面的逻辑文件名只要 mdf文件以及ldf文件 这个可以直接还原
通过完整备份 +事务日志备份 里面完整备份出了上面的两个文件外还有其他的一些次要文件ndf
我已经把数据库删了再重新创建 去还原 之前2015年的都执行成功 就2016执行失败 。现在都失败了 都出现一样的错误信息
查看了sqlserver里DATA文件夹 里面只有 SAMDB.mdf与SAMDB.ldf文件
设置了指定位置,看看位置有没有写错?
@泪幽无痕: 参考SQL Server 备份和还原全攻略,在“还原为”处可以修改路径
现在的问题是这样的:
我手动备份bak文件里面只有mdf与ldf文件。直接手动还原没有问题
我再去执行通过系统备份的bak文件。查看到他里面出了mdf与ldf日志文件之外 ,还多出了30多个文件组等次要文件 ndf。
需要还原的数据库对应在sqlserver/DATA文件夹下只有对应的basedata.mdf与basedata.ldf数据文件,根本就没有ndf文件。
现在出了错就是
1、还原的服务器上根本就没有这个路径。这是在做备份哪台服务器上备份的路径
2、要还原的数据库对应的sqlserver/DATA根本就没有对应的 xxx.ndf文件。
以前通过以下代码执行还原没有问题。
现在却不行了。我尝试删除数据库再新建相同的数据库。在未删除之前2015年的都没有问题。在删除新建数据库之后 2015 2016都不行了。现在的问题就这样。我把之前的删了。太多了。看着头晕
这样的备份有局限性,版本之间不兼容,还容易出错,我一般备份都是用Navicat软件直接将数据同步到另外一台机器,非常方便,就是数据量大的时候,需要一些时间,你不妨试试看,希望能够帮助到你。
使用sqlserver数据库时,当数据量剧增的时候,mdf文件会变得很大,这时我们可以创建文件组来把数据分割。
如果是完整备份,他会把mdf文件、ldf文件、分割出来的文件组多个ndf(可理解为是mdf文件的一部分)文件一起打包,并且会带上数据库存储文件的路径。
当在另一台服务器上执行还原的时候,如果数据库DATA文件夹的位置跟之前备份的不一致时,会还原失败。当两个数据库位置一样的时候就没有这个问题。所以解决的办法有以下三点:
1、删除sqlserver 重新安装,安装的路径跟备份的数据库路径一致。
2、路径不一致时:如果提示需要使用move to来标示新的位置。这时,可通过脚本手动去修改文件位置。执行还原OK。
3、路径不一致时:可采用批处理自动还原,所以先得到备份时所有数据的逻辑文件名,然后遍历所有逻辑文件名拼接成sql语句。然后执行 OK!
其实说得简单一点,出现上面的问题是因为备份的数据文件找不到对应存储的路径。可采用修改数据库位置、手动修改路径手动或者批处理自动修改路径去指定。