備庫是否有自己的統計資訊?(續)
前言
今天③群裡有位群友提了這樣一個問題,引起了我的思考
“問個小白問題,pg_stat_all_indexes 的資訊,重啟或主備切換後資料是重新收集的嗎?
我直接拍腦袋不假思索就回復了 "reset了"。然後這位群友就順著回覆我
“近期有主備切換,那依據裡面的資訊來判斷索引是否有使用是不可靠的
我後面轉念一想,才發現這個回覆是錯誤的,不嚴謹,儘早寫出來加深印象,以免遺忘。
分析
簡單驗證一下,主庫上建個表並使用索引掃描
postgres=# create table tbl1(id int);
CREATE TABLE
postgres=# insert into tbl1 values(generate_series(1,100000));
INSERT 0 100000
postgres=# create index on tbl1(id);
CREATE INDEX
postgres=# explain analyze select * from tbl1 where id = 99;
QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------
Index Only Scan using tbl1_id_idx on tbl1 (cost=0.29..4.31 rows=1 width=4) (actual time=0.026..0.028 rows=1 loops=1)
Index Cond: (id = 99)
Heap Fetches: 0
Planning Time: 0.100 ms
Execution Time: 0.053 ms
(5 rows)
postgres=# select * from pg_stat_all_indexes where relname = 'tbl1';
-[ RECORD 1 ]-+------------------------------
relid | 58029
indexrelid | 58032
schemaname | public
relname | tbl1
indexrelname | tbl1_id_idx
idx_scan | 1
last_idx_scan | 2023-11-22 22:38:59.827939+08
idx_tup_read | 1
idx_tup_fetch | 0
此處的 last_idx_scan 是 16 引入的新特性,可以讓我們獲取最近未使用過的索引列表,在以前的版本是無法直接查詢在給定時間段內是否使用過某個索引的。
再去備庫上檢視一下
postgres=# select pg_is_in_recovery(),* from pg_stat_all_indexes where relname = 'tbl1';
-[ RECORD 1 ]-----+------------
pg_is_in_recovery | t
relid | 58029
indexrelid | 58032
schemaname | public
relname | tbl1
indexrelname | tbl1_id_idx
idx_scan | 0
last_idx_scan |
idx_tup_read | 0
idx_tup_fetch | 0
可以看到,資料並不一致,主庫上使用索引故 idx_scan 為 1,備庫上為 0。其實仔細思考?一下也不難理解:備庫是可以承載查詢的,因此備庫有一套"獨立"的統計資訊並不奇怪。同理,pg_stat_database、pg_stat_bgwriter、pg_stat_user_functions等等,主備的資料都可以不一致。
但是有個較為特別的"檢視",沒錯——pg_stat_all_tables,我之前也曾寫過一篇有關備庫統計資訊的文章 備庫是否有自己的統計資訊?裡面也提及過相關底層知識:
pg_stat_all_tables 並不是一個普通的表,透過 \d+ 可以看到其定義,它只是一個檢視,本質上就是一系列函式,有關表上各個維度的計數器。這些函式是與 stats collector 打交道的,每個後端程式事務提交/回滾時會發訊息給程式 stats collector,stats collector 會彙總這份資訊並記錄到檔案中,因此 stats collector 使用的是自己的檔案,而不是普通的表進行儲存,因此該資料不會被複制到備庫。另外一個細節是 pg_basebackup 在複製的時候會忽略 pg_stat_tmp/pg_stat 目錄下的內容 (15以前的版本)。
因此,這裡就會有個很微妙的問題:試想一下,如果發生了主從切換,舊主上的這部分統計資訊就"丟失"了,只有當新主上發生了新的活動才會彙總到 pg_stat_all_tables 中,那麼假如原來舊主上有個表即將達到 vacuum/analyze 的觸發閾值,但是由於主從切換,那麼這個表就會"膨脹",亦或是使用陳舊過時的統計資訊,需要等到下一次觸發閾值才會進行清理/分析,所以這也是一個潛在的微妙問題。
至於另外一個 pg_statistic,由於是統計資訊表,但它是一個普通的表,因此也會被正常複製到備庫,這一點無需擔心主從切換後統計資訊丟失。
pg_stat_reset
那麼我當時為什麼會拍腦袋回覆"reset"呢?PostgreSQL 提供了一系列函式來重置相關統計資訊,比如
pg_stat_reset:Resets all statistics counters for the current database to zero,將全部統計資訊置為零 pg_stat_reset_single_table_counters:將某個表或索引的統計資訊置為零 pg_stat_reset_shared:pg_stat_wal、pg_stat_bgwriter、pg_stat_archiver等統計資訊置為零
那麼清零有什麼後果呢?前面也提到了,autovacuum launcher 程式輪詢所有資料庫,並根據計數以及設定的閾值判斷是否需要對錶進行 vacuum/analyze,因此,重置之後可能會引發表膨脹/凍結等問題。
當然並不是說該函式一無是處,典型場景是調整了某些引數,想對比調整前後的狀態,根據資料庫的這些指標變化趨勢進行對比,比如調整之後死鎖的數量、資料庫的active_time、緩衝區命中率等等,就可以考慮使用 pg_stat_reset 重置,還有個典型例子就是 pg_stat_statements_reset(),定時清空,分析潛在的高危查詢。
小結
因此,讓我們更加嚴謹地回答這位群友的問題:主備除了 pg_stat_all_tables 之外都要自己獨立的"統計資訊",因此主從切換之後,這些計數都是重新計算累積的,為了更好分析潛在的問題,可以按需重置,但是要注意可能的危害。
另外今天晚上看了一下 17 的進度,暫時沒有惹眼特性,indexes_total還算吸引我。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027826/viewspace-2996700/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【統計資訊】如何備份和還原統計資訊
- oracle資料庫連續相同資料的統計方法Oracle資料庫
- 收集全庫統計資訊
- 如何構建自己的雲資料庫?建立雲資料庫是否要收費?資料庫
- 6 收集資料庫統計資訊資料庫
- 【統計資訊】Oracle統計資訊Oracle
- 達夢資料庫統計資訊詳解資料庫
- 【統計資訊】Oracle常用的收集統計資訊方式Oracle
- ORACLE表統計資訊與列統計資訊、索引統計資訊Oracle索引
- 資料庫效能調優之始: analyze統計資訊資料庫
- 【TUNE_ORACLE】檢查統計資訊是否過期SQL參考OracleSQL
- 阿里雲資料庫備份DBS與自建備份系統有什麼優勢?阿里資料庫
- Oracle 9i統計資訊備份與恢復Oracle
- 達夢資料庫手動管理統計資訊方法資料庫
- 雲原生資料庫TDSQL-C和傳統主備方式資料庫有什麼區別?資料庫SQL
- 修改oracle 的統計資訊Oracle
- 請問這個資料庫統計資訊是什麼,資料庫
- 略施小計,擁有自己的GPTGPT
- 【統計資訊】全面檢視錶所有統計資訊SQLSQL
- 統計資訊記錄表|全方位認識 mysql 系統庫MySql
- [統計資訊系列7] Oracle 11g的自動統計資訊收集Oracle
- 【PG執行計劃】Postgresql資料庫執行計劃統計資訊簡述SQL資料庫
- 資料庫的災備資料庫
- Oracle檢視歸檔是否被備庫應用Oracle
- 如何確定自己是否適合做程式設計師?程式設計師
- 統計資訊查詢檢視|全方位認識 sys 系統庫
- 資料庫:系統設計的核心資料庫
- 恆訊科技分析:是否有可能破解 SSL?
- Oracle收集統計資訊Oracle
- 收集統計資訊方案
- MySQL統計資訊系列MySql
- win10系統如何檢視自己電腦有沒有被監控_win10怎麼檢視自己電腦是否被監控Win10
- vivo 資料庫備份恢復系統演化資料庫
- 成為MySQL DBA後,再看ORACLE資料庫(十四、統計資訊與執行計劃)MySqlOracle資料庫
- 大資料時代我們是否還需要資料庫設計?VG大資料資料庫
- 統計資料庫中表大小資料庫
- MySQL中Innodb如何計算索引的統計資訊?MySql索引
- 資料庫備份資料庫