Sqlserver2016啟用了日誌並行,但是實際上某些資料庫日誌並行並沒有生效的問題
https://docs.microsoft.com/en-us/archive/blogs/sql_server_team/sql-server-20162017-availability-group-secondary-replica-redo-model-and-performance
sqlserver2016預設啟動並行
禁用並行2種方法
1、DBCC TRACEON (3459, -1),不用重啟sqlserver服務
2、-T 3459引數加入sqlserver啟動引數
禁用序列再啟用並行,必須重啟sqlserver
如果有-T 3459引數,則移除該引數,再重啟sqlserver
如果是DBCC TRACEON (3459, -1), 則直接重啟sqlserver
現象:wondadb3上有20來個資料庫做了AG到dbprod126,dbprod126只有24個CPU,發現wondadb3.wondb到dbprod126.wondb的AG傳輸很慢,把所有資料庫移出AG,再重新加入,加入的過程中第一個先加入wondb,在加入其它所有資料庫,發現wondadb3.wondb到dbprod126.wondb的AG傳輸快了很多,發現sqlserver2016的並行設計上有缺陷,資料庫數量一多,排後面的幾個資料庫就只能預設使用序列
官方文件的解釋:
Parallel redo thread usage is well covered in "Thread usage by Availability Groups" here.
A SQL Server instance uses up to 100 threads for parallel redo for secondary replicas. Each database uses up to one-half of the total number of CPU cores, but not more than 16 threads per database. If the total number of required threads for a single instance exceeds 100, SQL Server uses a single redo thread for every remaining database.
When the host server has 32 or more CPU cores, each database will occupy 16 parallel redo worker threads and one helper worker thread. It means that all databases starting with the 7th database (ordered by database id ascending) that has joined availability group it will be in single thread redo or serial redo irrespective which database has actual redo workload. If a SQL Server Instance has a number of databases, and it is desired for a particular database to run under parallel redo model, the database creation order needs to be considered. Same idea can be
applied to force a database always runs in serial redo model as well. Again, in SQL Server instance level, the way to switch between parallel redo and serial redo is the TF 3459. All databases in the same SQL Server instance will be switched together. Also, to switch from serial redo to parallel redo by disable TF 3459, a SQL Server service restart is required
一個資料庫最高併發執行緒數量的計算
一個AG從節點例項最多有100個並行的redo重做執行緒,但是每個資料庫最多隻有一半的cpu資料的執行緒,但是最多又不能超過16個,假如一臺伺服器24個cpu,20個資料庫加入了AG,則使用每個資料庫的最多不能超過8(100/12=8)
實踐得出結論
1、此處的加入AG的順序,不是代表資料第一次加進AG的順序,而是資料庫啟動後資料庫加進AG的順序。
假如10個庫,名稱分別是1-10,1開始1號庫是用上了並行,但是1號庫產生的日誌特別大,某天突然從庫重啟後,從庫上的1號庫要花很長時間來恢復無法及時進入Synchronizing狀態,這個時候其他資料庫正常恢復完了馬上進入了Synchronizing,1號庫又排在後面用不上並行
2、一個庫同步很慢,沒有用上並行,而且同步佇列還有100GB待同步,同步速度只有50M每秒,還需要1小時才能同步完,這個時候可以在主節點把其他庫包括它自己都移出AG,移除後,從節點看到已經同步完的資料庫的的狀態是restoring,沒有同步完的資料庫的狀態會是not Synchronizing,等1小時候not Synchronizing變成restoring後,再新增進AG,新增的過程會很快,且這個庫的狀態會是(Initializing/In recovery),但是在not Synchronizing到restoring這1小時期間主節點生成的日誌需要同步到從節點,這1小時期間生成的日誌需要30分鐘才能同步到從節點,但是此時因為這個庫以第一的順序加入了AG,使用了並行,比如並行度為8,這個(Initializing/In recovery)也會很快完成,只需要4分鐘(30分鐘/8)左右就能完成
3、檢視一個AG庫有沒有用上並行,查詢sys.sysprocesses該庫對應的cmd自動是否為"PARALLEL REDO TA"即可,為"PARALLEL REDO TA",說明用上了並行
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30126024/viewspace-2757107/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oralce資料庫關閉歸檔日誌並且刪除歸檔日誌資料庫
- 安全開發Java:日誌注入,並沒那麼簡單Java
- Docker安裝ELK並實現JSON格式日誌分析DockerJSON
- 如何使用Journalctl檢視並操作Systemd日誌
- 請問 Lumen 6.0 是怎樣自定義日誌路徑,並且日誌按天儲存的?
- 如何利用NLog輸出結構化日誌,並在Kibana優雅分析日誌?
- linux伺服器部署SpringBoot專案並檢視專案執行日誌Linux伺服器Spring Boot
- Springboot簡單功能示例-6 使用加密資料來源並配置日誌Spring Boot加密
- LLM並行訓練3-資料並行並行
- Oracle中的並行系列(二):你設定的並行真的生效了嗎?Oracle並行
- 多執行緒 日誌 和截圖的問題執行緒
- 從零開始實現放置遊戲(五)——實現掛機戰鬥(3)引入日誌功能並實現切面日誌遊戲
- 刪除事務日誌檔案並不安全WC
- AOP行為日誌
- 530並行日:用超算更省心並行
- find 命令刪除冗餘 Nginx 錯誤日誌並實現備份Nginx
- 【YashanDB知識庫】windows配置ODBC跟蹤日誌, 使用日誌定位問題Windows
- Linux伺服器使用Redis作為資料快取,並用log4j2進行日誌記錄Linux伺服器Redis快取
- 如何在ABAP Netweaver和CloudFoundry裡記錄並檢視日誌Cloud
- oracle資料庫mmnl日誌很大Oracle資料庫
- (上)挖掘傳統行業日誌大資料的無限價值行業大資料
- go開發屬於自己的日誌庫-檔案日誌庫實現Go
- 資料庫altert日誌中的GTX提示資料庫
- 詳解在TP中怎麼引入ThinkWechat.php並列印日誌PHP
- 啟動tomcat時,日誌裡大量輸出建立資料來源dataSource的日誌Tomcat
- openGauss資料庫日誌管理指導資料庫
- 瀚高資料庫日誌挖掘方法資料庫
- go 開發屬於自己的日誌庫-檔案日誌庫原型實現Go原型
- C# Debug執行日誌Logs的實現C#
- 並查集在實際問題中的應用並查集
- 併發程式設計-8.並行資料結構和並行Linq程式設計並行資料結構
- go開發屬於自己的日誌庫-日誌庫優化Go優化
- 資料庫MySQL一般查詢日誌或者慢查詢日誌歷史資料的清理資料庫MySql
- 關於物件導向的方法並行執行的問題物件並行
- 『研究發現“一萬小時定律”並沒想象中那麼重要』今日資料行業日報(2019.08.28)行業
- IIS 日誌匯入到資料庫的方法資料庫
- 消除假確定性並解決實際問題
- LLM並行訓練5-MoE並行並行