磁盘卷 'E:\' 上的可用空间不足,无法创建数据库
前两天搬迁SQL Server数据库,要将数据还原在新服务器的D盘,日志还原在E盘。但是E盘空间不足,报了下图错误。
There is insufficient free space on disk volume 'E:\' to create the database.
客户要求日志是能还原在E盘,并且E盘空间不给增加,即使给,时间也来不及。
注:使用的是 SQL Server 2016, 数据库恢复模式为Full。
遍搜互联网,加上自己的总结,有以下三种解决方法。
1. 收缩日志文件,重新Full备份。
备份数据库时,会将日志也一起备份,减小日志文件大小,需要备份的日志就小了。减小日志文件大小有以下两种方式。
a.先备份日志,后收缩日志
BACKUP LOG [DatabaseName] TO DISK = 'D:\DatabaseName_Log.trn' GO DBCC SHRINKFILE (N'DatabaseName_Log' , 1) GO
由于几个月没有备份日志了,需要备份的日志太多,花时太长,所以没有尝试该方法。
第一次备份截断了日志,往后的尝试都不花时间了,只是会多生成几个备份文件。
b.改恢复模式为Simple,收缩日志,再改回Full
GO -- Truncate the log by changing the database recovery model to SIMPLE. ALTER DATABASE [DatabaseName] SET RECOVERY SIMPLE; GO -- Shrink the truncated log file to 1 MB. DBCC SHRINKFILE ([DatabaseName_log], 1); GO -- Reset the database recovery model. ALTER DATABASE [DatabaseName] SET RECOVERY FULL; GO
简单粗暴,花时少,但总感觉会有什么副作用。
但收缩日之后还得备份数据库,100G左右,需要两个小时,等不来。遂找找看有没有其他方法。
2.用mdf文件还原数据库。
SQL Server数据库文件包含mdf数据文件和ldf日志文件,可以用这两个或者干脆只用mdf文件还原数据库,而不是非得用备份文件。
只用mdf文件还原就可以绕过日志问题了。找到这个方法之后,兴冲冲的去尝试。
试过之后发现,mdf文件无法通过网络传输。这应该是微软的一个安全机制,他只允许你通过U盘拷贝到目标服务器。
只能找找看怎么进行我一开始就想到,但是不懂怎么实施的方法3了。
3.将日志还原到空间足够的盘,再缩小日志文件,迁移到E盘。
如何更改日志还原的位置,这里不赘述。
缩小日志文件的方法见前文方案1,我采用的是b方法。
迁移日志
USE MASTER ALTER DATABASE [DatabaseName] SET OFFLINE ALTER DATABASE [DatabaseName] MODIFY FILE ( NAME = N'DatabaseName_log' , FILENAME = N'E:\DatabaseName_log.ldf' ) ALTER DATABASE [DatabaseName] SET ONLINE