第1部分 数据库系统的选型和部署 2
第1章SQL Server的安装和升级 2
1.1数据库安装过程介绍 3
1.1.1 setup.exe执行过程 3
1.1.2重要的数据库的安装日志文件 5
1.2单机版本的数据库安装和打补丁 13
1.2.1安装注意事项 13
1.2.2用S1ipStream方式进行安装 14
1.2.3用Product Update方式进行安装 15
1.2.4常见安装问题 16
1.3特殊版本的数据库安装 18
1.4群集环境下数据库的安装和升级 20
1.5数据库的升级 27
1.6小结 30
第2章 选择必要的高可用性和灾难恢复技术 31
2.1什么是SQL Server的“高可用性”与“灾难恢复” 31
2.2 SQL Server故障转移群集 33
2.2.1 Windows故障转移群集 33
2.2.2 SQL Server故障转移群集 36
2.2.3 SQL Server群集什么时候会发生“故障转移” 40
2.2.4 SQL Server群集的拓扑结构 43
2.2.5 SQL 2012对故障转移群集的改进 44
2.2.6故障转移群集的故障排查 55
2.3日志传送 58
2.3.1日志传送的结构 59
2.3.2日志传送的工作机制 60
2.3.3日志传送作业的执行间隔 64
2.3.4日志传送的故障转移 65
2.3.5 日志传送的监控和故障排查 68
2.4数据库镜像 71
2.4.1数据库镜像的基本概念 71
2.4.2数据库镜像操作模式 74
2.4.3客户端连接重定向及超时控制 78
2.4.4数据库镜像的监控和故障排查 81
2.5复制 84
2.5.1复制的基本概念 84
2.5.2复制的类型 86
2.5.3灾难恢复和复制 90
2.6高可用和灾难恢复技术的选择 91
2.6.1高可用和灾难恢复技术的比较 91
2.6.2高可用和灾难恢复技术的组合 97
2.7小结 100
第3章 新一代的高可用技术AlwaysOn 101
3.1 AlwaysOn的基本架构 102
3.2 AlwaysOn的数据同步原理 106
3.3 AlwaysOn的可用性模式 107
3.4 AlwaysOn的故障转移形式 111
3.5创建一个AlwaysOn可用性组 118
3.6 可读的辅助数据库 127
3.7监视AlwaysOn可用性组的运行状态 133
3.8小结 138
第4章 数据库连接组件编程机理 140
4.1数据库应用编程方法概述和组件架构 141
4.1.1 WDAC编程 141
4.1.2 SNAC编程 162
4.1.3 ADO.NET编程 163
4.2连接字符串 166
4.3连接池 169
4.4 Connection Timeout和Command Timeout 173
4.5使用BID Tracing来跟踪检查应用程序的执行 181
4.6小结 185
第2部分SQL Server日常管理 188
第5章 启动SQL Server服务和数据库 188
5.1 SQL Server服务启动步骤 189
5.1.1从注册表读取SQL Server启动信息 190
5.1.2检测硬件,配置内存与CPU 193
5.1.3数据库启动 195
5.1.4准备网络连接 195
5.2数据库状态切换 198
5.3数据库长时间处于RECOVERING状态 201
5.4数据库不能启动的常见原因和解决办法 206
5.4.1 master数据库不能启动 206
5.4.2资源数据库 208
5.4.3 model数据库 210
5.4.4 tempdb数据库 212
5.4.5用户数据库 214
5.5群集环境下,数据库资源不能ONLINE的常见原因 220
5.5.1由于单机原因导致数据库服务无法启动 222
5.5.2由于SQL Server所依赖的资源失败所导致 223
5.5.3由于群集服务无法连接导致数据库资源失败 224
56小结 228
第6章 连接的建立和问题排查 229
6.1协议的选择与别名 230
6.1.1服务器网络配置 231
6.1.2 SQL Server Browser的作用 233
6.1.3客户端网络配置 235
6.1.4客户端网络连接选择机制 239
6.2连接失败检测步骤——命名管道 241
6.2.1 SQL Server命名管道工作原理 242
6.2.2客户端的命名管道配置 243
6.2.3命名管道连接问题的解决步骤 245
6.2.4一些常见的连接问题 246
6.3连接失败检测步骤——TCP/IP 247
6.3.1 SQL Server监听的TCP/IP端口号 248
6.3.2客户端的TCP/IP协议配置 249
6.3.3 TCP/IP连接的keepalive机制 251
6.3.4配置SQL Server的keepalive配置 252
6.3.5配置客户端的keepalive配置 253
6.3.6 TCP/IP连接问题的解决步骤 254
6.4一般性网络错误 258
6.5利用Ring Buffer排查连接问题 266
6.6小结 271
第7章 身份认证与连接加密 272
7.1 SQL Server的认证方式 273
7.1.1 SQL Server认证模式和密码管理 273
7.1.2 Windows认证模式 274
7.1.3常见认证问题 286
7.1.4 Delegation的配置要求 288
7.2包含数据库认证 295
7.2.1创建包含数据库 296
7.2.2使用包含数据库认证 299
7.2.3包含数据库认证的安全须知 303
7.3连接加密和证书 305
7.3.1 SQL Server的连接加密 306
7.3.2使用证书来加密SQL Server连接 313
7.4小结 319
第8章 数据库空间管理 320
8.1数据文件的空间使用和管理 321
8.1.1数据文件存储结构 321
8.1.2表存储结构 323
8.1.3比较存储结构对空间使用的影响 332
8.2日志文件的空间使用和管理 337
8.3空间使用计算方法 341
8.4 tempdb的空间使用 346
8.5数据文件的收缩 353
8.6日志文件不停地增长 362
8.7文件自动增长和自动收缩 367
8.8小结 370
第9章 数据库备份与恢复 371
9.1备份概述 372
9.2选择备份策略和恢复模式 375
9.2.1简单恢复模式下的备份 376
9.2.2完整恢复模式下的备份 377
9.2.3文件或文件组备份 381
9.3选择数据库还原方案 382
9.3.1数据库完整还原 384
9.3.2文件还原 386
9.3.3页面还原 387
9.3.4段落还原 390
9.3.5还原方案小结 393
9.3.6孤立用户故障排除 394
9.4系统数据库备份与恢复 395
9.4.1 master数据库 396
9.4.2 model数据库 397
9.4.3 msdb数据库 397
9.4.4 tempdb和资源数据库 398
9.5带有FILESTREAM功能的数据库备份和恢复 399
9.6应对由于备份损坏导致的还原错误 401
9.7实例:将数据库系统在一台新服务器上恢复 403
9.8小结 408
第10章 数据库损坏修复 409
10.1常见错误解读 409
10.1.1 823 409
10.1.2 824 410
10.1.3 605 412
10.1.4其他 413
10.2 DBCC CHECKDB 414
10.2.1 DBCC CHECKDB在做什么 414
10.2.2 DBCC CHECKDB提供的修复方法 418
10.2.3如何在超大数据库上运行DBCC CHECKDB 420
10.3不同部位损坏的应对 423
10.3.1备份文件损坏 424
10.3.2日志文件损坏 426
10.3.3用户数据文件损坏 427
10.3.4系统数据库损坏 431
10.4如何从损坏的数据库导出数据 432
10.5如何使用TableDiff工具发现哪些数据有丢失或改变 439
10.6数据库反复损坏问题应对 440
10.6.1 SQL I/O管理操作方法 441
10.6.2确保系统I/O正常 443
10.6.3 SQL层面能够做的设置 448
10.7 Database Mirroing和AlwaysOn的页面自动修复功能 449
10.8小结 452
第3部分SQL Server资源调度与性能调优 454
第11章SQL Server内存分配理念和常见内存问题 454
11.1从操作系统层面看SQL Server内存分配 457
11.1.1 Windows的一些内存术语 457
11.1.2 32位下Windows的地址空间及AWE 460
11.1.3 Windows层面上的内存使用检查 463
11.1.4内存使用和其他系统资源的关系 468
11.1.5 SQL内存使用和Windows之间的关系 470
11.1.6 SQL内存使用量陡然下降现象 472
11.1.7案例分析 474
11.1.8如何“合理”配置SQL Server内存 476
11.2 SQL Server内部独特的内存管理模式 477
11.2.1内存使用分类 478
11.2.2 32位下各部分内存的分布和大小限制 482
11.2.3 SQL Server在不同服务器配置下各部分内存的最高使用上限 484
11.2.4一些内存使用错误理解 485
11.3 SQL Server内存使用状况分析方法 487
11.3.1 SQL性能计数器 488
11.3.2内存动态管理视图(DMV) 490
11.4数据页缓冲区压力分析 497
11.4.1表现特征 497
11.4.2确定压力来源和解决办法 500
11.5 Stolen Memory缓存压力分析 508
11.5.1 Stolen缓存区与数据页缓存区的相互关系 509
11.5.2内部压力与外部压力 510
11.5.3表现特征与解决办法 510
11.6 Multi-page缓存区压力分析 512
11.7常见内存错误与解决办法 515
11.7.1错误701 516
11.7.2错误8645 520
11.7.3 SQL Server无法创建新的线程 524
11.8 SQL Server 2012内存管理的新变化 525
11.8.1总体变化 527
11.8.2 AWE和LockedPages的变化 528
11.8.3内存相关的诊断工具的变化 530
11.8.4 SQL Server 2012内存相关配置的变化 533
11.8.5其他改变 535
11.9小结 535
第12章SQL Server I/O问题 537
12.1 SQL Server的I/O操作 537
12.2系统级I/O问题判断 544
12.3数据库引擎错误833 548
12.4 I/O问题的SQL Server内部分析 550
12.5硬盘压力测试 558
12.6圣剑——Windows提供的新的底层监测功能 564
12.7小结 570
第13章 任务调度与CPU问题 572
13.1 SQL Server独特的任务调度算法 573
13.1.1 SQLOS的任务调度算法 575
13.1.2任务调度健康监测及常见问题 580
13.1.3一个内存转储文件的分析调试过程 583
13.1.4案例分析 588
13.2 SQL Server CPU 100%问题 592
13.3 OLTP和Data Warehouse系统差别及常用性能阈值 597
13.3.1 OLTP系统 597
13.3.2 Data Warehouse系统 604
13.4小结 609
第14章 阻塞与死锁——知识准备 611
14.1锁产生的背景 612
14.2锁资源模式和兼容性 614
14.3事务隔离级别与锁的申请和释放 618
14.4如何监视锁的申请、持有和释放 628
14.4.1检查一个连接当前锁持有的锁 628
14.4.2监视语句执行过程中SQL对锁的申请和释放行为 629
14.5锁的数量和数据库调优的关系 630
14.5.1一个常见的SELECT动作要申请的锁 634
14.5.2一个常见的UPDATE动作要申请的锁 639
14.5.3一个常见的DELETE动作要申请的锁 641
14.5.4一个常见的INSERT动作要申请的锁 643
14.6小结 645
第15章 阻塞与死锁——问题定位与解决 646
15.1阻塞问题定位方法及实例演示 647
15.2如何捕捉不定时出现的阻塞信息 655
15.3常见阻塞原因与解决方法 658
15.4案例分析:连接池与阻塞 666
15.4.1连接池与SQL Server 666
15.4.2正常情况下连接池在SQL Server端的处理方式 667
15.4.3程序端意外情况下SQL Server端可能导致的问题——应用端超时 671
15.4.4程序端意外情况下SQL Server端可能导致的问题——应用层事物未提交 675
15.5死锁问题定位及解决方法 680
15.5.1死锁所在的资源和检测 680
15.5.2问题定位 682
15.5.3解决办法 686
15.5.4动手实验 687
15.6小结 698
第16章 从等待状态判断系统资源瓶颈 699
16.1 LCK xx类型 701
16.2 PAGEIOLATCH x与WRITELOG 702
16.3 PAGELATCH x 704
16.4 tempdb上的PAGELATCH 708
16.5其他资源等待 710
16.6最后一道瓶颈:许多任务处于RUNNABLE状态 713
16.7小结 715
第17章 语句调优——知识准备 719
17.1索引与统计信息 723
17.1.1索引上的数据检索方法 723
17.1.2统计信息的含义与作用 727
17.1.3统计信息的维护和更新 732
17.2编译与重编译 736
17.3读懂执行计划 750
17.3.1连接 754
17.3.2其他常见的运算操作 762
17.4读懂语句运行统计信息 765
17.4.1 Set statistics time on 766
17.4.2 Set statistics io on 768
17.4.3 Set statistics profile on 770
17.5小结 775
第18章 语句调优——问题定位与解决方法 776
18.1是否是因为做了物理I/O而导致的性能不佳 777
18.2是否是因为编译时间长而导致性能不佳 780
18.3判断执行计划是否合适 784
18.3.1预估cost的准确性 784
18.3.2是Index Seek还是Table Scan 790
18.3.3是Nested Loops还是Hash (Merge) Join 794
18.3.4 filter运算的位置 795
18.3.5确认问题产生的原因 798
18.4 Parameter Sniffing 800
18.4.1什么是“Parameter Sniffing” 801
18.4.2本地变量的影响 802
18.4.3 Parameter Sniffing的解决方案 804
18.5调整数据库设计来优化语句性能 814
18.5.1调整索引 814
18.5.2计划指南 821
18.6调整语句设计提高性能 829
18.6.1筛选条件与计算字段 829
18.6.2会在运行前改变值的变量 832
18.6.3临时表和表变量 834
18.6.4尽可能限定语句的复杂度 836
18.7小结 838
第4部分SQL Server常用日志信息与推荐搜集方法 840
第19章SQL Server常用日志信息与推荐搜集方法 840
19.1 Windows事件日志 841
19.2 SQL Server errorlog文件 843
19.3性能监视器 845
19.4 SQL Trace文件 851
19.4.1 SQL Trace文件的收集方法 851
19.4.2 SQL Trace文件的分析方法 860
19.4.3自动化分析SQL Trace 862
19.5系统管理视图跟踪 866
19.6 SQLDIAG工具 868
19.7强烈推荐:PSSDIAG工具 873
19.7.1使用PSSDIAG收集信息 874
19.7.2自动化分析PSSDIAG收集的信息 876
19.8系统自动监视工具——Performance Dashboard 879
19.9小结 882