我在文件夹“d:\ test”中创建数据库“Test”。数据库文件是“d:\ test \ Test.mdf”和“d:\ Test \ Test_log.ldf”。我从MS SQL Server 2008 R2分离数据库,复制所有文件到新文件夹(“d:\ test_new”),删除日志文件( “d:\ test_new \ Test_log.ldf”),并尝试从新位置再次附加数据库。当我使用SQL Server Management Studio并选择“d:\ test_new \ Test.mdf”文件时,它确定日志文件位于“d:\ test \ Test_log.ldf”(旧位置)。如何将此数据库与重建日志附加到新位置?试想一下,我无法将ldf文件再次复制到新位置,并且它仍然可用,因此SQL Server仍然可以看到它。我想对SQL Server说 - “拜托,忘记那个日志文件,并在这里创建新的日志文件”。如果你帮我使用T-SQL脚本会更好,但如果它是Management Studio中的步骤 - 我会自己将它转换为脚本。
我已经尝试过了:
1
CREATE DATABASE [test]
ON ( FILENAME = N'D:\test_new\test.mdf' )
FOR ATTACH_REBUILD_LOG
从旧位置附加日志文件(FOR ATTACH - 相同)
2
CREATE DATABASE [test]
ON ( FILENAME = N'D:\test_new\test.mdf' )
LOG ON ( FILENAME = N'D:\test_new\test_log.ldf' )
FOR ATTACH_REBUILD_LOG
返回错误:无法打开物理文件“D:\ test_new \ test_log.ldf”。操作系统错误2:“2(找不到文件。)”。
3
sp_attach_db and sp_attach_single_file_db
也受到了考验。我甚至检查了他们的源代码 - 他们只是创建动态SQL并调用CREATE DATABASE ... FOR ATTACH语句。
问题慢慢变为:“有可能吗?”
好吧,对于当前版本的SQL Server,它看起来是不可能的。如果有人知道如何做到这一点 - 拜托,我也很高兴知道它!
答案 0 :(得分:2)
Edit2 :据我所知,SQL Server无法重新创建日志文件。它可以缩小ldf,但只在mdf存在时才创建它。
将文件从d:\test\
复制到d:\test_new\
时,不要删除 d:\test_new\Test_log.ldf
。
将日志文件保留在那里,因为如果没有该日志文件,则无法重新附加新数据库。之后,您可以将该日志缩小到最小尺寸。
所以,要合成:
d:\test\
复制到d:\test_new\
并保留日志
归档那里。 create database
脚本(第2点)。
USE test
GO
DBCC SHRINKFILE(logicalFileName, 1)
GO
要找出logicalFileName
是什么,请运行sp_helpfile
,这将为您提供日志文件的逻辑文件名:
USE test
GO
EXEC sp_helpfile
GO
更多信息here
修改强>
我认为您首先需要从旧位置分离test
数据库:
(您可以创建一个完成所有操作的脚本,来自以下命令)
C:\> osql -E
1> sp_detach_db 'test'
2> go
3> quit
C:\>
然后将文件复制到新位置。
C:\> copy d:\test\* d:\test_new\*
接下来,将test
数据库附加到新路径位置:
C:\> osql -E
1> sp_attach_db @dbname = N'test', @filename1 = N'd:\test_new\Test.mdf', @filename2 = N'd:\test_new\Test_log.ldf'
2> go
3> quit
C:\>
测试新数据库是否已成功附加:
C:\> osql -E
1> use test
2> go
3> quit
C:\>
如果go
命令后没有错误,那么一切正常
希望这有帮助
答案 1 :(得分:0)
用户必须同时复制.mdf和.ldf文件。然后他们必须使用以下命令(一个或另一个)。
sp_attach_db(不建议使用,将来使用CREATE DATABASE WITH ATTACH)
EXEC sp_attach_db @dbname ='dbname',@ filename1 ='d:\ test_new \ test.mdf',@ filename2 ='d:\ test_new \ test.ldf'
这将导致数据库使用来自\ test_new目录的数据文件(mdf)和事务日志(ldf)
为附件创建数据库
CREATE DATABASE dbname ON'(FILENAME = d:\ test_new \ test.mdf'),(FILENAME ='d:\ test_new \ test.ldf')FOR ATTACH