【问题标题】:How to rename the Physical Database Files如何重命名物理数据库文件
【发布时间】:2011-06-13 02:43:38
【问题描述】:

我使用 tsql 来分离这样的数据库:

EXEC sp_detach_db @dbname = 'my_db'

然后我使用 PHP 来重命名物理文件。我能够重命名 mdf 文件,但不能重命名 ldf 文件!我什至尝试了一个dos命令REN,但这也不适用于ldf文件!

我想问一下,物理日志文件有什么特别的地方不能重命名吗?

有更好的方法吗?

谢谢大家

【问题讨论】:

  • 第一个问题是你为什么要这么做?
  • 我正在尝试正确重命名。分离数据库后,我无法创建具有相同名称的数据库,因为物理文件名仍然相同。

标签: sql-server tsql mdf ldf


【解决方案1】:

分离数据库,重命名文件,重新附加。

【讨论】:

  • 唯一的事情是在执行分离操作之前记下与您的数据库关联的 .mdf、.ndf 和 .ldf 文件的路径和文件名。如果您有多个数据库在同一默认 SQL Server 安装位置创建其数据、辅助数据和日志文件,那么您稍后在重新连接数据库时可能会感到困惑。
  • 你可以使用SSM GUI detach,使用windows explorer to rename the files,但是你需要使用TSQL to re-attach
  • 对于在 Linux 上使用 SQL Server 的任何人,您可能需要从命令行使用 sqlcmd 工具按照Microsoft documentation 重新附加。我尝试通过 SSMS 并没有运气
【解决方案2】:
  1. 备份原数据库
  2. 删除原始数据库
  3. 从备份中恢复原始数据库,但名称不同;恢复的数据库的文件也将根据新的数据库名称自动命名。

【讨论】:

  • 如此简单!谢谢。
  • 由于某种原因,逻辑文件名保持不变(在我的情况下)但这不是问题,因为物理文件名确实发生了变化
【解决方案3】:

“ALTER DATABASE (your database) MODIFY FILE”命令只会重命名逻辑名称。这篇文章展示了如何使用 xp_cmdshell 来重命名物理文件:http://www.mssqltips.com/sqlservertip/1891/best-practice-for-renaming-a-sql-server-database/

请注意以下几点:
1. xp_cmdshell 将在 SQL Server 进程运行的用户下执行,可能没有重命名数据库文件所需的文件系统权限
2.出于安全考虑,记得禁用xp_xmdshell

以下是如何根据上述博客文章进行重命名的示例。它将用数据库 NewMyDB 替换数据库 MyDB。原始 MyDB(重命名为 MyDB_OLD)将保持分离状态。

-- Enable xp_cmdshell:
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

-- Get physical file names:
declare @MyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB')
declare @MyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'MyDB_log')
declare @NewMyDBOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB')
declare @NewMyDBLogOriginalFileName nvarchar(300) = (select physical_name FROM sys.master_files where name = 'NewMyDB_log')
declare @Command nvarchar(500)
declare @Sql nvarchar(2000)

