SQL Server 2022 讀寫分離問題整合

跟著熱點整理一下遇到過的SQL Server的問題,這篇來聊聊讀寫分離遇到的和聽說過的問題。

一、讀寫分離實現方法

1. 原生高可用方案

1.1 Always On 可用性組(推薦方案)

配置步驟

-- 1. 啟用Always On功能
USE [master]
GO
ALTER SERVER CONFIGURATION SET HADR_CLUSTER_TYPE = WINDOWS;
GO
?
-- 2. 創建可用性組
CREATE AVAILABILITY GROUP [AG_ReadScale]
WITH (DB_FAILOVER = ON, CLUSTER_TYPE = WINDOWS)
FOR DATABASE [YourDB]
REPLICA ON 'PrimaryServer' WITH (ENDPOINT_URL = 'TCP://PrimaryServer:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = AUTOMATIC,SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY)),'SecondaryServer' WITH (ENDPOINT_URL = 'TCP://SecondaryServer:5022',AVAILABILITY_MODE = SYNCHRONOUS_COMMIT,FAILOVER_MODE = AUTOMATIC,SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY));

讀寫分離配置

-- 配置只讀路由
ALTER AVAILABILITY GROUP [AG_ReadScale]
MODIFY REPLICA ON 'SecondaryServer' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = ('SecondaryServer'))
);
?
-- 應用程序連接字符串示例
"Server=PrimaryServer;Database=YourDB;ApplicationIntent=ReadWrite;"
"Server=AG_Listener;Database=YourDB;ApplicationIntent=ReadOnly;"
1.2 日志傳送(Legacy方案)

配置步驟

-- 主服務器配置
EXEC sp_add_log_shipping_primary_database@database = N'YourDB',@backup_directory = N'\\backup\share',@backup_job_name = N'LSBackup_YourDB';
?
-- 輔助服務器配置
EXEC sp_add_log_shipping_secondary_database@database = N'YourDB',@primary_server = N'PrimaryServer',@restore_job_name = N'LSRestore_YourDB';

2. 第三方中間件方案

2.1 使用ProxySQL

配置示例

# proxysql.cnf配置
INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES
(10,'PrimaryServer',1433),  # 寫組
(20,'SecondaryServer1',1433), # 讀組
(20,'SecondaryServer2',1433); # 讀組
?
# 讀寫分離規則
INSERT INTO mysql_query_rules (rule_id,active,match_pattern,destination_hostgroup,apply) VALUES
(1,1,'^SELECT.*FOR UPDATE',10,1),  # 寫操作
(2,1,'^SELECT',20,1); ? ? ? ? ? ?  # 讀操作
2.2 使用HAProxy

配置示例

# haproxy.cfg配置
frontend sql_frontbind *:1433mode tcpdefault_backend sql_write
?
backend sql_writemode tcpserver primary PrimaryServer:1433 check
?
backend sql_readmode tcpbalance roundrobinserver secondary1 SecondaryServer1:1433 checkserver secondary2 SecondaryServer2:1433 check
?
# 根據SQL注釋路由
acl is_read sql_req -i -m beg "/*read*/"
use_backend sql_read if is_read

二、常見問題與解決方案

1. 數據同步延遲

問題現象

  • 讀副本數據落后于主庫

  • 報表查詢結果不一致

解決方案

-- 1. 監控延遲
SELECT ag.name AS [AG Name],ar.replica_server_name,db_name(ds.database_id) AS [Database],ds.synchronization_state_desc,ds.log_send_queue_size,ds.redo_queue_size
FROM sys.dm_hadr_database_replica_states ds
JOIN sys.availability_replicas ar ON ds.replica_id = ar.replica_id
JOIN sys.availability_groups ag ON ar.group_id = ag.group_id;
?
-- 2. 優化方案
- 增加網絡帶寬(至少1Gbps)
- 調整同步提交模式為異步(對數據一致性要求不高的場景)
- 限制大事務(拆分超過100MB的事務)

2. 只讀路由失效

問題現象

  • ApplicationIntent=ReadOnly的連接仍被路由到主節點

解決方案

-- 1. 檢查只讀路由配置
SELECT ag.name AS [AG Name],replica_server_name,read_only_routing_url
FROM sys.availability_replicas
WHERE read_only_routing_url IS NOT NULL;
?
-- 2. 修復配置
ALTER AVAILABILITY GROUP [AG_ReadScale]
MODIFY REPLICA ON 'SecondaryServer' WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST = ('SecondaryServer'))
);
?
-- 3. 驗證連接
-- 使用SSMS連接字符串:
"Server=AG_Listener;Database=YourDB;ApplicationIntent=ReadOnly;"

3. 臨時表問題

問題現象

  • 使用臨時表的查詢在只讀副本失敗

  • 錯誤消息:"The database 'tempdb' is not accessible"

解決方案

