sqlserver 2012实施与管理学习笔记(一):选型和部署之单机部署、故障转移群集与日志传送

  • 数据库的选型和部署
    • sqlserver的安装和升级
    • 选择高可用性和灾难恢复技术
      • 故障转移群集
      • 日志传送
      • 数据库镜像
      • 复制
    • 高可用和灾难恢复技术的比较
    • AlwaysOn高可用技术

数据库的选型和部署

sqlserver的安装和升级

sqlserver通过执行setup.exe调用安装向导来实现数据库安装与升级。该执行文件会检测在本服务器上是否有已安装过的setup.exe文件缓存。如果有且其版本高于或等于正在执行的setup.exe程序,就会切换到本机上的setup.exe执行。

安装日志
sqlserver 2012在安装或升级过程中产生的日志文件存放在Program Files\Microsoft SQL Server\110\Setup Bootstrap\Log文件夹下。子目录的格式为YYYYMMDD_HHMMSS,代表安装或升级开始的日期和时间。

子目录中最重要的日志文件为Summary_主机名_YYYYMMDD_HHMMSS.txt,称为安装小结。父目录Log下也有一个Summary.txt文件,其内容与最近日期的安装小结相同。

子目录下的Detail.txt文件是详细日志,记载了安装或升级的详细过程,一般只用Ctrl F定位其中的ErrorException字段。

数据库组件以msi文件安装时,生成的日志命名格式为Feature_Architecture_Iteration.log。比如,sql_ssms_Cpu64_1.log是在64位平台上安装SSMS组件生成的日志。

字符集和排序规则(Collation)
国内一般在安装时选择中文字符集,否则将无法在char和varchar等数据类型字段中存放中文字符。一旦服务器级别的字符集和排序规则确定,如果想要修改则必须重建系统数据库,这将与重新安装数据库服务所花费的成本差不多。

单机安装常见问题

  1. 性能计数器检查失败,导致无法安装:一般是因为操作系统为英文而安装的sqlserver为中文导致的,解决办法是把操作系统语言切换为中文再重新安装即可;
  2. 安装在某阶段出现hang现象:可能是因为在超过32个CPU的环境下.net framework 2.0的bug导致,也可能是由于CPU个数为奇数或者CPU核数不是2的指数等其他原因导致;
  3. 安装时无法启动数据库服务:需要查看数据库错误日志或者操作系统应用程序日志来确认原因,再通过Bing搜索相关问题以寻找解决办法;
  4. 安装时报WMI错误:通常是由于之前的sqlserver失败的安装没有被彻底卸载而导致的;
  5. 安装打补丁时,由于%windir%\installer下的MSI或MSP文件丢失,导致打补丁失败:根据微软官方文档使用FindSQLInstalls.vbs脚本查看当前的安装是否有丢失MSI或MSP文件,并对丢失文件进行修复。

群集安装
sqlserver 2012的群集安装以节点为单位,在主节点上安装好以后,然后在其它节点逐个进行安装。群集安装通常需要满足以下要求(具体配置需要参考行业或企业标准):

  • 一些重要服务需要开启,比如Remote Registry, Task Scheduler, Cryptographic, Server, Cluster服务等;
  • 群集环境下的所有磁盘必须上线;
  • 网络检查:节点之间能够相互ping通,安装账号可以远程登录到其他节点;
  • 文件共享检查:节点之间能够互相访问文件共享;
  • 域控权限检查:群集名要有创建计算机对象的权限,否则SQL Network Name无法被创建从而会导致安装失败。

数据库升级
与打补丁不同的是,打完补丁我们还可以把补丁卸载,但是对于大版本的升级,一旦升级成功就无法降级。因此大版本升级之前一般至少要做好如下评测:

  1. 旧版本数据库功能是否可以在新版本上正常工作?
  2. 新版本上数据库性能是否会大幅度降低?
  3. 在线升级过程中,如果出现异常,导致服务无法启动,是否有回退方案?
  4. 对于数据库镜像、复制、日志传输、群集这样复杂的环境,升级的顺序怎么确定?
  5. 数据库升级成功后有无注意事项?

