這只是一個刷存在感的雜記
很偶爾的時候,非得把 PGSQL 關掉,用 single-user mode 打開(請參考手冊)。
然後就想到,在這個狀態底下或許也可以用 pipe 吃外面指令~
先用 SELECT 1 試試看:
[enterprisedb@edb15 ~]$ /usr/edb/as15/bin/edb-postgres --single -D ~/as15/data/ edb << EOF
> select 1;
> EOF
PostgreSQL stand-alone backend 15.2.0
backend> 1: ?column? (typeid = 23, len = 4, typmod = -1, byval = t)
----
1: ?column? = "1" (typeid = 23, len = 4, typmod = -1, byval = t)
----
backend> 2023-09-27 03:24:34 UTC LOG: checkpoint starting: shutdown immediate
2023-09-27 03:24:34 UTC LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.022 s, total=0.114 s; sync files=2, longest=0.014 s, average=0.011 s; distance=0 kB, estimate=0 kB
[enterprisedb@edb15 ~]$
跑系統表查詢看看
[enterprisedb@edb15 ~]$ /usr/edb/as15/bin/edb-postgres --single -D ~/as15/data/ edb << EOF
select * from pg_stat_activity;
EOF
PostgreSQL stand-alone backend 15.2.0
backend> 1: datid (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname (typeid = 19, len = 64, typmod = -1, byval = f)
3: pid (typeid = 23, len = 4, typmod = -1, byval = t)
4: leader_pid (typeid = 23, len = 4, typmod = -1, byval = t)
5: usesysid (typeid = 26, len = 4, typmod = -1, byval = t)
6: usename (typeid = 19, len = 64, typmod = -1, byval = f)
7: application_name (typeid = 25, len = -1, typmod = -1, byval = f)
8: client_addr (typeid = 869, len = -1, typmod = -1, byval = f)
9: client_hostname (typeid = 25, len = -1, typmod = -1, byval = f)
10: client_port (typeid = 23, len = 4, typmod = -1, byval = t)
11: backend_start (typeid = 1184, len = 8, typmod = -1, byval = t)
12: xact_start (typeid = 1184, len = 8, typmod = -1, byval = t)
13: query_start (typeid = 1184, len = 8, typmod = -1, byval = t)
14: state_change (typeid = 1184, len = 8, typmod = -1, byval = t)
15: wait_event_type (typeid = 25, len = -1, typmod = -1, byval = f)
16: wait_event (typeid = 25, len = -1, typmod = -1, byval = f)
17: state (typeid = 25, len = -1, typmod = -1, byval = f)
18: backend_xid (typeid = 28, len = 4, typmod = -1, byval = t)
19: backend_xmin (typeid = 28, len = 4, typmod = -1, byval = t)
20: query_id (typeid = 20, len = 8, typmod = -1, byval = t)
21: query (typeid = 25, len = -1, typmod = -1, byval = f)
22: backend_type (typeid = 25, len = -1, typmod = -1, byval = f)
----
1: datid = "15313" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "edb" (typeid = 19, len = 64, typmod = -1, byval = f)
3: pid = "836" (typeid = 23, len = 4, typmod = -1, byval = t)
7: application_name = "" (typeid = 25, len = -1, typmod = -1, byval = f)
11: backend_start = "27-SEP-23 03:24:52.737088 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
12: xact_start = "27-SEP-23 03:24:52.840326 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
13: query_start = "27-SEP-23 03:24:52.840326 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
14: state_change = "27-SEP-23 03:24:52.840328 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
17: state = "active" (typeid = 25, len = -1, typmod = -1, byval = f)
19: backend_xmin = "881" (typeid = 28, len = 4, typmod = -1, byval = t)
21: query = "select * from pg_stat_activity;
" (typeid = 25, len = -1, typmod = -1, byval = f)
22: backend_type = "not initialized" (typeid = 25, len = -1, typmod = -1, byval = f)
----
backend> 2023-09-27 03:24:53 UTC LOG: checkpoint starting: shutdown immediate
2023-09-27 03:24:53 UTC LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.021 s, total=0.114 s; sync files=2, longest=0.013 s, average=0.011 s; distance=0 kB, estimate=0 kB
[enterprisedb@edb15 ~]$
試試看查系統表
[enterprisedb@edb15 ~]$ /usr/edb/as15/bin/edb-postgres --single -D ~/as15/data/ edb << EOF
begin; select * from pg_stat_activity; rollback;
EOF
PostgreSQL stand-alone backend 15.2.0
backend> 1: datid (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname (typeid = 19, len = 64, typmod = -1, byval = f)
3: pid (typeid = 23, len = 4, typmod = -1, byval = t)
4: leader_pid (typeid = 23, len = 4, typmod = -1, byval = t)
5: usesysid (typeid = 26, len = 4, typmod = -1, byval = t)
6: usename (typeid = 19, len = 64, typmod = -1, byval = f)
7: application_name (typeid = 25, len = -1, typmod = -1, byval = f)
8: client_addr (typeid = 869, len = -1, typmod = -1, byval = f)
9: client_hostname (typeid = 25, len = -1, typmod = -1, byval = f)
10: client_port (typeid = 23, len = 4, typmod = -1, byval = t)
11: backend_start (typeid = 1184, len = 8, typmod = -1, byval = t)
12: xact_start (typeid = 1184, len = 8, typmod = -1, byval = t)
13: query_start (typeid = 1184, len = 8, typmod = -1, byval = t)
14: state_change (typeid = 1184, len = 8, typmod = -1, byval = t)
15: wait_event_type (typeid = 25, len = -1, typmod = -1, byval = f)
16: wait_event (typeid = 25, len = -1, typmod = -1, byval = f)
17: state (typeid = 25, len = -1, typmod = -1, byval = f)
18: backend_xid (typeid = 28, len = 4, typmod = -1, byval = t)
19: backend_xmin (typeid = 28, len = 4, typmod = -1, byval = t)
20: query_id (typeid = 20, len = 8, typmod = -1, byval = t)
21: query (typeid = 25, len = -1, typmod = -1, byval = f)
22: backend_type (typeid = 25, len = -1, typmod = -1, byval = f)
----
1: datid = "15313" (typeid = 26, len = 4, typmod = -1, byval = t)
2: datname = "edb" (typeid = 19, len = 64, typmod = -1, byval = f)
3: pid = "838" (typeid = 23, len = 4, typmod = -1, byval = t)
7: application_name = "" (typeid = 25, len = -1, typmod = -1, byval = f)
11: backend_start = "27-SEP-23 03:27:07.504369 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
12: xact_start = "27-SEP-23 03:27:07.601863 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
13: query_start = "27-SEP-23 03:27:07.601863 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
14: state_change = "27-SEP-23 03:27:07.601865 +00:00" (typeid = 1184, len = 8, typmod = -1, byval = t)
17: state = "active" (typeid = 25, len = -1, typmod = -1, byval = f)
19: backend_xmin = "881" (typeid = 28, len = 4, typmod = -1, byval = t)
21: query = "begin; select * from pg_stat_activity; rollback;
" (typeid = 25, len = -1, typmod = -1, byval = f)
22: backend_type = "not initialized" (typeid = 25, len = -1, typmod = -1, byval = f)
----
backend> 2023-09-27 03:27:07 UTC LOG: checkpoint starting: shutdown immediate
2023-09-27 03:27:07 UTC LOG: checkpoint complete: wrote 3 buffers (0.0%); 0 WAL file(s) added, 0 removed, 0 recycled; write=0.001 s, sync=0.026 s, total=0.119 s; sync files=2, longest=0.016 s, average=0.013 s; distance=0 kB, estimate=0 kB
[enterprisedb@edb15 ~]$
不過要注意的是,如果是處理 wraparound 狀況,在 single-user mode 底下也要小心節約使用 TxID,不要用上面的手法把剩下的 TxID 吃光。
參考資料
自己去找 shell script 的 heredoc 與 pipe~
沒有留言:
張貼留言