-- 1. 應用層修改(推薦)
- 使用表變量替代臨時表
- 或使用全局臨時表(##temp)
?
-- 2. 數據庫配置
-- 啟用輔助副本的tempdb訪問(SQL 2022新特性)
ALTER AVAILABILITY GROUP [AG_ReadScale]
MODIFY REPLICA ON 'SecondaryServer' WITH (SECONDARY_ROLE(ALLOW_TEMP_TABLES=ON));

4. 負載不均

問題現象

  • 讀副本間負載不均衡

  • 單個副本CPU過高

解決方案

-- 1. 配置讀權重(SQL 2022新特性)
ALTER AVAILABILITY GROUP [AG_ReadScale]
MODIFY REPLICA ON 'SecondaryServer1' WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_WEIGHT=3)
);
ALTER AVAILABILITY GROUP [AG_ReadScale]
MODIFY REPLICA ON 'SecondaryServer2' WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_WEIGHT=1)
);
?
-- 2. 使用中間件負載均衡
- 配置ProxySQL/HAProxy的加權輪詢
- 基于副本性能指標動態調整權重

三、性能優化建議

1. 連接池配置

// ADO.NET連接池優化
"Server=AG_Listener;Database=YourDB;Max Pool Size=200;Min Pool Size=20;Connection Timeout=30;"

2. 查詢提示

-- 強制讀操作走副本
SELECT * FROM Orders WITH (READUNCOMMITTED)
OPTION (READONLY);
?
-- 強制寫操作走主庫(即使連接字符串標記為ReadOnly)
SELECT * FROM Orders OPTION (READCOMMITTEDLOCK);

3. 監控指標

-- 關鍵性能計數器
SELECT *
FROM sys.dm_os_performance_counters
WHERE counter_name IN ('Log Send Queue Size','Redo Queue Size','Transactions/sec','Lock Waits/sec'
);

四、SQL Server 2022 新特性利用

1. 內存優化TempDB元數據

-- 啟用特性(減少TempDB爭用)
ALTER SERVER CONFIGURATION SET MEMORY_OPTIMIZED TEMPDB_METADATA = ON;

2. 智能查詢處理

-- 啟用智能查詢處理
ALTER DATABASE SCOPED CONFIGURATION SET INTELLIGENT_QUERY_PROCESSING = ON;

3. 參數敏感計劃優化

-- 避免參數嗅探問題
ALTER DATABASE SCOPED CONFIGURATION SET PARAMETER_SENSITIVE_PLAN_OPTIMIZATION = ON;

這些事給予SQLServer 2022總結的,如果有版本問題,期待和各位大佬學習。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76570.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76570.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76570.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【前端掃盲】postman介紹及使用

