SQL Server 2000之日志传送功能 - 描述 (1)
角色变更、角色互换、以及监控服务器所在位置
当线上数据库停摆时(可能是计划内维护工作,或是预期外的状况),如果还有备援服务器上的数据库可供存取,您可能会比较安心一点。一个设计良好的日志传送系统(将数据库交易日志文件从主要服务器传送到备援服务器)即可给予您这样的自信心。内建于 SQL Serve 2000 企业板与开发版的 Enterprise Manager 工具程序即支持日志传送功能。
角色变更
将日志从主要服务器传送到次要服务器之后,您可在必要时以次要服务器置换掉主要服务器。如果主要服务器发生问题,或是计划性停摆(例如升级硬件或安装修正程序),线上数据库就必须停止服务一段期间。此时您可以变更次要服务器上数据库之角色,让它取代主要服务器之后进而成为线上数据库。SQL Server 2000 线上手册(Books Online,BOL)将此项操作称为日志传送角色变更(log shipping role change)。在日志传送过程里,次要服务器需设定在无法复原(nonrecovered)状态,因此交易日志才能从主要服务器回存到次要服务器(一但您将数据库复原,就不能再回存交易记录)。变更角色时,您需将次要服务器的数据库予以复原,并标示其为新主要服务器数据库。您也可以将旧主要服务器数据库设定为新次要服务器数据库。如果旧主要服务器数据库并未损坏,那么就可以在新主要服务器与旧主要服务器(已变成新次要服务器)之间重新建置日志传送功能。这种切换方式我们称为角色互换(role reversal)。
这些操作指引可修订为六个基本步骤,分别为: 1、转移与汇出登入帐号,2、降级(demote)主要服务器,3、升级(promote)次要服务器,4、通知监控服务器角色已变更,5、在次要服务器上解析登入帐号,6、以及连结数据库存取与权限。
步骤 1: 转移与汇出登入帐号 首先,BOL 建议您建立一个SQL Server 2000 DTS封装(package),用来将主要服务器的登入帐号转移到次要服务器,且执行各服务器间登入帐号SID之解析动作。转移登入帐号所用的 DTS Transfer Logins Task只能在 SQL Server 2000 DTS Designer内使用。您可在主要服务器上建立与储存 DTS 封装,然后呼叫 dtsrun.exe 设定该封装的执行方式 — 透过主要服务器 SQL Server Agent 的工作(job)。该封装执行时会将登入帐号从某服务器传送到另一服务器,但是它并不会解析其登入帐号的SID(在稍后步骤中会说明为何需解析登入帐号)。然而,为了在稍后能顺利解析登入帐号,您必须先建立一个档案,其内包含主要服务器 syslogins 资料表的汇出资料。
汇出登入帐号到次要服务器时,BOL建议您建立一个两阶段的SQL Server Agent工作:使用bcp汇出,以及复制登入帐号。在第一个步骤,您将使用原始模式的bcp将登入帐号汇出至某个档案。而在第二个步骤里,您必须将登入帐号复制到次要服务器的某个档案,以便稍后进行角色变更时可用来解析登入帐号。在步骤5您将使用 sp_resolve_logins 预存程序去解析次要服务器上登入帐号的SID。该工作建立完成后,就可以定期地执行(例如每晚执行一次)。如此一来次要服务器上将随时保留最新的登入帐号汇出文件,以便进行日志传送角色变更。
步骤 2: 降级主要服务器 为了让主要服务器不再是日志传送系统的资料来源,您必须将它”降级”。您可以降级主要服务器的来源数据库,让它变成潜在的次要服务器。然后在主要服务器上执行sp_change_primary_role 预存程序,目的是移除原有日志传送功能。程序代码列表1显示该预存程序如何把 Pubscopy 日志传送数据库从读/写模式更改成只读备援模式,准备随时接受交易日志之备份资料。该预存程序经由数个步骤后会在日志传送计划内删除主要服务器数据库。传入的参数将告之预存程序需执行以下工作:备份最近一次的交易日志、结束数据库内所有使用者联机、将数据库设定在备援状态与多使用者存取层级。预存程序的回传代码将标示 BACKUP LOG 叙述句是否成功执行。
程序代码列表1:将日志传送数据库从读/写模式降级成只读模式之预存程序。
USE master
GO
EXEC msdb.dbo.sp_change_primary_role
@db_name = 'Pubscopy',
@backup_log = 1,
@terminate = 1,
@final_state = 3,
@aclearcase/" target="_blank" >ccess_level = 1
步骤 3: 升级次要服务器 下一个步骤是把目前次要服务器升级成复原状态(recovered state),这样它才能取代原先的线上数据库,且变成潜在日志传送主要服务器数据库。在次要服务器上,如果您已确认无任何使用者继续存取数据库,就可以执行 sp_change_secondary_role 预存程序,如程序代码列表2所示:
程序代码列表 2:将次要服务器数据库升级成主要服务器数据库之预存程序。
USE master
GO
EXEC msdb.dbo.sp_change_secondary_role
@db_name = 'Pubscopy',
@do_load = 1,
@force_load = 1,
@final_state = 1,
@access_level = 1,
@terminate = 1,
@keep_replication = 0,
@stopat = null
这些参数将促使该预存程序尝试将所有剩余的交易日志文件从原先主要服务器复制到次要服务器,并将这些日志文件加载次要服务器数据库。参数 @do_load=1 会进行最近一次备份,并加载所有交易日志文件;参数 @force_load=1 是在执行 sqlmaint.exe 时指定尚未文件化的 Forceload 选项;参数 @final_state=1 将新主要服务器数据库设定为复原模式;参数 @access_level 将存取方式设回先前多使用者状态。参数 @terminate=1 则促使该预存程序中断所有使用者的数据库存取动作 — 方式是执行 ALTER DATABASE 配合 IMMEDIATE 选项。然而,如果执行此预存程序时,您自己的 Enterprise Manager 与数据库间联机处于开启状态,ALTER DATABASE 动作将会失败。所以您必须以手动方式确认是否已将所有数据库联机予以中断。最后,如果该数据库被设定为数据库复写(replication)之出版者数据库(publisher),那么 @keep_replication=0 参数将依旧维持服务器上所有复写设定。
假如您曾选择让次要服务器成为未来潜在的主要服务器,则数据库维护计划会在次要服务器上建置一个交易日志备份工作(SQL Server Agent 的transaction-log backup job)。该工作激活之后,交易日志备份文件就会开始出现在新主要服务器。您需要这些档案去重新设定将日志传送回新次要服务器。
为了达成完整的日志传送角色互换,您只需在新主要服务器与新次要服务器之间重新设定一次日志传送即可。因为新主要服务器已内含崭新的数据库维护计划,您将会倾向在维护计划内直接加入新次要服务器,做为目的服务器。然而经过多次尝试之后,我发现新主要服务器的 "交易日志备份工作" 总是会失败,并且日志也不会从新主要服务器传送到新次要服务器。
所以,您需要另外一种方法。您在执行过日志传送角色变更的预存程序,以及先前我详细说明的步骤后,就可以直接达成完整的角色互换 - 在新主要服务器与新次要服务器之间建置一份新的日志传送计划。为了建置该计划,您需遵循下列步骤:
1. 在新主要服务器的数据库维护计划内移除日志传送功能。
2. 在主要服务器上删除数据库维护计划。
3. 在次要服务器上删除数据库维护计划。
4. 维持所有交易日志文件。
5. 在新主要服务器上建立一个新的数据库维护计划,指定新次要服务器所在、目的数据库位置、以及交易日志文件之适当存放位置,如同我在 Part 1所介绍的内容。
6. 重新开始新主要服务器的所有活动。
在您成功设定角色互换且建置新日志传送配对服务器之后,Enterprise Manager 的日志传送监视器可能会告知您新次要服务器数据库并未与新主要服务器数据库取得同步(out of sync)。如果 "最近一次加载的交易日志" 与 "最近一次备份的交易日志" 之间的时间差超过了 out-of-sync 设定值,您就会收到此报告。直到最近一次的备份资料被加载之后,日志传送监视器就会回到平常无错误状态。
日志传送监视器所在位置
Microsoft 强烈建议将日志传送监视器置放于独立服务器上。如此一来,无论主要服务器或是次要服务器执行工作失败时,该监视器都会送出警示(alert)。如果监视器位于主要或次要服务器其中之一,报告结果将取决于监视器所在服务器。如果监视器所在服务器因故停摆,它将无法继续回报可能的错误情况。所以,要让监视器独立回报日志传送系统内主要或次要服务器上可能发生的问题,给予监视器一台独立服务器是较佳的实作方式。此外,也可以使用这台独立的监控服务器去监控其它日志传送配对服务器。
如果没有其它服务器可安装监控程序,而需要放在主要或次要服务器其中之一。究竟应该把日志传送监视器放在哪台服务器呢?因为重点是想侦测主要服务器上可能发生的日志传送问题,所以放在次要服务器比较妥当。如果将日志传送监视器放在主要服务器上,当主要服务器停摆时,您就无法使用该监视器,监视器也无法在日志传送发生问题时送出警示。所以呢,如果只有两台服务器可使用,次要服务器为置放日志传送监视器较佳的位置。某些时候,为避免灾难发生时影响次要服务器,必须将交易日志从某一实体位置传送到另一个地方(也许有一段距离)。在此情况下,日志传送监视器最好放在其它地方的独立服务器,让灾难发生时不至于影响主要与次要服务器。
日志传送功能可自动复制数据库的交易日志文件,并回存到备援服务器 (standby server) 的另外一个数据库。因此可大幅提高SQL Server数据库之可用性。因为备援数据库完整地接收来源数据库的异动情况,所以它就是一份来源数据库的复本 - 差别仅在于资料复制与加载过程所产生的时间差。然而,当主要服务器停摆时,您就可以将备援服务器更改为新的主要服务器。如果原来的主要服务器可重新上线使用,那么您可以将其设定为新的备援服务器 - 事实上就是对调两台服务器的角色。
在SQL Server 2000企业版或开发版之中,Microsoft在Enterprise Manager内提供了一项日志传送(Log Shipping)的功能 - 为数据库维护计划精灵的其中一部份。在使用之前的SQL Server时,您需要自行建立日志传送系统。
设定日志传送
主要服务器(primary server) 即是实际处理资料的正式服务器;此服务器内拥有来源数据库。次要服务器(secondary server)上存放目的数据库,用来复制与回存来源数据库的交易日志文件。监控服务器(monitor server)用来监控主要服务器与次要服务器。与SQL Server 7.0不同的是(SQL Server 7.0是在次要服务器上监控日志传送动作),SQL Server 2000使用Enterprise Manager的日志传送监控工具来监控每一组传送中的日志资料。Microsoft建议您在另外一台监控用服务器安装这个工具程序。
您可以利用Enterprise Manager的数据库维护计划精灵设定SQL Server 2000的日志传送。但是在您激活精灵之前,您必须先进行某些准备工作。一开始请先遵循下列步骤:
1.决定一组要设定日志传送的服务器(即日志传送过程之中,主要服务器与次要服务器为何)。
2. 选择一台监控服务器。最好不同于主要服务器或次要服务器。
3. 设定所有服务器之安全性。您用来设定日志传送的Windows帐号必须拥有所有服务器上SQL Server系统管理者(sa)的权限。
4. 在主要/次要服务器上建立分享资料夹。首先,将来源数据库交易日志文件所在的目录设定为分享目录。接着在次要服务器上,将您打算回存交易日志文件的目录也分享出来。为了清楚辨别各分享目录,请在分享名称内注明服务器与数据库之名称。如果分享目录名称已存在,您可能需要从分享目录中删除或是搬移其它档案,特别是旧的日志备份文件。然后再将这些分享目录的权限开放给每一台服务器上SQL Agent所使用的Windows帐号。
5. 决定如何建立并初始化目的地数据库。您可以在日志传送设定过程就先建立与初始同步化目的地数据库,否则您必须手动进行初始数据库之回存动作。
6. 在Enterprise Manager注册此三台服务器(即主要、次要与监控服务器)。
在您完成这些准备动作时,您就可以准备激活数据库维护计划精灵来设定日志传送。您可以先检视日志传送过程的五个连续步骤,如图1所示:

图1:SQL Server 2000日志传送的设定步骤。
前两个为选择性(optional)步骤。如果您尚未同步化来源与目的数据库,则步骤1会为您先备份来源数据库,然后执行同步化动作。在步骤2时,精灵会将备份文件复制到次要服务器,并回存到目的地数据库。
精灵一定会执行其余三项步骤。在步骤3时,精灵将在主要服务器上建立一个SQL Agent工作(job)。此工作将会周期性地把交易日志文件内容备份到磁盘档案内。精灵也会在次要服务器上建立一个传送日志的数据库维护计划;此计画包含两个SQL Agent工作:一个是将交易日志文件复制到次要服务器(步骤4),另一个则是将交易日志文件回存到目的数据库(步骤5)。这些步骤将建立一组日志传送服务器(互相有日志传送关系的两个数据库)。如果您想要额外提供容错功能或是设定一台报表服务器,那么您可以将主要服务器与另外一台次要服务器组合在一起,再设定一组日志传送配对服务器。
准备工作
1. 准备 Primary Server (以下为Ztao-1) 及 Secondary