《SQLServer運維之道》從一位擁有多年數(shù)據(jù)庫運維經(jīng)驗的“老司機”視角出發(fā),循序漸進地介紹SQLServer數(shù)據(jù)庫!禨QLServer運維之道》分為4篇,共9章,內(nèi)容涵蓋數(shù)據(jù)庫基礎、性能優(yōu)化、開發(fā)、架構(gòu)高可用性與運維等多個方面。基礎篇(第1章和第2章)從安裝部署講起,探討SQLServer在容器化和云原生環(huán)境下的安裝部署,以及Linux平臺上的架構(gòu)設計與性能表現(xiàn)。性能篇(第3~6章)聚焦數(shù)據(jù)庫性能優(yōu)化,內(nèi)容包括新特性加速數(shù)據(jù)庫恢復、事務與鎖、索引優(yōu)化以及數(shù)據(jù)庫自動駕駛能力等。開發(fā)篇(第7章和第8章)重點介紹數(shù)據(jù)庫安全性及多模態(tài)能力,著重講解區(qū)塊鏈技術(shù)在數(shù)據(jù)庫安全方面的創(chuàng)新應用,以及圖數(shù)據(jù)、JSON數(shù)據(jù)和空間地理數(shù)據(jù)等多模態(tài)數(shù)據(jù)的支持。架構(gòu)與運維篇(第9章)圍繞數(shù)據(jù)庫高可用性和運維展開,詳細講解AlwaysOn高可用性集群的搭建與高級功能!禨QLServer運維之道》結(jié)合實際生產(chǎn)案例,旨在幫助讀者學以致用,解決數(shù)據(jù)庫運維中的痛點!禨QLServer運維之道》既適合數(shù)據(jù)庫初學者,也適合有一定基礎的開發(fā)人員,還適合作為培訓機構(gòu)和大中專院校的教學用書。
《SQLServer運維之道》是一本針對數(shù)據(jù)庫管理員、運維工程師和開發(fā)人員的全面參考書。它深入探討了SQLServer2022的各項核心功能,包括跨平臺的安裝、配置及優(yōu)化技巧,精細解讀內(nèi)存優(yōu)化、智能查詢處理和高可用性技術(shù)。書中不僅涵蓋了從基礎知識到高級技術(shù)的全方位內(nèi)容,還通過豐富的實操示例和實踐,幫助讀者提高管理效率和系統(tǒng)性能。無論是日常運維還是系統(tǒng)優(yōu)化,這本書都將成為您不可或缺的實用工具。
前 言
大學時,我就開始接觸SQL Server,而將其真正用于工作中已有12年多。不論大家對它的評價如何,我依然深愛著它。從大學開始算起,我大約有16年的SQL Server使用經(jīng)驗。進入職場后,我最早開始使用的是SQL Server 2000版本,可以說從當初的SQL Server“菜鳥”,逐漸成長為現(xiàn)在的“老鳥”。工作后,接觸到的SQL Server性能問題日益增多,數(shù)據(jù)庫數(shù)據(jù)量也越來越大(我曾接觸過最大單庫為48TB的數(shù)據(jù)量)。SQL Server面對這些棘手的問題都能迎刃而解,這讓我對SQL Server的能力愈發(fā)著迷。2014年,我成為一名專職的SQL Server DBA,數(shù)據(jù)庫性能和高可用問題的探索和實踐也從興趣轉(zhuǎn)變?yōu)楣ぷ髀氊。成為專職DBA后,我逐漸完善了自己的數(shù)據(jù)庫知識結(jié)構(gòu),為本書的寫作提供了堅實的基礎。
之前,我在某互聯(lián)網(wǎng)游戲公司帶領(lǐng)DBA團隊運維TB級的業(yè)務數(shù)據(jù)庫,運維的數(shù)據(jù)庫種類繁多,包括MySQL、MongoDB、Redis、SQL Server和PostgreSQL等。平時的工作涉及存儲、高可用性和災備的設計方案,還主導了內(nèi)部數(shù)據(jù)庫運維平臺的研發(fā)。參加工作后,我習慣在博客園寫技術(shù)博客,至今已有14年,堅持寫原創(chuàng)技術(shù)博客的目的是分享在數(shù)據(jù)庫運維過程中遇到的各種問題和解決方案,并對技術(shù)問題進行知識沉淀。沒想到,因為這些分享,我三次獲得了微軟SQL Server方向最有價值的稱號和博客園推薦博客的榮譽,同時還結(jié)識了數(shù)據(jù)庫領(lǐng)域的許多技術(shù)大師。
SQL Server作為微軟公司著名的數(shù)據(jù)庫管理產(chǎn)品,多年來穩(wěn)居DB-Engines數(shù)據(jù)庫排行榜前三。SQL Server最初由圖靈獎得主James Nicholas Gray主導開發(fā),并基于另一位圖靈獎得主Michael Stonebraker開發(fā)的Ingres系統(tǒng)發(fā)展起來。經(jīng)過30多年的錘煉,SQL Server已得到業(yè)內(nèi)的廣泛認可和應用。
隨著.NET、Visual Studio、Office和PowerShell等微軟的商業(yè)產(chǎn)品逐步實現(xiàn)跨操作系統(tǒng)平臺應用,SQL Server也在2017年正式支持主流的Linux平臺(包括Red Hat Enterprise Linux/CentOS、Ubuntu和SUSE)。隨著SQL Server 2017的發(fā)布,SQL Server不僅實現(xiàn)了跨平臺的能力,還引入了大量新功能,這些功能大幅提升了數(shù)據(jù)庫性能與管理效率,并加速了SQL Server與大數(shù)據(jù)和人工智能領(lǐng)域的整合。在SQL Server支持Linux后,部署量顯著上升,因為用戶無須再支付Windows系統(tǒng)的商業(yè)授權(quán)費用,且可以統(tǒng)一公司的技術(shù)棧,不需要再維護Windows系統(tǒng)。在當前“降本增效”的大環(huán)境下,這一效益尤為顯著。此外,Linux平臺下的SQL Server安裝包也進行了優(yōu)化(瘦身顯著),部署數(shù)據(jù)庫的過程更加便捷?梢哉f,微軟使自家的商業(yè)產(chǎn)品實現(xiàn)跨操作系統(tǒng)平臺運行的決定是非常明智的。
鑒于國內(nèi)目前缺乏關(guān)于SQL Server新版本的圖書,且網(wǎng)上資料零散,我結(jié)合近一年的實踐、資料整合以及16年的使用經(jīng)驗,編寫了本書。
本書的目的是幫助讀者了解當前SQL Server新版本的功能和發(fā)展狀況。特別是如何利用功能做好SQL Server數(shù)據(jù)庫管理和性能優(yōu)化,尤其是在超大型TB級甚至PB級數(shù)據(jù)庫管理方面。
本書分為4篇,分別是基礎篇、性能篇、開發(fā)篇和架構(gòu)與運維篇。
基礎篇(第1、2章)介紹SQL Server的基礎安裝及環(huán)境準備,并詳細講解在Linux平臺上的架構(gòu)設計和性能表現(xiàn)。
性能篇(第3~6章)分別介紹SQL Server性能優(yōu)化的新特性、索引方面的新功能(包括列存儲索引和內(nèi)存優(yōu)化索引),以及SQL Server的自動駕駛能力,該能力在數(shù)據(jù)庫領(lǐng)域可謂遙遙。
開發(fā)篇(第7、8章)介紹SQL Server的安全和多模態(tài)方面的內(nèi)容。在安全方面,SQL Server引入了不可篡改的區(qū)塊鏈技術(shù),提供了比Oracle數(shù)據(jù)庫還要強的安全能力,甚至在SQL Server 2022的宣傳資料中提到,SQL Server是過去10年最安全的數(shù)據(jù)庫。此外,本書還獨具一格地介紹了SQL Server的多模態(tài)能力,包括圖數(shù)據(jù)、JSON數(shù)據(jù)和空間地理數(shù)據(jù)等數(shù)據(jù)類型,功能強大。
架構(gòu)與運維篇(第9章)專門介紹SQL Server的高可用性,包括高可用性的發(fā)展、Linux平臺上AlwaysOn集群的搭建以及AlwaysOn集群的高級功能。
配套資源下載
本書配套源代碼和示例數(shù)據(jù)庫,請讀者用微信掃描下面的二維碼下載。如果學習本書的過程中發(fā)現(xiàn)問題或疑問,可發(fā)送郵件至booksaga@126.com,郵件主題為“SQL Server運維之道”。
本書能夠順利出版,首先要感謝清華大學出版社的編輯老師們。在這一年多的時間里,他們一直支持我的寫作,正是他們的鼓勵和幫助,才讓我順利完成了整本書稿。
作 者
2025年6月
林勇樺13年數(shù)據(jù)庫領(lǐng)域深耕經(jīng)驗,中國DBA聯(lián)盟(ACDU)成員,三屆微軟SQLServer方向MVP。專注于MySQL、Redis、SQLServer.MongoDB等數(shù)據(jù)庫技術(shù),具備人工智能專業(yè)碩士背景,曾任大型網(wǎng)絡游戲公司數(shù)據(jù)庫負責人,深諳企業(yè)級數(shù)據(jù)庫架構(gòu)設計與性能調(diào)優(yōu)。長期活躍于技術(shù)社區(qū),致力于分享實戰(zhàn)經(jīng)驗推動數(shù)據(jù)庫技術(shù)在高并發(fā)、大數(shù)據(jù)場景中的落地實踐。
目 錄
第1篇 基礎篇
第1章 數(shù)據(jù)庫的安裝與配置 2
1.1 SQL Server概述 2
1.1.1 SQL Server簡介 2
1.1.2 SQL Server的發(fā)展歷史 2
1.2 安裝前的準備 5
1.3 Windows平臺部署 6
1.3.1 安裝包上的改進 6
1.3.2 SQL Server安裝向?qū)г斀?8
1.3.3 驗證安裝 17
1.3.4 靜默安裝 19
1.4 Linux平臺部署 21
1.4.1 使用CentOS Stream 9部署SQL Server 22
1.4.2 正式部署Linux上的SQL Server 22
1.4.3 安裝階段 23
1.4.4 與MySQL安裝包的對比 30
1.4.5 配置階段 31
1.5 容器平臺部署 38
1.5.1 使用Docker部署SQL Server 39
1.5.2 在Kubernetes上部署SQL Server 41
1.5.3 部署Minikube單機版 42
1.6 安裝過程中的常見問題 45
1.6.1 Windows平臺 45
1.6.2 Linux平臺 46
1.6.3 容器平臺 47
1.7 安裝示例數(shù)據(jù)庫 47
1.7.1 下載和安裝示例數(shù)據(jù)庫 47
1.7.2 使用示例數(shù)據(jù)庫進行測試和學習 49
第2章 Linux平臺上的架構(gòu)與優(yōu)化 51
2.1 Linux平臺上的進程模型 51
2.2 Linux平臺上的整體架構(gòu) 53
2.2.1 SQL PAL的內(nèi)部結(jié)構(gòu) 54
2.2.2 系統(tǒng)底層屏蔽神器 56
2.2.3 容器化架構(gòu) 56
2.3 Linux平臺上的功能演進 58
2.4 Linux平臺上的性能表現(xiàn) 59
2.4.1 TPC-C/TPC-E基準測試榜單 59
2.4.2 Linux平臺性能測試報告 61
2.4.3 SQL Server 2022TPC-H性能表現(xiàn) 65
2.4.4 自測Linux平臺上數(shù)據(jù)庫 TPC-H 性能 65
2.5 數(shù)據(jù)庫補丁模型 66
2.5.1 數(shù)據(jù)庫補丁版本確認 68
2.5.2 Linux平臺上部署補丁包 69
第2篇 性能篇
第3章 性能優(yōu)化新特性 74
3.1 加速數(shù)據(jù)庫恢復 74
3.1.1 問題背景 74
3.1.2 加速數(shù)據(jù)庫恢復介紹 80
3.1.3 解決方案 81
3.1.4 技術(shù)原理 82
3.1.5 ADR收益驗證 90
3.1.6 ADR迭代改進 94
3.1.7 單庫48TB的ADR應用案例 95
3.2 TempDB元數(shù)據(jù)優(yōu)化 97
3.2.1 問題背景 98
3.2.2 問題痛點 98
3.2.3 解決方案 99
3.2.4 功能收益 100
3.3 Buffer Pool緩沖池并行掃描 100
3.3.1 問題背景 100
3.3.2 問題痛點 101
3.3.3 解決方案 101
3.3.4 使用場景 102
3.4 事務日志并行重做 102
3.4.1 問題背景 102
3.4.2 問題痛點 103
3.4.3 解決方案 105
3.4.4 事務日志上的其他改進 108
第4章 數(shù)據(jù)庫事務、鎖和等待 110
4.1 事務與ACID 110
4.2 事務的隔離級別和數(shù)據(jù)一致性 111
4.3 數(shù)據(jù)庫鎖 115
4.3.1 鎖粒度 115
4.3.2 鎖類型 115
4.3.3 鎖兼容性 116
4.3.4 輕量級鎖:閂鎖 116
4.3.5 列存儲索引的事務隔離級別 117
4.4 慢查詢?nèi)罩居涗涀枞退梨i 127
4.4.1 阻塞 127
4.4.2 死鎖 129
4.4.3 擴展事件記錄歷史阻塞和死鎖 132
4.5 數(shù)據(jù)庫等待 137
4.5.1 從CPU的角度看等待 137
4.5.2 數(shù)據(jù)庫執(zhí)行SQL語句的機制 138
4.5.3 等待類型 139
4.5.4 并行等待 141
4.5.5 多任務等待 142
4.5.6 數(shù)據(jù)庫日志等待 143
4.5.7 鎖定等待 144
4.5.8 各類I/O等待 145
4.5.9 其他等待 146
4.5.10 擴展事件記錄歷史等待 148
4.6 創(chuàng)新硬件持久內(nèi)存 151
4.6.1 技術(shù)特點 151
4.6.2 性能參數(shù)對比 151
4.6.3 數(shù)據(jù)庫支持 152
第5章 索引優(yōu)化 154
5.1 索引簡介 154
5.2 索引組織和分類 154
5.3 傳統(tǒng)B樹索引 157
5.3.1 相關(guān)術(shù)語 157
5.3.2 堆表 158
5.3.3 聚集索引表和非聚集索引 159
5.3.4 數(shù)據(jù)訪問方式 160
5.3.5 數(shù)據(jù)同步方式 167
5.3.6 B樹索引的維護和建議 168
5.4 列存儲索引和集中式架構(gòu)HTAP數(shù)據(jù)庫 172
5.4.1 HTAP數(shù)據(jù)庫簡介 172
5.4.2 在OLAP領(lǐng)域的發(fā)展 172
5.4.3 列存儲索引上的演進 173
5.4.4 列存儲索引原理 176
5.4.5 列存儲索引維護和建議 183
5.4.6 聚集列存儲索引分區(qū)表 187
5.4.7 雙11期間30TB業(yè)務數(shù)據(jù)實時分析案例 192
5.5 內(nèi)存優(yōu)化索引 192
5.5.1 混合存儲引擎架構(gòu) 194
5.5.2 內(nèi)存優(yōu)化索引維護和建議 195
5.5.3 內(nèi)存優(yōu)化表犄角旮旯 197
第6章 數(shù)據(jù)庫自動駕駛 199
6.1 智能數(shù)據(jù)庫概述 199
6.2 智能查詢處理演進 202
6.3 智能查詢優(yōu)化底座 205
6.3.1 查詢存儲內(nèi)部原理 209
6.3.2 查詢存儲中的關(guān)鍵數(shù)據(jù) 210
6.3.3 查詢存儲的使用場景 212
6.4 近似優(yōu)質(zhì)值計數(shù) 218
6.4.1 近似優(yōu)質(zhì)值計數(shù)概述 218
6.4.2 近似優(yōu)質(zhì)值計數(shù)使用示例 219
6.5 行模式內(nèi)存授予反饋 221
6.5.1 內(nèi)存授予反饋概述 222
6.5.2 內(nèi)存授予反饋使用示例 222
6.5.3 內(nèi)存授予反饋注意事項 229
6.6 參數(shù)敏感執(zhí)行計劃優(yōu)化 229
6.6.1 參數(shù)敏感執(zhí)行計劃優(yōu)化概述 230
6.6.2 參數(shù)敏感執(zhí)行計劃優(yōu)化使用示例 230
6.6.3 參數(shù)敏感執(zhí)行計劃優(yōu)化注意事項 234
第3篇 開發(fā)篇
第7章 數(shù)據(jù)庫安全性 236
7.1 數(shù)據(jù)庫安全功能演進 236
7.2 動態(tài)數(shù)據(jù)掩碼 238
7.2.1 DDM屏蔽規(guī)則 239
7.2.2 DDM的工作方式 240
7.2.3 DDM使用示例 241
7.3 行級安全性 243
7.3.1 RLS的工作方式 244
7.3.2 RLS使用示例 244
7.4 始終加密 247
7.4.1 始終加密使用示例 247
7.4.2 取消始終加密 253
7.5 時態(tài)表 254
7.5.1 時態(tài)表的工作方式 254
7.5.2 時態(tài)表使用示例 256
7.5.3 時態(tài)表注意問題 258
7.6 賬本表 259
7.6.1 賬本表的工作方式 259
7.6.2 賬本表使用示例 261
7.6.3 數(shù)據(jù)庫驗證 264
第8章 多模態(tài)數(shù)據(jù)庫 268
8.1 多模態(tài)數(shù)據(jù)庫功能演進 268
8.2 圖數(shù)據(jù) 269
8.2.1 圖數(shù)據(jù)庫概述 270
8.2.2 圖數(shù)據(jù)功能使用示例 270
8.2.3 圖數(shù)據(jù)的新特性 276
8.3 時間序列數(shù)據(jù) 277
8.3.1 時間序列數(shù)據(jù)概述 277
8.3.2 時間序列函數(shù)使用示例 277
8.4 JSON數(shù)據(jù) 281
8.4.1 JSON函數(shù)使用示例 282
8.4.2 JSON索引 286
8.4.3 原生JSON數(shù)據(jù)類型 287
第4篇 架構(gòu)與運維篇
第9章 數(shù)據(jù)庫高可用性 290
9.1 數(shù)據(jù)庫高可用性概述 290
9.2 高可用性集群方案 291
9.3 Always On可用性組的演進 295
9.4 Always On可用性組架構(gòu)與性能優(yōu)化 297
9.4.1 基本架構(gòu)和可用性模式 297
9.4.2 數(shù)據(jù)同步原理 299
9.4.3 數(shù)據(jù)同步延遲 301
9.4.4 僅配置模式輔助副本 303
9.5 Linux平臺上的Always On可用性組 303
9.5.1 Pacemaker集群管理器概述 304
9.5.2 Pacemaker集群上的Always On架構(gòu) 305
9.5.3 部署DNS服務 307
9.5.4 Linux平臺上的Always On集群搭建 310
9.5.5 集群故障轉(zhuǎn)移測試和維護建議 322
9.6 Always On可用性組的高級功能和新特性 326
9.6.1 包含可用性組 327
9.6.2 跨平臺僅讀取縮放可用性組 329
9.6.3 損壞數(shù)據(jù)頁自動修復 330
9.6.4 輔助副本使用快照隔離級別 333