IF (EXISTS (select * from sys.databases where name = 'NewMyDB') 
AND EXISTS (select * from sys.databases where name = 'MyDB'))
BEGIN
    USE master

    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
    ALTER DATABASE NewMyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

        -- Set new database name
        ALTER DATABASE MyDB MODIFY NAME = MyDB_OLD
        ALTER DATABASE NewMyDB MODIFY NAME = MyDB

        -- Update logical names
        ALTER DATABASE MyDB_OLD MODIFY FILE (NAME=N'MyDB', NEWNAME=N'MyDB_OLD')
        ALTER DATABASE [MyDB] MODIFY FILE (NAME=N'NewMyDB', NEWNAME=N'MyDB')

        EXEC master.dbo.sp_detach_db @dbname = N'MyDB_Old'
        EXEC master.dbo.sp_detach_db @dbname = N'MyDB'

        -- Rename physical files
        SET @Command = 'RENAME "' + @MyDBOriginalFileName + '" "MyDB_OLD.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @MyDBLogOriginalFileName + '" "MyDB_OLD_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBOriginalFileName + '" "MyDB.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command
        SET @Command = 'RENAME "' + @NewMyDBLogOriginalFileName + '" "MyDB_log.mdf"'; PRINT @Command
        EXEC xp_cmdshell @Command

        -- Attach with new file names
        declare @NewMyDBFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB',  'MyDB')
        declare @NewMyDBLogFileNameAfterRename nvarchar(300) = replace(@NewMyDBOriginalFileName, 'NewMyDB_log',  'MyDB_log')
        SET @Sql = 'CREATE DATABASE MyDB ON ( FILENAME = ''' + @NewMyDBFileNameAfterRename + '''), ( FILENAME = ''' + @NewMyDBLogFileNameAfterRename + ''') FOR ATTACH'
        PRINT @Sql
        EXEC (@Sql)

    ALTER DATABASE MyDB SET MULTI_USER 

END

-- Disable xp_cmdshell for security reasons:
GO
sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
GO

【讨论】:

  • 请使用提供的链接中的一些摘录/摘要来扩展您的答案。链接本身不是答案。而且...链接可能会过时
【解决方案4】:

您可以使用ALTER DATABASE 语句来做到这一点 - 像这样:

ALTER DATABASE database_name
   MODIFY FILE ( NAME = logical_file_name, 
                 FILENAME = ' new_path/os_file_name_with_extension ' )

您需要单独修改每个文件,例如如果您有多个数据文件,则需要修改每个文件。

详情请见Technet documentation on this topic

【讨论】:

  • 要让它真正起作用,我必须手动移动文件或重命名文件,对吗? SQL Server 不会为我做这件事,这是我试图自动化的部分。
  • 没错,执行上述命令后,您需要将数据库切换到离线状态,将文件物理重命名并切换回在线状态。
【解决方案5】:

重命名SQL server physical database files 的最简单方法是:

  1. 打开并连接到您要重命名的数据库所在的SQL server
  2. 在查询窗口中执行以下脚本以更改物理名称和逻辑名称。请记住将所有“OldDatabaseName”替换为您想要更改其名称的数据库的新名称(“NewDatabaseName”)。将所有 NewDatabaseName 替换为您要为数据库设置的新名称

use OldDatabaseName

ALTER DATABASE OldDabaseName MODIFY FILE (NAME='OldDatabaseName', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName.mdf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME='OldDatabaseName_log', FILENAME='C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\NewDatabaseName_log.ldf');

ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName, NEWNAME = NewDatabaseName);
ALTER DATABASE OldDatabaseName MODIFY FILE (NAME = OldDatabaseName_log, NEWNAME = NewDatabaseName_log);
  1. 然后右键单击OldDatabaseName,选择Tasks,然后选择Take Offline

  2. 转到物理文件所在的位置 (C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\...) 并将它们重命名为您在编号 2 中指定的 NewDatabaseName。请记住检查这些文件在您的计算机上使用的绝对路径。李>
  3. 返回Microsoft SQL Server Management Studio。右键单击OldDatabaseName,选择Tasks,然后选择Bring Online
  4. 最后,将您的OldDatabaseName 重命名为NewDatabaseName。你完成了:-)

【讨论】:

  • 你也可以先做ALTER DATABASE NewDatabaseName SET OFFLINE,然后在做ALTER DATABASE NewDatabaseName SET ONLINE之前修改文件名。
  • 只是说文件“旧名”不存在
【解决方案6】:
  1. 分离(右键单击数据库)

  2. 重命名两个文件(ldf 和 mdf): C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA

  3. 附加(右键单击“数据库”顶部文件夹)

【讨论】:

    猜你喜欢
    • 2016-05-20
    • 2015-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多