Postman 是一款專為 API 開發與測試設計的 全流程協作工具,程序員可通過它高效完成接口調試、自動化測試、文檔管理等工作。以下是針對程序員的核心功能介紹和應用場景說明: 一、核心功能亮點 接口請求構建與調試 支持所有 HTTP 方法(GET/POS…

IdeaVim-AceJump

?AceJump 是一款專為IntelliJ IDEA平臺打造的開源插件,旨在通過簡單的快捷鍵操作幫助用戶快速跳轉到編輯器中的任何符號位置,如變量名、方法調用或特定的字符串?。無論是大型項目還是日常編程,AceJump 都能顯著提升你的代碼導航速度和效率。…

[C語言入門] 結構體

目錄 1. 啥是結構體 2. 啥是結構體變量 3. 創建結構體變量的小細節 3.1 創建全局結構體變量(不推薦) 3.2 創建局部結構體變量(不推薦) 3.3 創建局部結構體變量Plus 4. 結構體在內存里面咋存? 5. 結構體作為參數…

賢小二c#版Yolov5 yolov8 yolov10 yolov11自動標注工具 + 免python環境 GPU一鍵訓練包

賢小二c#版yolo標注訓練工具集 歡迎使用賢小二AI標注訓練系統v2.0 本課程所有演示程序全部免費 1、這節課程主要演示賢小二AI標注訓練系統的使用,以及標注數據時注意事項和技巧; 2、本程序采用c# Net8.0框架開發,是賢小二開發的一款Yolo標注…

二分類交叉熵損失

二分類交叉熵損失(Binary Cross-Entropy Loss)是用于二分類問題的常見損失函數。它衡量的是模型輸出的預測概率分布與真實標簽之間的差異。 1 二分類問題 在二分類問題中,每個樣本的目標輸出是 0 或 1,表示樣本屬于某一類或另一類…

【C++】Cplusplus進階

模板的進階: 非類型模板參數 是C模板中允許使用具體值(而非類型)作為模板參數的特性。它們必須是編譯時常量,且類型僅限于整型、枚舉、指針、引用。(char也行) STL標準庫里面也使用了非類型的模板參數。 …

關于pycharm遠程連接服務器如何debug

1、pycharm遠程連接只有pycharm專業版才可以,在校學生可以用學校郵箱申請。另外,網上電商也可以🤫 2、遠程連接有很多教程,可以參考的文章有很多。這里主要記錄關于遠程連接服務器debug遇到的一些問題。 3、由于遠程連接服務器開…

數據結構每日一題day11(鏈表)★★★★★

題目描述:有一個帶頭結點的單鏈表L,請設計一個算法查找其第1個數據值為e的結點,若存在則返回指向該結點的指針,若不存在則返回 NULL。 算法思想: 輸入檢查:若鏈表為空(僅有頭結點)&…

《HarmonyOS Next開發進階:打造功能完備的Todo應用華章》

章節 6:日期選擇器與日期處理 目標 學習如何使用DatePicker組件。理解日期格式化和日期計算。 內容 日期選擇器基礎 使用DatePicker組件。處理日期選擇事件。 日期格式化 格式化日期為友好的文本。 日期計算 判斷日期是否過期或即將到期。 代碼示例 Entry Com…

迅饒科技X2Modbus網關-GetUser信息泄露漏洞

免責聲明:本號提供的網絡安全信息僅供參考,不構成專業建議。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我聯系,我將盡快處理并刪除相關內容。 漏洞描述 該漏洞的存在是由于GetUser接口在…

Go 原理剖析:數據結構之字符串

在 Go 語言中,字符串(string)是一個非常重要的數據類型。它看似簡單,但背后卻隱藏著不少有趣的原理和優化技巧。今天我們就來聊聊 Go 中字符串的底層結構、特性,以及如何高效地使用它。 1. 字符串的底層結構 字符串的…

【SPP】藍牙鏈路控制(LC)在SPP中互操作性深度解析

在藍牙協議棧的精密分層體系中,其鏈路控制(Link Control, LC)層作為基帶層的核心組件,承載著物理信道管理、連接建立與維護等關鍵任務。其互操作性要求直接決定了不同廠商設備能否實現無縫通信。本文將以藍牙技術規范中的LC互操作…

Windows C++ 排查死鎖

開發出來應用程序突然間卡死不動&#xff0c;如果其中是因為死鎖問題卡列該如何排查 下面是一個簡單的死鎖例子 #include <iostream> #include <thread> #include <mutex>std::mutex a, b;void function_a() {std::lock_guard<std::mutex> _x(a);std:…

【零基礎入門unity游戲開發——2D篇】2D 游戲場景地形編輯器——TileMap的使用介紹

考慮到每個人基礎可能不一樣&#xff0c;且并不是所有人都有同時做2D、3D開發的需求&#xff0c;所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要講解C#的基礎語法&#xff0c;包括變量、數據類型、運算符、…

【易訂貨-注冊/登錄安全分析報告】

前言 由于網站注冊入口容易被機器執行自動化程序攻擊&#xff0c;存在如下風險&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露&#xff0c;不符合國家等級保護的要求。短信盜刷帶來的拒絕服務風險 &#xff0c;造成用戶無法登陸、注冊&#xff0c;大量收到垃圾短信的…

GLPI 未授權SQL注入漏洞(CVE-2025-24799)

免責申明: 本文所描述的漏洞及其復現步驟僅供網絡安全研究與教育目的使用。任何人不得將本文提供的信息用于非法目的或未經授權的系統測試。作者不對任何由于使用本文信息而導致的直接或間接損害承擔責任。如涉及侵權,請及時與我們聯系,我們將盡快處理并刪除相關內容。 0x0…

基于Deepface的情緒識別c++

基于Deepface的情緒識別c 文章目錄 基于Deepface的情緒識別c簡介下載模型并轉為onnx&#xff08;facial_expression_model_weights.h5&#xff09;測試取出照片的人臉部分并處理成模型輸入格式用模型推理一下看看結果 用onnxruntime的c庫推理 簡介 DeepFace是一個基于深度學習…

Java的數據庫編程——JDBC基礎

JDBC編程 一、概述1.1 概念介紹1.2 驅動包下載1.3 導入驅動包 二、通過Java程序操作數據庫2.1 通過 JDBC 進行 插入數據 操作2.1.1 創建“數據源(DataSource)——描述要操作的數據庫、數據是在哪”2.1.2 與服務器建立連接2.1.3 構造sql語句&#xff0c;并且對字符串類型的sql進…

DeepSeek-R1 面試題匯總

Deepseek-r1 面試寶典 原文地址&#xff1a;https://articles.zsxq.com/id_91kirfu15qxw.html DeepSeek-R1 面試題匯總 DeepSeek-R1 面試題匯總 GRPO&#xff08;Group Relative Policy Optimization&#xff09;常見面試題匯總篇 DeepSeek-R1 DeepSeek-R1-Zero 常見面試題匯總…

SSL/TLS

http ssl傳輸層 -> https 安全套接層 SSL/TLS 1、核心角色與文件2、證書生成流程2.1、生成CA根證書2.2、生成服務端證書2.3 生成客戶端證書&#xff08;雙向認證&#xff09; 3、SSL/TLS 認證模式3.1、單向認證&#xff08;默認 HTTPS&#xff09;3.2、雙向認證&#xff0…