SQL Server 移动数据库

原文:SQL Server 移动数据库

移动系统数据库在下列情况下可能很有用:

  • 故障恢复。例如,数据库处于可疑模式下或因硬件故障而关闭。
  • 计划的重定位。
  • 为预定的磁盘维护操作而进行的重定位。

下列过程适用于在同一 SQL Server 实例内移动数据库文件。若要将数据库移动另一个 SQL Server 实例中或另一台服务器上,请使用备份和还原分离和附加操作。

本主题中的过程需要数据库文件的逻辑名称。若要获取该名称,请在 sys.master_files 目录视图中查询名称列。

 

预先安排的重定位与预定的磁盘维护过程


若要将移动系统数据库数据或日志文件的操作作为预先安排的重定位或预定的维护操作的一部分,请执行下列步骤。此过程适用于除 master 和 Resource 数据库以外的所有系统数据库。

  1. 对于要移动的每个文件,请运行以下语句。

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    
  2. 停止 SQL Server 实例或关闭系统以执行维护。有关详细信息,请参阅停止服务
  3. 将文件移动到新位置。
  4. 重新启动 SQL Server 实例或服务器。有关详细信息,请参阅启动和重新启动服务
  5. 通过运行以下查询来验证文件更改。
    SELECT  name ,
            physical_name AS CurrentLocation ,
            state_desc
    FROM    sys.master_files
    WHERE   database_id = DB_ID(N'<database_name>') ;

如果移动了 msdb 数据库并为数据库邮件配置了 SQL Server 实例,则请完成下列附加步骤。

  1. 通过运行以下查询,验证是否已为 msdb 数据库启用 Service Broker。

    SELECT  is_broker_enabled
    FROM    sys.databases
    WHERE   name = N'msdb' ;

    有关启用 Service Broker 的详细信息,请参阅 ALTER DATABASE (Transact-SQL)

  2. 通过发送测试邮件验证数据库邮件是否正常运行。有关详细信息,请参阅对数据库邮件进行故障排除

故障恢复过程


如果由于硬件故障而必须移动文件,则请执行下列步骤,将文件重新定位到一个新位置。此过程适用于除 master 和 Resource 数据库以外的所有系统数据库。

 重要提示

如果数据库无法启动,即处于可疑模式下或处于未恢复状态,则只有 sysadmin 固定角色的成员才可以移动该文件。

  1. 如果启动了 SQL Server 实例,则将其停止。
  2. 通过在命令提示符下输入下列命令之一,在仅 master 恢复模式下启动 SQL Server 实例。在这些命令中指定的参数区分大小写。如果未按所示方式指定参数,则命令会失败。
    • 对于默认的 (MSSQLSERVER) 实例,请运行以下命令:

      NET START MSSQLSERVER /f /T3608
      
    • 对于命名实例,请运行以下命令:
      NET START MSSQL$instancename /f /T3608
      

    有关详细信息,请参阅如何启动 SQL Server 实例(net 命令)

  3. 对于要移动的每个文件,请使用 sqlcmd 命令或 SQL Server Management Studio 运行以下语句。
    ALTER DATABASE database_name MODIFY FILE( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
    

    有关使用 sqlcmd 实用工具的详细信息,请参阅使用 sqlcmd 实用工具

  4. 退出 sqlcmd 实用工具或 SQL Server Management Studio。
  5. 停止 SQL Server 实例。例如,运行 NET STOP MSSQLSERVER。
  6. 将文件移动到新位置。
  7. 重新启动 SQL Server 实例。例如,运行 NET START MSSQLSERVER。
  8. 通过运行以下查询来验证文件更改。
    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'<database_name>');
    

移动
master 数据库


若要移动 master 数据库,请按下列步骤进行操作。

  1. “开始”菜单中,依次指向“所有程序”Microsoft SQL Server 和“配置工具”,再单击 SQL
    Server 配置管理器
  2. “SQL Server 服务”节点中,右键单击 SQL Server 实例(如 SQL Server (MSSQLSERVER)),并选择“属性”
  3. “SQL Server (实例名) 属性”对话框中,单击“高级”选项卡。
  4. 编辑“引导参数”值以指向 master 数据库数据和日志文件的计划位置,然后单击“确定”。可以选择移动错误日志文件。

    数据文件的参数值必须跟在 -d 参数的后面,日志文件的参数值必须跟在 -l 参数的后面。下面的示例显示 master 数据和日志文件默认位置的参数值。

    -dC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\
    master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\
    LOG\ERRORLOG;-lC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\
    DATA\mastlog.ldf
    

    如果 master 数据和日志文件预先安排的重定位是 E:\SQLData,则参数值将更改为:

    -dE:\SQLData\master.mdf;-eC:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\LOG\ERRORLOG;-lE:\SQLData\mastlog.ldf
    
  5. 通过右键单击实例名称并选择“停止”,停止 SQL Server 实例。
  6. 将 master.mdf 和 mastlog.ldf 文件移动到新位置。
  7. 重新启动 SQL Server 实例。
  8. 通过运行以下查询,验证 master 数据库的文件更改。
    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID('master');
    GO
    

