Answers:
您不必停止SQL Server服务即可移动数据库文件,但必须使特定的数据库脱机。这是因为在访问文件时无法移动文件,并且使数据库脱机会阻止SQL Server应用程序使用文件。
移动它们的过程非常简单。已经描述了分离/附接,但是它并不复杂。
使用以下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
注意,您无需在此命令中声明旧位置。更改此路径不会立即生效,但将在下次数据库启动时使用。
使数据库脱机
(我WITH ROLLBACK IMMEDIATE
经常将所有人踢出并回滚所有当前未完成的交易)
ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;
将文件移动/复制到新位置
只需使用您喜欢的方法复制文件即可(单击'n拖动,XCopy,Copy-Item,Robocopy)
使数据库联机
ALTER DATABASE foo SET ONLINE;
您可以在此处看到更详细的描述。
MODIFY FILE
顺序是可以更改的。如果先运行MODIFY FILE,它会告诉您命令已成功运行,并且在脱机在线操作后位置会更改(措辞有所不同,但您会明白)。但是,出于明显的原因,脱机->移动文件->联机顺序确实很重要。还要标记Demonslay335的注释。文件权限很重要。
数据库联机时,MDF和LDF文件受到保护,无法移动。
如果您不介意停止数据库的工作,则可以DETACH
将其删除,然后再移动文件ATTACH
。
Properties
Files
标签Path
与FileName
MDF和LDF文件。如果您不想最终搜索丢失的文件,则此步骤很重要。Tasks -> Detach
Databases
服务器的节点Attach
Add
按钮OK
你现在应该没事。有关信息DETACH
- ATTACH
过程,可以发现在这里。
在关于DETACH
- 的链接中,ATTACH
建议将using ALTER DATABASE
语句保持在SQL Server的相同实例上。在移动用户数据库中有更多参考。
如果要在移动时保持其运行,请执行BACKUP
- RESTORE
。在还原过程中,您可以定义数据库文件的新位置。
要移动系统数据库文件,请按照下列步骤操作:
在SSMS中以sa用户身份登录
为了安全起见,请备份用户创建的数据库。
杀死所有从SSMS连接到服务器的会话。
执行以下命令,检查系统数据库的当前文件位置:
USE master;
SELECT * FROM sys.master_files;
标识路径并记下文件的当前路径。
使用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");
现在文件位置已更改。
确保同时移动ldf和mdf文件
在SSMS中,右键单击服务器,然后选择属性。内部属性转到“数据库设置”。将数据库默认位置更改为“数据”,然后将“日志”更改为目标路径。从服务器注销。
例如:更改C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
为E:\projects\DataBaseFiles\MSSQL\DATA\
停止SQL Server实例。
将一个或多个文件复制到新位置。使用Robocopy移动文件,以便将访问权限复制到目标文件夹。打开cmd并以管理员身份运行,并使用以下命令:
robocopy / sec源文件夹目标文件夹
最好去源位置运行命令。删除复制的系统数据库文件以外的其他文件。例如:
robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
(在这里,我们将所有系统数据库文件移动到新位置。)
在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
如果计划的主数据文件重定位为E:\ SQLData,则参数值将按以下方式更改:
-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf
通过右键单击实例名称并选择“停止”来停止SQL Server实例。重新启动SQL Server实例。
以sa
用户身份登录SSMS,并通过执行以下查询来验证数据库文件的位置:
USE master;
SELECT * FROM sys.master_files;
全部做完。
您会逐步进行:
关闭所有连接
ALTER DATABASE MyDB SET SINGLE_USER WITH ROLLBACK IMMEDIATE
将数据库设置为脱机状态
ALTER DATABASE MyDB SET OFFLINE
到新路径
ALTER DATABASE MyDB MODIFY FILE(Name = MyDB,Filename ='N:\ DATA \ MyDB.MDF')
将数据库
设置为在线状态ALTER DATABASE MyDB SET ONLINE
设置多用户
ALTER DATABASE MyDB SET MULTI_USER
有一种方法可以移动数据库数据文件(尚不确定是否可以对日志文件执行此操作),而无需使数据库脱机。
Dejan Nakarada-Kordic在此提供了此方法的解释+脚本:https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline
简短的版本是在新位置添加另一个数据库文件,然后使用DBCC Shrinkfile(带有选项EMPTYFILE)将数据从旧文件移动到新文件。完成后,您可以删除旧的数据文件。
不是我的解决方案,而是我自己在寻找该解决方案,并发现它对我们的生产环境非常有用。
索芬
遵循以下简单的4个步骤:
CurrentLocation
列中显示的路径。
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');
我不确定这是否是最好的方法(我欢迎任何评论告诉我它不是这样),但是它非常简单(如果您的数据库很小,则很快):
首先,将数据库备份到.bak文件。然后,从相同的.bak文件还原数据库,在还原任务的文件选项下选择新的.mdf和.ldf文件位置。
我不会在维护窗口的生产环境中这样做,因为在还原过程中您无法访问数据库。我上面看到的其他方法也有类似的缺点。恢复任务完成后,您不必删除旧文件。它是自动完成的。
要补充现有的答案:这是一个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';
注意:
替换REPLACE(f.physical_name, 'C:\', 'D:\')
为要对文件路径进行的任何转换。
master
是免税的,因为其路径由SQL Server的启动选项确定(有关详细信息,请参阅此答案)。
USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location