对于以上问题一般有如下建议:

  1. 使用SQL Server Upgrade Advisor评估从旧版本升级到新版本是否会存在兼容性问题;
  2. 升级之前做一下性能测试。新版本中有些语句的执行方式可能发生变化,从而导致性能下降,因此可能需要通过调整语句或者表格的设计来适应新版本的特点;
  3. 安全的做法是在升级之前对系统和所有的数据库做一个备份
  4. 对于有特殊配置的数据库服务器,需要注意升级的步骤,避免发生数据库同步失败。最好的办法是先在测试环境中确认一下,然后再在生产环境中实施;
  5. 大版本升级完成后,还需要确认数据库的兼容级别升级到了最新版的数据库、重建数据库索引、更细数据库统计信息。表格上的统计信息不准确会导致升级以后的系统出现严重的性能问题。

选择高可用性和灾难恢复技术

sqlserver有四个传统的高可用性和灾难恢复技术:故障转移群集(Failover Cluster)、日志传送(Log Shipping)、复制(Replication)和数据库镜像(Database Mirroring)。

数据库服务状态
sqlserver服务有在线和宕机两种状态。在线是指sqlserver服务正常运行的状态。宕机状态下,或者用户无法建立连接,或者sqlserver服务的可执行文件无法正常运行,或者数据库文件无法正常读写。为了尽量减少宕机时间,DBA需要努力让数据库不出现或者少出现宕机事件,并且在宕机后尽快地恢复服务。于是有了高可用性和灾难恢复技术。

高可用性(High Availability, HA)
高可用性指的是数据库服务能够始终保持在线运行。高可用性技术关心的是sqlserver服务本身,它要努力保证在任何一个时间点客户端都能找到一个sqlserver服务来响应它们的请求。

灾难恢复(Disaster Recovery, DR)
灾难恢复,也称为灾备,指的是当数据库中的数据发生损坏或者不可访问时,在尽可能短的时间内恢复全部数据或者恢复尽可能多的数据。灾备要的是保证数据库里的数据始终可用。

故障转移群集

Windows故障转移群集
sqlserver故障转移群集技术基于Windows故障转移群集。Windows群集由多个服务器组成,每个服务器(节点)上都运行着群集服务。所有节点(node)都有着相同的软硬件配置。节点之间共享的数据和日志文件都放在共享磁盘(shared array)中,不需要共享的内容则放在各自的本地磁盘中。

群集节点之间通过私有网络和公有网络连接。节点之间通过私有网络发送心跳信号(heartbeat)来确认彼此是否正常工作。无法回应心跳信号的节点会被踢出群集。外部资源则可以通过公有网络访问节点。

群集中所有节点组成一台虚拟服务器(Virtual Server),该虚拟服务器具有自己的虚拟网络名(Virtual Network Name)和公有虚拟IP地址(vip)。外部访问只能看到虚拟服务器,而看不到群集节点服务器。

在任意时刻,群集中只有一个节点为客户提供服务和资源(称为活跃节点),其他节点都处于空闲状态,因此无法提供负载均衡的能力。如果当前活跃节点发生故障,群集服务会自动发起故障转移,将群集资源在另一个节点上线。这个过程对用户来说是几乎透明的(即不会被客户感知到)。

sqlserver故障转移群集
sqlserver故障转移群集即是指将sqlserver服务部署在Windows群集中的多个节点上,组成一个虚拟的sqlserver实例对外界提供服务。一个sqlserver群集资源组包含以下资源:

  • sqlserver网络名(server name)和IP地址,用于对外界提供数据库访问;
  • sqlserver服务和sqlserver agent服务,是sqlserver群集的关键资源;
  • 共享磁盘,用于存放数据库的数据文件和日志文件;
  • 其他需要的资源,比如Analysis Services, File Share等。

所有群集资源都可以在Windows群集管理器(Failover Cluster Manager)中查看(运行cluadmin.msc)。每个资源可能处于的状态包括:上线(online)、离线(offline)、失败(failed)、上线挂起(online pending)、离线挂起(offline pending)。挂起状态不会长时间保持,最终会转变为上线、离线或失败状态。

资源之间存在依赖关系(Dependencies),可以在资源的属性选项卡里查看。一个资源所依赖的其他资源必须和它处于同一个资源组内。群集资源属性里的策略(Policies)选项卡决定了该资源发生故障转移时的行为(重启、故障转移以及时间安排)。高级策略(Advanced Policies)选项卡中,Possible Owners选项中可以选择该资源可以切换到哪些节点上运行。

高级策略选项卡中还包含"Basic resource health check interval"和"Thorough resource health check interval"两个选项。前者称为"looksalive check",检查sqlserver服务在活跃节点是否处于启动状态,默认每5秒做一次;后者称为"isalive check",一般是由群集服务连接到sqlserver并执行select @@servername语句,默认每60秒做一次。如果这两种检查未通过,则判定该资源出现异常,就会按照策略选项卡里的设置来进行故障转移。