移动
Resource 数据库


Resource 数据库的位置为 <drive>:\Program Files\Microsoft SQL Server\MSSQL10_50.<instance_name>\MSSQL\Binn\。无法移动该数据库。

示例


A. 移动 tempdb 数据库

下面的示例将 tempdb 数据和日志文件移动到一个新位置,作为预先安排的重定位的一部分。

注意

由于每次启动 SQL Server 实例时都将重新创建 tempdb,所以不必实际移动数据和日志文件。在步骤 3 中重新启动服务时,将在新位置中创建这些文件。在重新启动服务之前,tempdb 将继续使用现有位置中的数据和日志文件。

  1. 确定 tempdb 数据库的逻辑文件名称以及在磁盘上的当前位置。

    SELECT name, physical_name AS CurrentLocation
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');
    GO
    
  2. 使用 ALTER DATABASE 更改每个文件的位置。
    USE master;
    GO
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = tempdev, FILENAME = 'E:\SQLData\tempdb.mdf');
    GO
    ALTER DATABASE tempdb
    MODIFY FILE (NAME = templog, FILENAME = 'F:\SQLLog\templog.ldf');
    GO
    
  3. 停止再重新启动 SQL Server 的实例。
  4. 验证文件更改。
    SELECT name, physical_name AS CurrentLocation, state_desc
    FROM sys.master_files
    WHERE database_id = DB_ID(N'tempdb');
    
  5. 将 tempdb.mdf 和 templog.ldf 文件从其原始位置删除。

    在 SQL Server 中,通过在 ALTER DATABASE 语句的 FILENAME 子句中指定新的文件位置,可以将用户数据库中的数据、日志和全文目录文件移动到新位置。此方法适用于在同一 SQL Server 实例中移动数据库文件。若要将数据库移动到另一个 SQL Server
    实例或另一台服务器上,请使用备份和还原分离和附加操作

    注意

    SQL Server 数据库引擎的某些功能改变了数据库引擎在数据库文件中存储信息的方式。这些功能仅限于特定的 SQL Server 版本。不能将包含这些功能的数据库移到不支持这些功能的 SQL Server 版本。使用 sys.dm_db_persisted_sku_features 动态管理视图可列出当前数据库中启用的所有特定于版本的功能。

    本主题中的过程需要数据库文件的逻辑名称。若要获取该名称,请在 sys.master_files 目录视图中查询名称列。

    注意

    将数据库移动到另一个服务器实例上时,若要为用户和应用程序提供一致的体验,您可能需要为数据库重新创建部分或全部元数据。有关详细信息,请参阅当数据库在其他服务器实例上可用时管理元数据

    计划的重定位过程


    若要将移动数据或日志文件作为计划的重定位的一部分,请执行下列步骤:

    1. 运行以下语句。

      ALTER DATABASE database_name SET OFFLINE ;
    2. 将文件移动到新位置。
    3. 对于已移动的每个文件,请运行以下语句。
      ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name, FILENAME = 'new_path\os_file_name' ) ;
    4. 运行以下语句。
      
      
      ALTER DATABASE database_name SET ONLINE ;
    5. 通过运行以下查询来验证文件更改。
      
      
      SELECT  name ,
              physical_name AS CurrentLocation ,
              state_desc
      FROM    sys.master_files
      WHERE   database_id = DB_ID(N'<database_name>') ;

    计划的磁盘维护的重定位


    若要将重定位文件作为计划的磁盘维护过程的一部分,请执行下列步骤:

    1. 对于要移动的每个文件,请运行以下语句。

      ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' );
      
    2. 停止 SQL Server 实例或关闭系统以执行维护。有关详细信息,请参阅停止服务
    3. 将文件移动到新位置。
    4. 重新启动 SQL Server 实例或服务器。有关详细信息,请参阅启动和重新启动服务
    5. 通过运行以下查询来验证文件更改。
      
      
      SELECT  name ,
              physical_name AS CurrentLocation ,
              state_desc
      FROM    sys.master_files
      WHERE   database_id = DB_ID(N'<database_name>') ;

    故障恢复过程


    如果由于硬件故障而必须移动文件,则请执行下列步骤,将文件重新定位到一个新位置。

     重要提示

    如果数据库无法启动,即处于可疑模式下或处于未恢复状态,则只有 sysadmin 固定角色的成员才可以移动该文件。

    1. 如果启动了 SQL Server 实例,则将其停止。
    2. 通过在命令提示符下输入下列命令之一,在仅 master 恢复模式下启动 SQL Server 实例。
      • 对于默认的 (MSSQLSERVER) 实例,请运行以下命令。

        NET START MSSQLSERVER /f /T3608
      • 对于命名实例,请运行以下命令。
        NET START MSSQL$instancename /f /T3608
        

      有关详细信息,请参阅如何启动 SQL Server 实例(net 命令)

    3. 对于要移动的每个文件,请使用 sqlcmd 命令或 SQL Server Management Studio 运行以下语句。
      ALTER DATABASE database_name MODIFY FILE( NAME = logical_name , FILENAME = 'new_path\os_file_name' );
      

      有关如何使用 sqlcmd 实用工具的详细信息,请参阅使用 sqlcmd 实用工具

    4. 退出 sqlcmd 实用工具或 SQL Server Management Studio。
    5. 停止 SQL Server 实例。
    6. 将文件移动到新位置。
    7. 启动 SQL Server 实例。例如,运行 NET START MSSQLSERVER。
    8. 通过运行以下查询来验证文件更改。SELECT name, physical_name AS CurrentLocation, state_desc
      FROM sys.master_files
      WHERE database_id = DB_ID(N'<database_name>');
      

    移动全文目录


    若要移动全文目录,请执行下列步骤。请注意,指定新的目录位置时,只指定 new_path,而不是指定 new_path/os_file_name。

    1. 运行以下语句。

      ALTER DATABASE database_name SET OFFLINE
      
    2. 将全文目录移动到新位置。
    3. 运行下列语句,其中:logical_name 是 sys.database_files 中 name 列的值,new_path 是目录的新位置。
      ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path');
      
    4. 运行以下语句。
      ALTER DATABASE database_name SET ONLINE;
      

    另外,也可以使用 CREATE DATABASE 语句的 FOR ATTACH 子句移动全文目录。下面的示例在 AdventureWorks2008R2 数据库中创建一个全文目录。若要将全文目录移动到新位置,请分离 AdventureWorks2008R2 数据库,并将全文目录从物理意义上移动到新位置。然后附加数据库,并指定全文目录的新位置。

    
    
    USE AdventureWorks2008R2 ;
    CREATE FULLTEXT CATALOG AdvWksFtCat AS DEFAULT ;
    GO
    USE master ;
    GO
    --Detach the AdventureWorks2008R2 database.
    sp_detach_db AdventureWorks2008R2 ;
    GO
    --Physically move the full-text catalog to the new location.
    --Attach the AdventureWorks2008R2 database and specify the new location of the full-text catalog.
    CREATE DATABASE AdventureWorks2008R2 ON
        (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_Data.mdf'),
        (FILENAME = 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Data\AdventureWorks2008R2_log.ldf'),
        (FILENAME = 'c:\myFTCatalogs\AdvWksFtCat') FOR ATTACH ;
    GO

    示例


    下面的示例将 AdventureWorks2008R2 日志文件移动到一个新位置,作为计划的重定位的一部分。

    
    
    USE master ;
    GO
    -- Return the logical file name.
    SELECT  name ,
            physical_name AS CurrentLocation ,
            state_desc
    FROM    sys.master_files
    WHERE   database_id = DB_ID(N'AdventureWorks2008R2')
            AND type_desc = N'LOG' ;
    GO
    ALTER DATABASE AdventureWorks2008R2 SET OFFLINE ;
    GO
    -- Physically move the file to a new location.
    -- In the following statement, modify the path specified in FILENAME to
    -- the new location of the file on your server.
    ALTER DATABASE AdventureWorks2008R2
    MODIFY FILE ( NAME = AdventureWorks2008R2_Log,
    FILENAME = 'C:\NewLoc\AdventureWorks2008R2_Log.ldf') ;
    GO
    ALTER DATABASE AdventureWorks2008R2 SET ONLINE ;
    GO
    --Verify the new location.
    SELECT  name ,
            physical_name AS CurrentLocation ,
            state_desc
    FROM    sys.master_files
    WHERE   database_id = DB_ID(N'AdventureWorks2008R2')
            AND type_desc = N'LOG' ;
时间: 2024-09-13 21:21:15

SQL Server 移动数据库的相关文章

ASP视频教程:备份和还原SQL Server 2000数据库

大家在初学ASP程序的时候,我们经常第一个任务就是配置环境!在这里根据网页教学网站长的经验,有时克隆版的XP系统有时是安装不了IIS的!前面我们已经讲解了ASP视频教程:制作网站前台首页,本讲主要讲述备份和还原SQL Server 2000数据库.大家请看视频教程.

Java成功访问SQL Server 2000数据库的方法

server|sql|访问|数据|数据库 摘要:本文主要介绍采用JDBC.ODBC接口实现了与SQL Server2000数据库的连接,并利用Java应用程序对其进行访问,同时通过图形用户界面实现了简单的查询功能. 关键词:Java,SQL Server,数据库 前言 数据库技术和网络技术是当今计算机领域的两大热门话题,数据库技术自产生以来,在技术上已发展成熟.而作为前端访问的开发工具和环境仍处在不断完善和发展之中,除了网络上使用的ASP.PHP.JSP作为前端连接数据库技术外,小型系统上常用访

SQL Server 清除数据库日志脚本

SQL Server 清除数据库日志脚本 清除mssql数据库日志的代码: Use master go declare @dbname varchar(50) declare temp_cur cursor scroll for select name from sysdatabases open temp_cur fetch first from temp_cur into @dbname while @@fetch_status =0  begin   exec ('backup log [

SQL Server 2000数据库文件组织形式

server|数据|数据库 一.数据文件类型: 每个SQL Server 2000数据库都有一个主数据文件,可以有多个辅数据文件,后者只能供该数据库使用. 二.数据文件命名: 每个数据文件都是一个独立的操作系统文件.主数据文件通常以.mdf为文件后缀(该后缀不是必须的,但对于文件的识别比较有用).主数据文件将数据存储在表格或索引中,它包含数据库的启动信息.它还包含一些系统表格,这些表格记载数据库中的对象,如数据库中所有的其它文件(辅数据文件和事务处理日志文件)的位置信息. 每个辅助数据文件通常都

SQL SERVER 2005数据库镜像(1)

本文对SQL SERVER 2005数据库镜像进行了教程式的讲解,具体内容包括:介绍.动态.可用性场景.实现和高可用性技术,供大家参考! 概述 数据库镜像是SQL SERVER 2005用于提高数据库可用性的新技术.数据库镜像将事务日志记录直接从一台服务器传输到另一台服务器,并且能够在出现故障时快速转移到备用服务器.可以编写客户端程序自动重定向连接信息,这样一旦出现故障转移就可以自动连接到备用服务器和数据库. 自动进行故障转移并且使数据损失最小化通常包括昂贵的硬件和复杂的软件.但是,数据库镜像可

直接获取Access、SQL Server等数据库数据

access|server|数据|数据库 直接获取access.SQL Server等数据库数据Author: MixPST,Ph4nt0m Security Teamhttp://www.ph4nt0m.org 当使用SQL注入access的时候,经常会遇到密码为中文.猜不到关键字段名这样的问题.使用本技术就能够很快速的解决这样的问题.本技术最低要求有两条: 1.使用access数据库的系统存在SQL注入漏洞:mssql数据库也支持这个技术2.需要知道欲爆数据所在的表的表名以及这个表下的一个字

将ACCESS的数据库转化为SQL SERVER的数据库的几点体验

access|server|数据|数据库 最近忙于将ACCESS的数据库转化为SQL SERVER的数据库的学习,从中摸索出几条经验,与大家分享.1.ACCESS的数据库中的自动编号类型在转化时,sql server并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!2.转化时,跟日期有关的字段,SQL SERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大.我遇见这种情况

.net中webform和winform连接sql server 2000数据库的c#操作类

server|web|数据|数据库 一.这个为c#连接winform注意点:(1)调用时必须引用此类的命名空间(2)类中引用的命名空间using System;using System.Data;using System.Data.SqlClient;(3)调用示例: DataSet ds =new DataSet(); string sql="select * from [user]"; ds=DoDataBase.GetDataSet(sql); dataGrid1.DataSou

通过VS 2010+SVN为SQL Server提供数据库版本管理

对于一个软件企业来说,源代码就是公司全体智慧的结晶,绝不能有任何闪失.但对于公司产品的基石数据库怎么来 进行统一管理呢?通常,是直接备份数据库文件的方式,或者生成数据库的部署脚本,来重复的备份.这个方法可行, 却有些值得改进的地方.首先,太繁琐了,浪费精神:其二,不方便和其它项目同时管理.下面,就介绍我偶然看到的 方法,当然,可能有很多人已经这么做了,但分享给那些还不知道的人. 大体思路: VS 2010 提供了一个项目类型,新建->数据库->SQL Server 2005 数据库对象 或 S

Microsoft SQL Server 2005数据库镜像语句

Microsoft SQL Server 2005数据库镜像语句: SERVER 1 CREATE ENDPOINT DbMirroring STATE=STARTED AS TCP(LISTENER_PORT=5023) FOR DATABASE_MIRRORING(ROLE=PARTNER,ENCRYPTION=SUPPORTED) ALTER DATABASE AdventureWorks SET PARTNER='TCP://192.168.5.106:5022' SERVER 2 CR