发新话题
打印

运行SQL Server的计算机之间移动数据库

运行SQL Server的计算机之间移动数据库


本文分步介绍了如何在运行SQL Server的计算机之间移动Microsoft SQL Server用户数据库和大多数常见的SQL Server组件。本文中介绍的步骤假定您不移动master、model、tempdb或msdb这些系统数据库。这些步骤为您传输登录以及master和msdb数据库中包含的大多数常见组件提供了多个选项。
( E# |# w5 N9 L, c8 j, }$ P注意:支持将数据从SQL Server 2000迁移到Microsoft SQL Server 2000(64位)。您可以将一个32位数据库附加到一个64位数据库上,方法是:使用sp_attach_db系统存储过程或sp_attach_single_file_db系统存储过程,或者使用32位企业管理器中的备份和还原功能。您可以在SQL Server的32位和64位两种版本之间来回移动数据库。您还可以使用同样的方法从SQL Server 7.0迁移数据。但是,不支持将数据从SQL Server 2000(64位)降级到SQL Server 7.0。下面分别介绍这几种方法。 : p0 d' b$ m- b2 S4 d
如果您使用的是SQL Server 2005
2 D% V1 q# D0 z& r+ d/ ^您可以使用相同的方法从SQL Server 7.0或SQL Server 2000迁移数据。但是,Microsoft SQL Server 2005中的管理工具与SQL Server 7.0或SQL Server 2000中的管理工具有所不同。您应该使用SQL Server Management Studio(而不是SQL Server企业管理器)以及SQL Server导入和导出向导(DTSWizard.exe)(而不是数据转换服务导入和导出数据向导)。
. q  ?. A$ q% R7 V备份和还原 3 H) C* S5 F- R( R- a% e7 k: e0 A, x
在源服务器上备份用户数据库,然后将用户数据库还原到目标服务器上。在备份过程中时可能有人使用数据库。如果用户在备份完成后对数据库执行INSERT、UPDATE或DELETE语句,则备份中不会包含这些更改。如果您必须传输所有更改,那么,假如您既执行事务日志备份又执行完整数据库备份,您可以以尽可能短的停止时间来传输这些更改。
! E  B9 V/ }4 s. V1.在目标服务器上还原完整数据库备份,并指定WITH NORECOVERY选项。
9 \7 C% R6 M, k0 o0 @7 Z注意:为防止对数据库做进一步的修改,请指导用户在源服务器上退出数据库活动。
: J! D9 p* h6 X9 |& Z2.执行事务日志备份,然后使用WITH RECOVERY选项将事务日志备份还原到目标服务器上。停止时间仅限于事务日志备份和恢复的时间。 ' a# K& T5 Y# [; P7 P
◆目标服务器上的数据库将与源服务器上的数据库大小相同。要减小数据库的大小,您必须在执行备份前压缩源数据库的大小,或者在完成还原后压缩目标数据库的大小。
9 G) }! N. w/ W" R◆如果您将数据库还原到的文件位置不同于源数据库的文件位置,则必须指定WITH MOVE选项。例如,在源服务器上,数据库位于D:MssqlData文件夹中。目标服务器没有D驱动器,因而您需要将数据库还原到C:MssqlData文件夹。有关如何将数据库还原到其他位置的更多信息,请查看相关资料。
$ Q0 Z" W/ ?4 x$ Y  r7 m9 E/ B◆如果您想覆盖目标服务器上的一个现有数据库,则必须指定WITH REPLACE选项。   S( m- U; E0 Q8 M
◆源服务器和目标服务器上的字符集、排序顺序和Unicode整序可能必须相同,具体取决于您要还原到SQL Server的哪种版本。有关更多信息,请参阅本文中的“关于排序规则的说明”一节。
1 I. f# H  t: ~3 i0 e: y% K8 G; [Sp_detach_db和Sp_attach_db存储过程
+ o  p4 k3 ^- P0 f) O2 j" a  O要使用sp_detach_db和sp_attach_db这两个存储过程,请按下列步骤操作:
+ L/ O6 r+ ~/ P1 f! z: E1.使用sp_detach_db存储过程分离源服务器上的数据库。您必须将与数据库关联的.mdf、.ndf和.ldf这三个文件复制到目标服务器上。参见下表中对文件类型的描述: 
! Z, ]' Z" ~0 X
: f4 t4 W( i& ~3 y# K3 Y# Z! u4 n9 X) d) \( u  I
2.使用sp_attach_db存储过程将数据库附加到目标服务器上,并指向您在上一步骤中复制到目标服务器的文件。
' ^! l" F* s. l2 t8 V; C2 t◆分离数据库后将无法访问该数据库,并且复制文件时也无法使用该数据库。在进行分离的那一时刻数据库中包含的所有数据都被移动。 2 ?/ R5 O5 q' f, A
◆在您使用附加或分离方法时,两个服务器上的字符集、排序顺序和Unicode整序都必须相同。有关更多信息,请参阅本文中的“关于排序规则的说明”一节。 8 V( Z: K9 T6 U, R0 z, x- L8 q
关于排序规则的说明
+ p8 ]" _- l# I0 G* l* t+ @如果您使用备份和还原或附加和分离方法在两个SQL Server 7.0服务器之间移动数据库,则两个服务器上的字符集、排序顺序和Unicode整序都必须相同。如果您将数据库从SQL Server 7.0移到SQL Server 2000,或者在不同的SQL Server 2000服务器之间移动数据库,则数据库将保留源数据库的整序。这意味着,如果运行SQL Server 2000的目标服务器的整序与源数据库的整序不同,则目标数据库的整序也将与目标服务器的master、model、tempdb和msdb数据库的整序不同。   D* Y1 a2 \0 M; R7 q- s* T" ~
第1步:导入和导出数据:(在SQL Server数据库之间复制对象和数据) 8 h/ Z$ k6 n8 t' q& {$ q' F
您可以使用数据转换服务导入和导出数据向导来复制整个数据库或有选择地将源数据库中的对象和数据复制到目标数据库。在传输过程中,可能有人在使用源数据库。如果在传输过程中有人在使用源数据库,您可能会看到传输过程中出现一些阻滞现象。
0 q' k. p; C5 g" K( `+ Q◆在您使用导入和导出数据向导时,源服务器与目标服务器的字符集、排序顺序和整序不必相同。 5 G% r8 S0 M' i; c  N
◆因为源数据库中未使用的空间不会移动,所以目标数据库不必与源数据库一样大。同样,如果您只移动某些对象,则目标数据库也不必与源数据库一样大。 , w/ x7 }$ D3 `
◆SQL Server 7.0数据转换服务可能无法正确地传输大于64KB的文本和图像数据。但SQL Server 2000版本的数据转换服务不存在此问题。  
! B- L7 x" @0 x# K; W第2步:如何传输登录和密码:
5 T1 m5 {* s) v  _. _如果您不将源服务器中的登录传输到目标服务器,当前的SQL Server用户就无法登录到目标服务器。目标服务器上的登录的默认数据库可能与源服务器上的登录的默认数据库不同。您可以使用sp_defaultdb存储过程来更改登录的默认数据库。 " _$ F& k  v, {; x$ h
第3步:如何解决孤立用户:
& W7 P3 b/ t! `/ k; g! f在您向目标服务器传输登录和密码后,用户可能还无法访问数据库。登录与用户是靠安全识别符(SID)关联在一起的;在您移动数据库后,如果SID不一致,SQL Server可能会拒绝用户访问数据库。此问题称为孤立用户。如果您使用SQL Server 2000 DTS传输登录功能来传输登录和密码,就可能会产生孤立用户。此外,被允许访问与源服务器处于不同域中的目标服务器的集成登录帐户,也会导致出现孤立用户。 * f" h( F1 {9 W7 b% L
1.查找孤立用户。在目标服务器上打开查询分析器,然后在您移动的用户数据库中运行以下代码:exec sp_change_users_login 'Report'
- I( d4 U' A% I! |4 r此过程将列出任何未链接到一个登录帐户的孤立用户。如果没有列出用户,请跳过第2步和第3步,直接进行第4步。
" W9 @# h. Z/ _8 {! n* C0 n3 ?. _2.解决孤立用户问题。如果一个用户是孤立用户,数据库用户可以成功登录到服务器,但却无权访问数据库。如果您尝试向数据库授予登录访问权,则会因该用户已经存在而出现下列错误消息: $ V# P' ~0 C1 o9 `# T
Microsoft SQL-DMO (ODBC SQLState:42000) # ?* h& u2 u, x- J5 v6 U9 P
错误15023:当前数据库中已存在用户或角色'%s'。上面介绍了如何使用sp_change_users_login存储过程来逐个纠正孤立用户。sp_change_users_login存储过程仅能解决标准的SQL Server登录帐户的孤立用户问题。
/ K3 W# F$ K: I; y+ }) W. b" T  m- y3.如果数据库所有者(dbo)被当作孤立用户列出,请在用户数据库中运行下面的代码:exec sp_changedbowner 'sa'此存储过程会将数据库所有者更改为dbo并解决这个问题。要将数据库所有者更改为另一用户,请使用您想使用的用户再次运行sp_changedbowner。
3 x. Z% I$ O2 B9 N/ n. I4.如果您的目标服务器运行的是SQL Server 2000 Service Pack 1,则在您执行附加操作或还原操作(或两种操作都执行)后,企业管理器的用户文件夹中的列表中可能没有数据库所有者用户。
. ?4 F9 y  z2 U) s$ j( q" q5.如果目标服务器上不存在映射到源服务器上的dbo的登录,您在尝试通过企业管理器更改系统管理员(sa)密码时,可能会收到以下错误消息: * P; A3 E- G( H  @+ j! ?7 }
错误21776:[SQL-DMO]名称'dbo'在Users集合中没有找到。如果该名称是合法名称,则使用[]来分隔名称的不同部分,然后重试。
$ Y4 J7 {3 Y# ]# t" T2 U8 p警告:如果您再次还原或附加数据库,则数据库用户可能会再次被孤立,这样您就必须重复第3步操作。
8 e1 O4 N3 u9 {9 ]2 u第4步:如何移动作业、警报和运算符: 2 b) ^: T2 u5 S, U7 b
第4步是可选操作。您可以为源服务器上的所有作业、警报和运算符生成脚本,然后在目标服务器上运行脚本。要移动作业、警报和运算符,请按照下列步骤操作: 6 \$ u& K8 j8 Q$ Z
1.打开SQL Server企业管理器,然后展开管理文件夹。 4 u; ]3 E8 o; T7 E
2.展开SQL Server代理,然后右键单击警报、作业或运算符。
. x6 z1 O1 }7 ~1 K  P3.单击所有任务,然后单击生成SQL脚本。对于SQL Server 7.0,请单击为所有作业生成脚本、警报或运算符。
- v: y: e( `5 p6 j您可以用右键单击选择为所有警报、所有作业或所有运算符生成脚本。 6 @4 K1 N6 ]5 u! H
◆您可以将作业、警报和运算符从SQL Server 7.0移到SQL Server 2000,也可以在运行SQL Server 7.0和运行SQL Server 2000计算机之间移动。
- h" `9 V" ]! T◆如果在源服务器上为运算符设置了SQLMail通知,则目标服务器上也必须设置SQLMail,才能具有相同的功能。
: h/ ~# J( X/ \1 g" k5 j第5步:如何移动DTS包: : _+ j0 a2 i- Q2 A9 T& g  ^
第5步是可选操作。如果DTS包在源服务器上存储在SQL Server中或存储库中,您可以在需要时移动这些包。要在服务器之间移动DTS包,请使用下列方法之一。 + l' p/ p6 j9 r: k3 K' H9 d! p% l
方法1
* j- {' B% @. M3 }* z5 s- z1.在源服务器上将DTS包保存到一个文件中,然后在目标服务器上打开DTS包文件。
& l2 x4 P. w$ `1 j3 x) {6 [2.将目标服务器上的包保存到SQL Server或存储库中。
' O' a6 h" \% u9 e! s' r注意:您必须用单独的文件逐个地移动这些包。
' X9 p4 B2 J" \) g, r: b方法2
# W6 D/ _5 R+ {  M* w1.在DTS设计器中打开每个DTS包。
6 ^3 F  s' N! w& e: u2.在包菜单上,单击另存为。
* p0 X; R* f2 r3.指定目标SQL Server。
$ [+ e1 E; O  [2 g* A注意:在新服务器上,包可能无法正常运行。您可能必须对包进行更改,更改包中任何对旧的源服务器上的连接、文件、数据源、配置文件和其他信息的引用,以便引用新的目标服务器。您必须根据每个包的设计逐个包进行这些更改。 - _6 q6 w" o8 m/ h( I* Q" g! l! v! T
本文中介绍的步骤不移动数据库关系图以及备份与还原历史记录。如果您必须移动这些信息,请移动msdb系统数据库。如果您移动msdb数据库,则不必执行“第4步:如何移动作业、警报和运算符”或“第5步:如何移动DTS包”。



点击图标进入精品网摘收藏 欢迎大家加入网络收藏夹

TOP

发新话题