如何移动 SQL Server 数据库文件?

138 sql-server backup sql-server-2012

我有一个数据库,想将.mdf.ldf文件移动到另一个位置。但是我不想停止MSSQLSERVER服务,也不想导出到另一台服务器。

我怎样才能做到这一点?

Mik*_*Fal 188

您不必停止 SQL Server 服务来移动数据库文件,但必须使特定数据库脱机。这是因为您无法在访问文件时移动文件,并且使数据库脱机会阻止 SQL Server 应用程序使用这些文件。

移动它们的过程相当简单。Detach/Attach 已经描述过,但它几乎没有那么复杂。

使用ALTER DATABASE命令更改文件位置:

USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
             ,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location
Run Code Online (Sandbox Code Playgroud)

请注意,您不需要在此命令中声明旧位置。更改此路径不会立即生效,但会在下次数据库启动时使用。

设置数据库离线

(我WITH ROLLBACK IMMEDIATE过去常常将所有人踢出去并回滚所有当前打开的事务)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;
Run Code Online (Sandbox Code Playgroud)

将文件移动/复制到新位置

只需使用您喜欢的方法复制文件(单击“n Drag”、“XCopy”、“Copy-Item”、“Robocopy”)

使数据库联机

ALTER DATABASE foo SET ONLINE;
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看更详细的描述。

  • 确保在移动数据库文件后,“NT SERVICE\MSSQLSERVER”用户对其具有权限,否则在尝试使数据库重新联机时会出现错误。 (29认同)
  • 这对我有用。就我而言,我还必须使用第一个命令移动 LDF 文件:例如 `USE master; -- 从主 ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf') 做这一切;--文件名是新位置` (18认同)
  • @mlhDev 实际上,在我的情况下,`MODIFY FILE` 顺序是可变的。如果您先运行 MODIFY FILE,它会告诉您命令运行成功,并且在离线-在线操作后位置将更改(措辞不同,但您明白了)。但是,出于显而易见的原因,离线->移动文件->在线顺序确实很重要。还要标记Demonslay335 的注释。文件权限很重要。 (2认同)

小智 59

MDF 和 LDF 文件受到保护,无法在数据库联机时移动。

如果你不介意停止数据库工作,那么你可以DETACH,移动文件然后ATTACH它。

  • 右键单击数据库名称
  • 选择 Properties
  • 转到Files选项卡
  • 请记下的PathFileName的MDF和LDF文件。如果您不想最终搜索丢失的文件,这一步很重要...
  • 右键单击数据库名称
  • 选择 Tasks -> Detach
  • 将文件移动到您想要的位置
  • 右键单击Databases您服务器的节点
  • 选择 Attach
  • 点击Add按钮
  • 指向新位置
  • 点击 OK

你现在应该没事了。有关信息DETACH-ATTACH过程,可以发现在这里

在关于链接中DETACH-如果将数据库保留在 SQL Server 的同一实例上,则ATTACH建议使用 usingALTER DATABASE语句。更多参考移动用户数据库

如果您想在移动时保持运行,请执行BACKUP- RESTORE。在恢复过程中,您可以定义数据库文件的新位置。

  • 我建议以管理员身份打开 SQL Management Studio 以避免重新附加时出现文件访问问题 (5认同)

abh*_*mar 8

要移动系统数据库文件,请执行以下步骤:

  1. 在 SSMS 中以 sa 用户身份登录

  2. 为安全起见,备份用户创建的数据库。

  3. 终止所有从 SSMS 连接到服务器的会话。

  4. 执行以下命令查看系统数据库当前文件位置:

    USE master;
    SELECT * FROM sys.master_files;

确定路径并记下文件的当前路径。

  1. 使用 TSQL 更改除 master 之外的所有数据库的文件路径:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

例如:

ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");

ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");

ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");

ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");

ALTER DATABASE msdb
    MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");
Run Code Online (Sandbox Code Playgroud)

现在文件位置已更改。