无论群集有几个节点,对于某个数据库实例而言它只有一份数据,因此sqlserver群集并不是一个提供数据灾难恢复的技术。

sqlserver 2012对群集的改进
相比sqlserver 2008,sqlserver 2012新增了如下特性:

  • 多子网群集的支持(只限于IP地址资源依赖关系是OR的情况):多子网群集不是在所有节点间共享数据存储,需要在多个子网之间进行硬件存储器级别的数据复制,因此可以获得多个可用数据副本,提供了数据灾难恢复解决方案。
  • 虚拟网络名资源的RegisterAllProvidersIP属性:如果该属性值设为0,只有上线的IP地址会被注册到DNS;为了避免DNS更新延迟带来的问题,该属性值可设为1,即多子网群集会在DNS服务器上注册虚拟网络名到所有IP地址之间的解析关系。
  • 存放数据库的物理位置:除系统资源数据库(resource DB)以外的所有系统数据库(master, msdb, model, tempdb)不但可以存放在共享磁盘中,也可以存放在共享文件夹中(必须使用\\Servername\ShareName…这样的通用命名约定UNC路径格式)。
  • 新的资源动态链接库Resource DLL(dynamic link library, dll):isalive检查方式发生了变化,不仅检查群集服务和sqlserver之间的连通性,还依赖sqlserver内部自我诊断(调用sp_server_diagnostics),同时允许用户自己指定发生故障转移的条件。

群集故障排查
sqlserver群集故障排查主要针对两类问题:(1)sqlserver资源无法上线;(2)sqlserver意外发生故障切换。

针对第一个问题,可以按照如下顺序进行排查:

  1. 故障转移群集管理器中,确保sqlserver资源所依赖的其他资源都可以上线。如果不能上线请查看Windows事件日志中的错误和警告信息;
  2. 确认资源都可以上线以后,找到当前节点本地磁盘sqlserver实例Binn目录下的sqlservr.exe文件,用命令行重启sqlserver。如果重启失败请查看Log目录下的sqlserver错误日志ERRORLOG;
  3. 如果sqlserver可以通过命令行重启,则问题出现在Windows群集连接sqlserver执行sp_server_diagnostics的过程中。这时可以使用sqlcmd等工具来连接通过命令行启动的sqlserver服务(Windows认证模式),如果连接失败则应该是连接认证问题;
  4. 如果sqlcmd连接成功,那么问题可能与Kerberos/NTLM认证方式的问题。

如果sqlserver发生了意外的故障转移,需要收集以下信息进行排查:

  • Windows群集日志
  • sqlserver的错误日志
  • Windows事务日志
  • SQLDIAG的扩展事件(Extended events)日志

SQLDIAG扩展事件日志与sqlserver错误日志一样存放在实例的Log文件夹下,命名格式为节点名_实例名_SQLDIAG_序号_创建时间.xel

日志传送

日志传送是最早出现的提供数据灾难恢复的技术之一。通过最基本的数据库事务日志备份和还原任务,来保持两台或多台机器之间的数据库同步,以实现数据冗余和灾难恢复的目的。

主服务器和数据库
日志传送配置的主服务器是作为生产服务器的sqlserver实例。主数据库是主服务器上希望备份到其他服务器的数据库。所有用户端发来的数据操作请求,都是由主数据库处理的。主数据库必须使用完整恢复模式或者大容量日志恢复模式,不支持简单恢复模式。

辅助服务器和数据库
辅助服务器是保存主数据库副本的服务器。辅助服务器上的辅助数据库可以配置成两种模式:

  • 无恢复模式(NORECOVERY):既不前滚也不回滚未提交的事务,数据不可读;
  • 备用模式(STANDBY):在恢复日志期间回滚所有未提交的事务,数据库可读。

备用模式下辅助数据库可被用于生成报表等只读需求。

监视服务器
监视服务器是可选的,它可以跟踪数据传送的所有细节,包括主数据库中事务日志最近一次的备份时间、辅助数据库最近一次复制和还原备份文件的时间、有关任何备份失败的警告信息。

