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)
您可以在此处查看更详细的描述。
小智 59
MDF 和 LDF 文件受到保护,无法在数据库联机时移动。
如果你不介意停止数据库工作,那么你可以DETACH,移动文件然后ATTACH它。
PropertiesFiles选项卡Path和FileName的MDF和LDF文件。如果您不想最终搜索丢失的文件,这一步很重要...Tasks -> DetachDatabases您服务器的节点AttachAdd按钮OK你现在应该没事了。有关信息DETACH-ATTACH过程,可以发现在这里。
在关于链接中DETACH-如果将数据库保留在 SQL Server 的同一实例上,则ATTACH建议使用 usingALTER DATABASE语句。更多参考移动用户数据库。
如果您想在移动时保持运行,请执行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");
Run Code Online (Sandbox Code Playgroud)
现在文件位置已更改。
确保同时移动 ldf 和 mdf 文件
在 SSMS 中右键单击服务器并选择属性。内部属性转到 Database Settings 。将数据和日志的数据库默认位置更改为目标路径。从服务器注销。
例如:更改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\
Run Code Online (Sandbox Code Playgroud)
(这里我们将所有系统数据库文件移动到新位置。)
在 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 的实例。
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
你一步步做:
关闭所有连接
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
补充现有答案:这是一个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 的启动选项决定的(例如,有关详细信息,请参阅此答案)。
| 归档时间: |
|
| 查看次数: |
388003 次 |
| 最近记录: |