分离/复制/附加后,MS SQL Server使用旧的日志文件位置

时间:2011-07-21 09:21:02

标签: sql sql-server

我在文件夹“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,它看起来是不可能的。如果有人知道如何做到这一点 - 拜托,我也很高兴知道它!

2 个答案:

答案 0 :(得分:2)

Edit2 :据我所知,SQL Server无法重新创建日志文件。它可以缩小ldf,但只在mdf存在时才创建它。


将文件从d:\test\复制到d:\test_new\时,不要删除 d:\test_new\Test_log.ldf

将日志文件保留在那里,因为如果没有该日志文件,则无法重新附加新数据库。之后,您可以将该日志缩小到最小尺寸。

所以,要合成:

  1. 将文件从d:\test\复制到d:\test_new\并保留日志 归档那里。
  2. 运行您在问题中发布的create database脚本(第2点)。
  3. 运行以下脚本将日志缩小到最小尺寸
  4. 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命令后没有错误,那么一切正常

    希望这有帮助

    Microsoft article on how to move files

答案 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