工作机制
日志传送组件在主服务器上对数据库做日志备份,然后把日志备份文件复制到所有辅助服务器上,最后在辅助服务器上还原备份日志。日志传送会在主服务器、辅助服务器、监视服务器上创建相应的作业(Job)来完成这些工作。每个服务器上的SQL Server Agent每隔一定时间会启动这些作业,包括:

  • 备份作业,名字为LSBackup_主数据库名
  • 复制作业,名字为LSCopy_主服务器实例名_辅助数据库名
  • 还原作业,名字为LSRestore_主服务器实例名_辅助数据库名
  • 警报作业,名字为LSAlert_监视服务器实例名

备份作业生成的日志备份文件的命名格式为主服务器名_时间戳。执行复制作业之前,日志传送会检查共享目录中所有文件的文件名,并与辅助服务器msdb系统数据库的log_shipping_secondary表中最近一次被复制的日志备份文件作比较,以确定复制哪个备份文件。执行还原作业时,则会查询msdb数据库中的log_shipping_seconday_databases表,以确定最近一次还原操作的时间。

作业执行间隔
由于sqlserver agent每隔一段时间才会触发作业,主辅数据库之间的同步并不是实时的,存在一定的延迟。用户所关心的最大数据损失量仅是由备份作业运行的时间间隔所决定的。sqlserver所允许的作业最小执行间隔为10秒,因此理论上如果发生数据损失,最少会丢失10秒的数据。但是如果作业的执行间隔设置得太小的话,也会给主服务器带来额外的负担,影响数据库的性能。

另一方面,根据业务需求,也可以故意把复制作业和还原作业的执行时间间隔设置为远大于备份作业。这样一旦主数据库上发生了严重的用户错误(比如误删了某张表或者某些行),这些错误操作不会被马上同步到辅助数据库。

日志传送的故障转移
日志传送的故障转移需要很多手动操作,相比群集而言更加麻烦。基本流程如下:

  1. 备份主数据库的尾日志(如果可以的话;如果主数据库完全不可用,则必须完全重建日志传送);
  2. 在辅助数据库上,通过还原事务日志备份实现数据同步;
  3. 恢复辅助数据库(restore database ... with recovery)使其成为故障转移的目标数据库,并删除辅助数据库中的复制作业和还原作业;
  4. 手动把master数据库中的登录信息从原来的主服务器实例迁移到新的主服务器实例;
  5. 通过修改连接字符串和使用别名等方法把应用重新定向到新的主服务器上;
  6. 修复原来的主数据库并使其转变为辅助数据库角色。

监控和故障排查
监控日志传送最直观的办法是查看SSMS报表服务中的“事务日志传送状态”,或者在master数据库中执行sp_help_log_shipping_monitor。同时也可以在SSMS中查看作业的历史信息:

  • 在主服务器和辅助服务器上执行查询select * from [msdb].[dbo].[sysjobs] where category_id=6获得所有日志传送作业ID,然后查询msdb..sysjobhistory中对应的作业历史信息;
  • 在主服务器、辅助服务器和监视服务器上执行查询select * from [msdb].[dbo].[log_shipping_monitor_history_detail]
  • 在主服务器、辅助服务器和监视服务器上执行查询select * from [msdb].[dbo].[log_shipping_monitor_error_detail]

和复制作业相关的问题通常可以分为以下三类:

  • 权限问题,无法访问存放日志备份的共享目录或者无法写入辅助服务器上的本地目录。需要检查SQL Server Agent启动账户是否具有相应权限;
  • 共享目录不存在(未被共享或者被移动了);
  • 日志备份文件名被修改了,时间戳小于最近一次被复制文件的时间戳。

和还原作业相关的问题通常可以分为以下四类:

  • 无法访问日志备份文件,因为该文件正在被其他进程使用。可以使用Process Explorer工具查看占用备份文件的进程(看不到的话则可能是杀毒软件或监控软件正在扫描该文件);
  • 没有权限读取本地目录中的日志备份文件。需要检查SQL Server Agent启动账户是否具有相应权限;
  • 日志备份文件已损坏,无法还原。解决办法是再次复制该日志备份文件或者重建备份;
  • 日志备份文件的日志记录号(LSN, Log Sequence Number)不在允许还原的范围内。

以下内容参见下一篇文章。

数据库镜像

复制

高可用和灾难恢复技术的比较

AlwaysOn高可用技术

Reference: SQL Server 2012实施与管理实战指南