确保同时移动 ldf 和 mdf 文件

  1. 在 SSMS 中右键单击服务器并选择属性。内部属性转到 Database Settings 。将数据和日志的数据库默认位置更改为目标路径。从服务器注销。

    例如:更改C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\E:\projects\DataBaseFiles\MSSQL\DATA\

  2. 停止 SQL Server 的实例。

  3. 将文件复制到新位置。使用 Robocopy 移动文件以将访问权限复制到目标文件夹。打开cmd并以管理员身份运行并使用以下命令:

    robocopy /sec 源文件夹目标文件夹

最好去源位置运行命令。删除复制的系统数据库文件以外的其他文件。例如:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
Run Code Online (Sandbox Code Playgroud)

(这里我们将所有系统数据库文件移动到新位置。)

  1. 从“开始”菜单中,依次指向“所有程序”、“Microsoft SQL Server”、“配置工具”,然后单击“SQL Server 配置管理器”。

在 SQL Server 配置管理器中执行以下步骤:

在 SQL Server 服务节点中,右键单击 SQL Server 的实例(例如,SQL Server (MSSQLSERVER))并选择属性。在 SQL Server (instance_name) 属性对话框中,单击启动参数选项卡。在现有参数框中,选择 –d 参数以移动主数据文件。单击更新以保存更改。在“指定启动参数”框中,将参数更改为 master 数据库的新路径。在现有参数框中,选择 –l 参数以移动主日志文件。单击更新以保存更改。在“指定启动参数”框中,将参数更改为 master 数据库的新路径。

数据文件的参数值必须跟在 -d 参数之后,日志文件的值必须跟在 -l 参数之后。以下示例显示了主数据文件默认位置的参数值。

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf
Run Code Online (Sandbox Code Playgroud)

如果主数据文件的计划重定位为 E:\SQLData,则参数值将更改如下:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf
Run Code Online (Sandbox Code Playgroud)

通过右键单击实例名称并选择停止来停止 SQL Server 实例。重新启动 SQL Server 的实例。

  1. sa在 SSMS中以用户身份登录并通过执行以下查询来验证数据库文件的位置:

    USE master;
    SELECT * FROM sys.master_files;

全部完成。


小智 5

有一种方法可以移动数据库数据文件(尚不确定是否有方法可以对日志文件执行此操作),而无需使数据库脱机。

Dejan Nakarada-Kordic在此处对此方法有解释 + 脚本: https: //www.itprotoday.com/sql-server/move-database-files-without-take-database-offline

简而言之,您在新位置添加另一个数据库文件,然后使用 DBCC Shrinkfile 和选项 EMPTYFILE 将数据从旧文件移动到新文件。完成此操作后,您可以删除旧的数据文件。

不是我的解决方案,我自己正在寻找这个解决方案,发现它对我们的生产环境非常有用。

托芬


小智 5

你一步步做:

  1. 关闭所有连接
    ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE

  2. 将数据库设置为脱机状态
    ALTER DATABASE MyDB SET OFFLINE

  3. 到新路径
    ALTER DATABASE MyDB MODIFY FILE ( Name = MyDB, Filename = 'N:\DATA\MyDB.MDF' )

  4. 将数据库设置为在线状态
    ALTER DATABASE MyDB SET ONLINE

  5. 设置多用户
    ALTER DATABASE MyDB SET MULTI_USER


Hei*_*nzi 5

补充现有答案:这是一个ALTER DATABASE ... MOVE ...为所有数据库创建语句的脚本:

SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) + 
       ' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
       ', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
       ');'
  FROM sys.master_files AS f 
       INNER JOIN sys.databases AS d ON f.database_id = d.database_id
 WHERE d.name <> 'master';
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 替换REPLACE(f.physical_name, 'C:\', 'D:\')为您想要对文件路径进行的任何转换。

  • master是豁免的,因为它的路径是由 SQL Server 的启动选项决定的(例如,有关详细信息,请参阅此答案)。