当线上数据库停摆时(可能是计划内维护工作或是预期外的状况)如果还有备援服务器上的数据库可供存取您可能会比较安心一点一个设计良好的日志传送系统(将数据库交易日志文件从主要服务器传送到备援服务器)即可给予您这样的自信心内建于 SQL Serve 企业版与开发版的 Enterprise Manager 工具程序即支持日志传送功能
角色变更
将日志从主要服务器传送到次要服务器之后您可在必要时以次要服务器置换掉主要服务器如果主要服务器发生问题或是计划性停摆(例如升级硬件或安装修正程序)线上数据库就必须停止服务一段期间此时您可以变更次要服务器上数据库之角色让它取代主要服务器之后进而成为线上数据库SQL Server 线上手册(Books OnlineBOL)将此项操作称为日志传送角色变更(log shipping role change)在日志传送过程里次要服务器需设定在无法复原(nonrecovered)状态因此交易日志才能从主要服务器回存到次要服务器(一但您将数据库复原就不能再回存交易记录)变更角色时您需将次要服务器的数据库予以复原并标示其为新主要服务器数据库您也可以将旧主要服务器数据库设定为新次要服务器数据库如果旧主要服务器数据库并未损坏那么就可以在新主要服务器与旧主要服务器(已变成新次要服务器)之间重新建置日志传送功能这种切换方式我们称为角色互换(role reversal)
这些操作指引可修订为六个基本步骤分别为 转移与汇出登入帐号降级(demote)主要服务器升级(promote)次要服务器通知监控服务器角色已变更在次要服务器上解析登入帐号以及连结数据库存取与权限
步骤 : 转移与汇出登入帐号 首先BOL 建议您建立一个SQL Server DTS封装(package)用来将主要服务器的登入帐号转移到次要服务器且执行各服务器间登入帐号SID之解析动作转移登入帐号所用的 DTS Transfer Logins Task只能在 SQL Server DTS Designer内使用您可在主要服务器上建立与储存 DTS 封装然后呼叫 dtsrunexe 设定该封装的执行方式 — 透过主要服务器 SQL Server Agent 的工作(job)该封装执行时会将登入帐号从某服务器传送到另一服务器但是它并不会解析其登入帐号的SID(在稍后步骤中会说明为何需解析登入帐号)然而为了在稍后能顺利解析登入帐号您必须先建立一个档案其内包含主要服务器 syslogins 资料表的汇出资料
汇出登入帐号到次要服务器时BOL建议您建立一个两阶段的SQL Server Agent工作使用bcp汇出以及复制登入帐号在第一个步骤您将使用原始模式的bcp将登入帐号汇出至某个档案而在第二个步骤里您必须将登入帐号复制到次要服务器的某个档案以便稍后进行角色变更时可用来解析登入帐号在步骤您将使用 sp_resolve_logins 预存程序去解析次要服务器上登入帐号的SID该工作建立完成后就可以定期地执行(例如每晚执行一次)如此一来次要服务器上将随时保留最新的登入帐号汇出文件以便进行日志传送角色变更
步骤 : 降级主要服务器 为了让主要服务器不再是日志传送系统的资料来源您必须将它降级您可以降级主要服务器的来源数据库让它变成潜在的次要服务器然后在主要服务器上执行sp_change_primary_role 预存程序目的是移除原有日志传送功能程序代码列表显示该预存程序如何把 Pubscopy 日志传送数据库从读/写模式更改成只读备援模式准备随时接受交易日志之备份资料该预存程序经由数个步骤后会在日志传送计划内删除主要服务器数据库传入的参数将告之预存程序需执行以下工作备份最近一次的交易日志结束数据库内所有使用者联机将数据库设定在备援状态与多使用者存取层级预存程序的回传代码将标示 BACKUP LOG 叙述句是否成功执行
程序代码列表将日志传送数据库从读/写模式降级成只读模式之预存程序
USE master
GO
EXEC msdbdbosp_change_primary_role
@db_name = Pubscopy
@backup_log =
@terminate =
@final_state =
@access_level =
步骤 : 升级次要服务器 下一个步骤是把目前次要服务器升级成复原状态(recovered state)这样它才能取代原先的线上数据库且变成潜在日志传送主要服务器数据库在次要服务器上如果您已确认无任何使用者继续存取数据库就可以执行 sp_change_secondary_role 预存程序如程序代码列表所示
程序代码列表 将次要服务器数据库升级成主要服务器数据库之预存程序
USE master
GO
EXEC msdbdbosp_change_secondary_role
@db_name = Pubscopy
@do_load =
@force_load =
@final_state =
@access_level =
@terminate =
@keep_replication =
@stopat = null
这些参数将促使该预存程序尝试将所有剩余的交易日志文件从原先主要服务器复制到次要服务器并将这些日志文件加载次要服务器数据库参数 @do_load= 会进行最近一次备份并加载所有交易日志文件;参数 @force_load= 是在执行 sqlmaintexe 时指定尚未文件化的 Forceload 选项;参数 @final_state= 将新主要服务器数据库设定为复原模式;参数 @access_level 将存取方式设回先前多使用者状态参数 @terminate= 则促使该预存程序中断所有使用者的数据库存取动作 — 方式是执行 ALTER DATABASE 配合 IMMEDIATE 选项然而如果执行此预存程序时您自己的 Enterprise Manager 与数据库间联机处于开启状态ALTER DATABASE 动作将会失败所以您必须以手动方式确认是否已将所有数据库联机予以中断最后如果该数据库被设定为数据库复写(replication)之出版者数据库(publisher)那么 @keep_replication= 参数将依旧维持服务器上所有复写设定
假如您曾选择让次要服务器成为未来潜在的主要服务器则数据库维护计划会在次要服务器上建置一个交易日志备份工作(SQL Server Agent 的transactionlog backup job)该工作激活之后交易日志备份文件就会开始出现在新主要服务器您需要这些档案去重新设定将日志传送回新次要服务器
Step : 通知监控服务器角色已变更 SQL Server 的日志传送会在监控服务器上安装监控工具程序;最好是在第三台服务器为了通知监控服务器日志传送的角色已经过变更您必须在监控服务器上执行 sp_change_monitor_role 预存程序如程序代码列表所示尽管名称内含有 change 字眼但它并不会变更监控服务器的角色相反地此预存程序会变更主要/次要服务器内档案分享所参照(reference)的位置意思是说监控服务器 log_shipping_secondaries 资料表内原先参照旧次要服务器的资料会被删除而在 log_shipping_primaries 资料表内则是将旧主要服务器名称更改为新主要服务器名称此预存程序并不会将资料新增到 log_shipping_secondaries 资料表因为新的配对服务器目前尚未建置
程序代码列表 将角色互换结果通知监控服务器之预存程序
USE master
GO
EXEC msdbdbosp_change_monitor_role
@primary_server = oahu\sqlk_
@secondary_server = oahu\sqlk_
@database = Pubscopy
@new_source = oahu\sqlk_
步骤 : 在次要服务器上解析登入帐号 您必须先在新主要服务器上解析旧主要服务器登入帐号使用者才可以存取新主要服务器;方式是使用步骤所汇出之登入帐号档案此汇出档案可被 sp_resolve_logins 预存程序所读取然后解析各服务器间 SID 的差异举例来说程序代码列表示范如何在新复原的 Pubscopy 数据库上执行 sp_resolve_logins 预存程序去解析原来的登入帐号BOL文章曾教导您必须在目的数据库内才能执行该预存程序事实上sp_resolve_logins 使用了非完整式参照(unqualified reference)指向 syslogins 视观表所以您必须在 master 数据库内才能执行此预存程序!
程序代码列表 在次要服务器上解析登入帐号的预存程序
USE master
GO
EXEC sp_resolve_logins
@dest_db = Pubscopy
@dest_path = d:\
@filename = sysloginsdat
步骤 : 连结数据库存取与权限 BOL 对于角色变更的相关讨论仅止于步骤但是它忽略一个重要步骤在 数据库存取权限 与 转移后登入帐号 之间进行协调动作为了在新主要服务器内线上数据库将移转后已解析的登入帐号连结至相对应的数据库使用者及其权限您必须执行针对每个登入帐号执行一次 sp_change_users_login 预存程序
USE pubscopy
GO
EXEC sp_change_users_login Update_One UserName LoginName
执行该预存程序可确保 SQL Server 登入帐号能够正确地连结相对应的数据库使用者名称
到此为止您已经成功地将次要服务器升级为新的角色而旧主要服务器也早已变成次要服务器然而您仍然尚未建置新的日志传送关系您完成的只是角色变更而不是角色互换
角色互换
为了达成完整的日志传送角色互换您只需在新主要服务器与新次要服务器之间重新设定一次日志传送即可因为新主要服务器已内含崭新的数据库维护计划您将会倾向在维护计划内直接加入新次要服务器做为目的服务器然而经过多次尝试之后我发现新主要服务器的 交易日志备份工作 总是会失败<