首頁 > 軟體

快速解決openGauss資料庫pg_xlog爆滿問題

2023-11-22 14:00:51

問題現象

最近有一個之前搭的環境登不上了,好久沒用想拿來測試的時候發現啟動不了。啟動時報錯:
[Errno 28] No space left on device

query也不行了,提示沒有空間了。

查詢磁碟使用情況 df -h ,果然100%

這個環境當時安裝的是主備,看了下備庫的伺服器,發現不知道啥時候已經被刪庫了,安裝使用者都不在了。

問題定位

進一步排查主庫伺服器,發現opt目錄下的空間最可疑。

[root@opengauss1 /]# du  -lh --max-depth=1

根據經驗直奔data/dn目錄,果然就是這裡 ,pg_xlog下面產生了過多紀錄檔檔案。

看了下檔案個數,有1500多個。

[root@opengauss1 pg_xlog]# ls -l  |wc -l
1591

但是pg_xlog是WAL紀錄檔,是不能直接刪除的。我們在另外空閒的空間下/tmp新建目錄,再挪一部分xlog過去

[omm@opengauss1 ~]$ cd /tmp/
[omm@opengauss1 tmp]$ ll
total 0
-rw-r--r-- 1 root root  0 Mar 22 11:40 ck_monitor.lock
drwxr-x--- 2 root root 40 Sep 29 10:00 his-matrixagent_job
-rw-r--r-- 1 root root  0 Mar 22 11:40 monitor.lock
dr-xr-x--- 2 root root 40 May 27  2022 pub
drwx------ 3 root root 60 May  6  2022 systemd-private-ff4a118aad534bfe95b6b390fe984558-chronyd.service-Cy8Q8X
drwx------ 3 root root 60 May  6  2022 systemd-private-ff4a118aad534bfe95b6b390fe984558-systemd-logind.service-KrDeKX
[omm@opengauss1 tmp]$ mkdir xlog_mv_322

回到 pg_xlog目錄 執行遷移

[omm@opengauss1 pg_xlog]$ ls -ltr | head -n 100 | awk '{print "mv "$9  " /tmp/xlog_mv_322/"}' | sh

再嘗試重新啟動資料庫。因為我的備庫已經完全廢棄了,只能指定以主庫模型重啟 加 -M primary引數。

[omm@opengauss1 pg_xlog]$ gs_ctl  start -D /opt/huawei/install/data/dn/ -M primary

主庫啟動成功。登進去檢視邏輯複製槽。

[omm@opengauss1 pg_xlog]$ gsql -d postgres -p 15400 -r
gsql ((openGauss 3.0.0 build 02c14696) compiled at 2022-04-01 18:12:19 commit 0 last mr  )
NOTICE : The password has been expired, please change the password.
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.
openGauss=# select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby
-----------+--------+-----------+--------+----------+--------+------+--------------+-------------+---------------
dn_6002   |        | physical  |      0 |          | f      |      |              | 1/4C6B8F70  | f
(1 row)

刪除失效邏輯複製槽

openGauss=# select * from pg_drop_replication_slot('dn_6002');
WARNING:  replicationSlotMinLSN is InvalidXLogRecPtr!!!
WARNING:  replicationSlotMaxLSN is InvalidXLogRecPtr!!!
pg_drop_replication_slot
--------------------------
(1 row)
openGauss=#  select * from pg_replication_slots;
slot_name | plugin | slot_type | datoid | database | active | xmin | catalog_xmin | restart_lsn | dummy_standby
-----------+--------+-----------+--------+----------+--------+------+--------------+-------------+---------------
(0 rows)

檢視相關引數

openGauss=#  show wal_keep_segments;
wal_keep_segments
-------------------
16
(1 row)
openGauss=# show max_size_for_xlog_prune;
max_size_for_xlog_prune
-------------------------
2147483647kB
(1 row)
openGauss=# show enable_xlog_prune;
enable_xlog_prune
-------------------
on
(1 row)
openGauss=# show archive_mode;
archive_mode
--------------
off
(1 row)
openGauss=# q

綜合看下來, max_size_for_xlog_prune引數的問題,它表示如果有備機斷連且xlog紀錄檔大小大於此閾值,則回收紀錄檔。但是,預設值 給 的 太大了2048G,但是我這個環境只有40G,磁碟撐爆了。

解決辦法

知道了問題,那麼解決方法就是修改max_size_for_xlog_prune為4G,多餘的紀錄檔 讓DB自動清理。

[omm@opengauss1 pg_xlog]$ gs_guc reload -D /opt/huawei/install/data/dn/ -c "max_size_for_xlog_prune=4194304"

再去檢視空間已經釋放。

問題解決,主庫又能繼續堅持工作了。

總結

當歸檔或流複製發生異常時,事務紀錄檔會不斷生成,如果預設值沒修改,可能會造成磁碟撐爆,直接導致DB掛掉還起不來。遇到pg_xlog爆滿時,先備份一部分pg_xlog紀錄檔到其他地方,刪掉較早時間的紀錄檔,等有一定磁碟空間後再嘗試啟動資料庫,然後設定合適的引數值,最後修復問題。

到此這篇關於openGauss資料庫pg_xlog爆滿問題解決的文章就介紹到這了,更多相關openGauss資料庫pg_xlog爆滿內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com