sqlserver 2012实施与管理学习笔记(一):选型和部署之单机部署、故障转移群集与日志传送相关推荐

  1. 第八章 Hyper-V 2012 R2 故障转移群集

    和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...

  2. Hyper-V 2012 R2 故障转移群集

    和终端用户相比,企业用户对于业务的连续性和可靠性更为在意.相对而言,企业一般不会将追逐单一硬件的性能排在第一位. 如何衡量业务是否持续可用,一般使用"x 个 9"这种方式来定义.如 ...

  3. Windows内存管理学习笔记(三)—— 无处不在的缺页异常

    Windows内存管理学习笔记(三)-- 无处不在的缺页异常 缺页异常 实验一:设置虚拟内存 无处不在的缺页 位于页面文件 保留与提交的误区 实验二:理解缺页异常 EXECUTE_WRITECOPY ...

  4. Windows内存管理学习笔记(二)—— 物理内存的管理

    Windows内存管理学习笔记(二)-- 物理内存的管理 物理内存 实验一:理解MmNumberOfPhysicalPages MmPfnDatabase _MMPFN 物理页状态 六个链表 实验二: ...

  5. Windows内存管理学习笔记(一)—— 线性地址的管理

    Windows内存管理学习笔记(一)-- 线性地址的管理 用户空间线性地址的管理 实验一:理解用户空间线性地址管理 Private Memory 实验二:理解Private Memory 堆 实验三: ...

  6. 数据库空间管理-学习笔记

    来自<SQL Server 2012实施与管理实战指南> 1.数据文件的存储结构: 页:数据存储的基本单位是页,每一个页为8kb,每MB有128页.磁盘的IO操作在页级.每页开头是一个96 ...

  7. 郝健: Linux内存管理学习笔记-第5节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 摘要 ...

  8. 郝健: Linux内存管理学习笔记-第6节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 郝健: Linux内存管理学习笔记-第4节课 郝健 ...

  9. 郝健: Linux内存管理学习笔记-第4节课

    前序文章: 郝健: Linux内存管理学习笔记-第1节课 郝健: Linux内存管理学习笔记-第2节课 郝健: Linux内存管理学习笔记-第3节课 摘要 page cache free命令的详细解释 ...

最新文章

  1. SpringCloud Hystrix初体验
  2. 【docker】【Gitlab】gitlab中clone项目时,IP地址是一串数字(内网Gitlab的IP地址不正确)的问题解决...
  3. 李天华:2017年短视频最值得投入的战略性方向
  4. java适配器模式火鸡变凤凰是,读《HeadFirst设计模式》笔记之适配器模式
  5. mysql从一个表查询插入另一个表存在时更新_漫谈MySQL的锁机制
  6. 别再写一堆的 for 循环了!Java 8 中的 Stream 轻松遍历树形结构,是真的牛逼!...
  7. 智慧校园APP开发有哪些功能
  8. 进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
  9. uni-app 小程序分享到朋友和朋友圈
  10. 关于wkhtmltopdf生成pdf空白
  11. linux 64位 虚拟内存空间,Linux在x86-64下的虚拟内存布局
  12. 经典算法系列之不死神兔
  13. ibm服务器修复安装win7系统,联想thinkpad无法开机重装win7,教你重装系统攻略
  14. bzoj4094[Usaco2013 Dec]Optimal Milking最优挤奶
  15. MQTT+ActiveMQ实现消息推送(移动端)
  16. 检测心电信号的p波的matlab代码,matlab心电信号R波检测程序.doc
  17. 获取 Windows 任务管理器中应用程序和进程 任务
  18. 只有tcp 没有rtsp_如何在2020年在您的网站上烹饪RTSP,或者为什么公猪没有机会逃脱
  19. kafka性能测试之Comsumer
  20. 基于arduino及PS2的麦克纳姆轮遥控小车

热门文章

  1. Excel如何通过年份上的时间差操作求得员工工龄
  2. 关于x86中为什么CS:IP里的0xffff左移四位是0xffff0
  3. SAP RETAIL 执行事务代码WRP1,报错-Transaction WRP1 cannot be executed-
  4. warning: mysql_fetch_array_php提示Warning:mysql_fetch_array() expects的解决方法,expects
  5. JAVA中用程序绘制国际象棋与中国象棋棋盘
  6. 品牌技术专场重磅加盟,看音视频如何引领新趋势
  7. StellarWP 收购 LearnDash 学习管理系统
  8. 企业微信如何自动同步外部客户信息到CRM系统
  9. redis数据库指令
  10. 世纪佳缘钓鱼白帽子,互联网安全的边界如何界定?