谨以此文 记录一次悲催的SharePoint 迁移
) {8 }0 U2 T& Q% ~最近遇上一个SP迁移 ,经过简单的交谈发现迁移工作并不是特别复杂,两个网站集,有几个自定义的解决方案当前版本是 SharePoint 2013 不带SP1 打算迁移到SharePoint 2013当我听到这个想法的时候颇为震惊,为毛会有如此需求 如果是因为要换机器也没有必要做迁移,我们可以向场中添加新的服务器, 然后删除废弃的服务器 并且断开场连接。
7 i' A6 e0 S4 C' P) P带着如此疑问我看了下原始环境,不看不知道一看吓一跳当前只有一个服务器,该服务器即承担SQL,SharePoint 前端,以及SharePoint 应用程序 典型的All in One (经检查该场非独立安装)而且该场与WF 2013绑定,Office Web App 绑定 ,万幸的是 没有做其他BI 组建的关联,仅有的几个解决方案都有原始Wsp 文件。 ! K/ R$ a7 I& c8 Z& r: E3 ^
关于服务应用程序
1 W2 Z1 Y+ D# M c! i$ kBI 方面没有使用,可以考虑放弃迁移
' R" M; m% o$ c搜索已经使用 存在索引分区 必须要迁移 迁移前仔细看好 拓扑以及索引分区 而且该搜索拓扑全部组件均在一台机器上
S ~7 o% M' j5 C# x8 w. dSSS(即安全凭据存储) 没有使用,可以考虑放弃迁移
# p; C# M6 N; I$ B1 a" H5 T% {! zUPS (用户配置文件同步) 正在使用,且同步出现问题 ,而且 我的网站宿主 与 名为SP.xxx.cn的网站集同属一个web应用程序,该内容数据库已经到达300G 以上
e/ Y' U+ M8 [! V& o经沟通可以不迁移个人站点,用户配置文件均可清空 。 0 S" E# z. X7 o0 u" c
关于表单,没有任何自定义的表单在场中存在 InfoPath Forms Services 也未使用 . h0 N e* y* x6 ^* D. X: M* s
关于web应用程序 % ]) O; C% b+ a0 j; @
虽然场中存在两个web应用程序,但真正使用的仅有一个,故剩余的那个无需迁移,
: w0 y1 n- O, Z$ n; T) v而且均未使用SLL 所以我们在迁移时候就可以无视证书的事情 否则连证书要一起迁移过去
% R0 @" A' ?& t7 K, ^& z+ \* K据沟通结果该web应用程序早已废弃不用,但一直没删。
m) F+ Y4 G1 q5 P* U+ X d/ Z# ~关于传入传出邮件
* {: H) G' I% b+ b场,web应用程序,站点均已经使用,且SMTP配置数据有记录 0 R2 o6 f6 Q8 f" D' v; q
关于Web.Config 8 E3 Q; q9 Q" d
好吧 我实在无法确切的得知到底都修改了什么,我也不打算得知 我们可以用一个文本对比工具尽可能的还原。 2 D5 Y, R4 B% W+ U9 H4 s
我带着为什么要迁移的疑问进行沟通,沟通结果出乎意料的简单,粗暴,因为太慢了
- R1 Y8 E& Z( l' s t+ O1 o0 p因为UPS 同步问题。 4 ]8 }8 k3 `5 Z6 R
) Q7 B7 \ n) w1 _9 _; E- e1 Y1 C% S, j( n
So 根据如上所述 我们得出一个结论 SharePoint 本身没有进行迁移的必要 响应慢的原因应该是 SQL数据库磁盘IO 过低的原因(他们在一块机械盘上完整的这一切,包括OS,SQL Server ,SharePoint) Shit!!!(Sorry 原谅我爆粗) 5 F" _2 C3 }* n+ R4 G8 R: M# q
下面我们列举下应该都要迁移什么 / v) |# G8 e) ?/ O2 H# B7 S
1 场要迁移 (别问我为什么要迁移场)
5 J: |% f3 x. |0 I% H2 web 应用程序
" f/ ^7 A( j, s2 Q3 U# H+ ?3 `3 服务应用程序 * U" Z- \( \4 b: f) ?& {1 U
4 自定义解决方案
) ^+ f& a# p! y2 {* |8 p* d# `* P5 WebApp 绑定 工作流绑定 3 m" B+ Q! {) W; [! J, y
6 Web.Config
+ \# a; K9 m, B f( ~$ g# y或许我想做的事情并不符合诸位看官迁移的概念,
0 T3 \0 V) E" d3 c# R' d( x为什么这么说呢 因为我在做的时候并没有创建新场,而是直接把场配置数据库迁移到另外一个独立的SQL Server 上 并且用一台全新安装的SharePoint 做一个扩展场的动作 然后顺理成章的把一个 ”迁移” 的动作变成一个移动 虽然表面看起来 这是一次迁移实际上我们仅仅使用了一个叫做 移动数据库,扩展场的做法
3 ]4 p! d* r1 v. K2 F" Y1 v1 |1 }7 v下面我们将简单的说下几个重点问题
|5 E$ Z* @% C3 _+ m3 j+ W首先准备出一个SQL,我们简称他为SQLA 该SQL的版本不能低于原始SQL Server 的版本,且服务账户 管理账户,账户权限,身份验证与之前的一样(如果你之前的场中存在RS等集成模式请不要在该服务器安装) . w5 r+ E D9 X) Y
一个全新安装并未加入场的SharePont 服务器我们简称他为SPA,(安装账户等与之前一样)
* A; v5 w9 z! R+ ?
4 h# i0 |- a5 u, c0 @" i# H/ i4 S0 I& \4 F8 C) p
首先 移动数据库,(由于未在原始环境截图,所以我们在实验环境重现该场景)
# h; h6 w! G# ]在这里也许我们会纠结下到底先移动那个数据库,但是我第一个移动的是场配置数据库 1 h1 I6 b) O" d$ H7 W5 g
我们先简单的说下如何移动场配置数据库
( Y. ?+ i. b5 c2 G7 z9 [首先在原始场中 关闭除去配置数据库之外的机器 包括App,WFE 我们要断开场与SQL的连接(该动作仅适合移动配置数据库 其他库无需此步骤) ' w! I1 U( U7 x4 u' \( f& Z
然后在数据库服务器上执行一个叫做 分离的动作 如下图
1 ^: z" Z' m2 S2 ]
谨以此文 记录一次悲催的SharePoint 迁移
( H" E: } {* f i) M9 m
也许你也已经看到 当前数据有19的连接 我们可以选择删除连接然后让他分离 ,但是我们还是稳妥点的好 ,由于一般迁移升级类的动作都不会在 工作时间进行,SO 大胆的把他们关掉把 4 Z, m) }6 I y
数据库分离后 拷贝原始MDF,LDF文件到新的SQL Server 上 即SQLA 请注意你需要有SQLA服务器的本地管理员权限 并且在SQL 拥有db_owner 固定数据库角色 权限,如果你不清楚的话 就把你的SQL 管理员账户暂时加入本地管理员组把,或者找DBA去,同时附加该数据库 。
; v1 Z! z8 }" n+ ^此后开启场中任意服务器, - C2 d1 G% s/ ?. J
执行如下动作 (以下动作适用于移动全部数据库 具体到特别部分我们会进行详细说明) 4 \% D4 E& J m
关闭任何已经打开的Cmd ,PowerShell 窗口,场中网站以及管理中心窗口 请务必谨记
. o n0 J8 s9 U) n- S# w% h; R首先停止服务器的如下几个服务
( V6 f. Y& Z/ p1 YSPAdminV4 ,SPTimerV4 ,SPTraceV4,SPWriterV4,SPSearchHostController ,W3svc
. O2 @# S' f+ ~2 {7 s6 o0 W% s5 y然后IISreset /stop
& F+ m/ M! L* Q2 f8 C这样我们就停止场 & p6 v/ q7 A/ o( t. w% v
当然对于我来说我更喜欢用命令来完成这些事情 . r& j( n: o4 q1 v3 x# u
脚本如下 打开全新的PowerShell 窗口运行如下命令 7 J+ h* T( C& y$ C0 B
Get-Service SP* |Stop-Service -Force 8 t& i8 h' A$ h% k g$ H. c5 D8 A
Stop-Service W3svc
Y# L. M7 K# l# u/ giisreset /stop , I: \! M5 B7 q
虽然我的脚本使用 Get-Service SP* 获取SharePoint 相关服务,但是会有误停止的服务,比如软件保护,打印服务 好吧 我承认这都不是问题。
" [' s* D L8 w( l# o( \. d0 u(如果你迁移的是其他非配置数据库 请在停止如上服务之后对原始数据库进行分离 附加到新的SQL Server 实例 我们建议再这时候对全部的数据库做一个备份以防不测 如果出现问题 我们可以通过还原数据库的方式 继续使用源场) 9 N- j7 _4 `# t# x- ?: {4 A
脚本执行完成没有错误之后 管理该窗口
/ G4 }$ a y8 a2 C% b打开新的SharePoint 命令管理工具 如下图
% m. G* |9 h' m) J9 `
谨以此文 记录一次悲催的SharePoint 迁移
, K$ c, ?( U- A0 U6 p1 V X3 o
好吧 我承认我一向更喜欢使用ISE,那么你可以打开ISE 运行 Add-PSSnapin * 来加载SharePoint 管理单元 当然这种做法也会加载其他的管理单元,好吧 我还得承认这都不是问题 & h9 Z5 F; s; T" Q* k2 i2 G
我们运行 Get-SPDatabase 来获取数据库 注意区分你要移动的数据库 记录下ID 如下图 ( I/ J V1 T* P: `/ j
谨以此文 记录一次悲催的SharePoint 迁移
! C, e E* o/ u% K! R8 w* `: T6 `% \: h6 V7 r
1 S8 V' _+ H g由于我现在迁移的是一个叫做 配置数据库的东西 So
) \ ]# g) W+ q9 K我们运行下面的命令
/ z& p9 M! j2 ~3 o& M- R$1 = Get-SPDatabase fe15dfae-2485-47b4-a77f-c44d6426a0a2 , W% @" F: S' q
我们将该数据库对象放入一个变量
2 f2 ~* B3 a: X! F$1.ChangeDatabaseInstance("win206.ilync.cn") ' ^) A: I" l0 X4 }
调用该对象的ChangeDatabaseInstance 方法来修改 其新的数据库服务器为SQLA 请注意建议写FQDN ' F8 y0 M4 @5 t1 m+ b! I" }
如果使用SQL 镜像
+ ^6 A% Y( e9 P% } ^% K# ?还需要调用Failoverserviceinstance 来填充镜像连接名称 E% M( i. J0 o) X
官方文档请参考
$ A, w" u) V7 M8 g/ l+ uhttp://technet.microsoft.com/zh-cn/library/cc512725(v=office.15).aspx ( M) w$ h% B& I! k) j t+ s- W
然后在没有红色错误的情况下运行
# G# ?5 l6 R6 Q4 d+ h5 E7 L$1.Update()
0 ^7 H* p5 I# w' _3 ~5 r. }/ e调用该对象的Update() 方法以使修改生效 1 o5 v& J* a) L6 f2 {9 r& |/ H
如果在ChangeDatabaseInstance 时候 提示你更新冲突 没关系 关掉窗口 重新运行
7 z, Q: K# h2 F9 \; B+ L此后
: S: e( _2 j/ n$ i% D R3 R1 z* I2 [将刚才停止的服务启动 并且执行IISreset
( w- g, _# T6 a" l到此 迁移配置数据库完成(至此 迁移非配置数据库也到此完成)
' c; I2 M3 u( ~: @0 e然后我们以此把全部数据库附加到SQLA 将全部数据库迁移到SQLA上
|7 z9 J# J( m. w7 g8 a由于 此时我们移动了配置数据库 原始服务器将无法访问管理中心 ; e2 _: F. H M/ L+ y
这就是为什么我们要准备一个新的SharePoint 服务器并不将其加入场的原因 6 e7 |8 a; v3 ?/ {/ N. ^' J4 K f
我们使用SPA 加入场 请注意 加入的场为配置数据库所在的SQLA 服务器 (这个动作相当于我们复制了一个场) & R4 G! `6 {8 @! Z
然后完成任何加入场动作 ,记得将该计算机作为管理中心宿主 加入完毕之后 将原始的网站访问IP 或者解析修改为新的服务器 即SPA然后 用你能想到的一切办法在SPA 上还原任何Web.Config更改。 0 F4 G6 p. w/ ^$ h& h( U. \
同时在在我们复制出来的场中删除之前场中的全部服务器,同时在SPA上启动一切你需要的服务 ' u9 u8 E. ^4 W+ _3 b3 p) z2 E
至此 我们完成了场的迁移 到此步骤 我们的解决方案以及WebApp绑定都无需重新配置 : \# Z: r y8 J8 G
或许你可以开始测试下一些站点的访问是否成功 但是不要有其他动作
9 Z% p: w% W/ d& B) l6 f
3 N1 H. P5 J" Q5 j1 H/ j2 t) w2 Q
9 b w3 I% n8 L: {, {6 j( T下面我们来看看Web应用程序的事情
+ C) |: t3 R2 a. q. N& A2 C, L事实上 经过我们上面的动作根本无需再过多的关心Web应用程序 因为一切都在 就好比科幻片一样 我们的思维仍在只不过换了个躯壳,但是我们的身体可能不太适应思维(各种科幻大片都是一样的道理)所以我们下面将开始让身体适应思维,我们要做如下的这些动作
5 R: f2 i% u3 E2 e可能我记录的并不完整,也许你的环境中有更多需要进行修改的 总之尽可能的仔细些
7 h3 P( _2 f8 F8 c5 b将场电子邮件地址进行修改该 在IIS上重新绑定SSL 证书,如果需要的话你还需要重新在SPA 上修改注册表以关闭IIS LoopBackCheck,还原之前任何依赖的DLL 等等一切你自定义的修改。 , e W* n( o W. p: r
还原应用程序池的任何修改 回收配置 进程数,内存等请尤其注意承担我的网站宿主的Web应用 的应用程序池千万要检查 加载用户配置文件 属性为True 3 q5 k" h! f$ g- f
关于服务应用程序 ( `# D' q( m& m$ }
大部分的服务应用程序你无需担心 你只需要在新的服务器上启动相应的服务即可 , h! R3 a! d( U
这里我们重点说几个需要关照的家伙
( f2 f+ v4 i5 GUser Profile Service Application 9 u" ~$ f& N0 V4 J" X6 P: A" |- y
把UPS 说成微软最坑爹的服务我相信不算过分 MSDN,TechNet 上到处充斥长时间正在启动,无法启动,等等
% v9 F0 r1 U: O! p- Q这里有几个小窍门 1 在首次启动以及停止后在启动 User Profile Synchronization Service 这个服务时候 首先将该服务对应的服务实例托管账户加到本地管理员组 (在该服务启动后可将该用户从本地管理员组删除 服务器重新启动不影响) 2 对该账户在本地策略中授予如下权限 作为服务登录,允许本地登录,以操作系统方式执行 然后你可以选择重启SPTimerV4 服务但是我更建议 重新启动要承担同步实例的服务器 3 检查服务应用程序的相关属性 5 b$ ]6 K$ Z4 k$ V" I
使用 Get-SPUserProfileServiceApplication 命令获取场中的 User Profile Service Application (该命令非官方 由本人自定义开发目前尚不具备发布条件,部分已经拿到测试版本的同学感谢你们的测试反馈) 然后检查属性 NetBIOSDomainNamesEnabled 该属性在特定条件下需要修改下面列出该属性对应的条件 False 该应用程序使用的数据库实例为FQDN 非NetBios 名称 (这也是为什么我希望大家写FQDN的原因避免不必要的麻烦) True 该应用程序使用的数据库实例为NetBios 名称 如果你当前属性不满足以上需求 请做相应修改 然后调用Update()方法更新修改 4 在活动目录中委派该用户 复制目录更改,复制目录所有更改项 此后启动该服务 稍等片刻应该可以启动 如果还不能启动 请分别调用以下方法 / t. A* O7 }; x
ResetSynchronizationDatabase() ResetSynchronizationMachine()
6 h2 [1 U! N; F分别重置同步数据库以及同步实例 然后重新启动相应同步实例 希望这几个窍门能够帮到你。 , D0 v, P2 I; s }
' `, u% K& R# L# a |