PostgreSQL的單使用者模式

T1YSL發表於2021-10-21

postgres能在單使用者模式中被呼叫。這種模式的主要用途是在啟動過程中由initdb使用。有時候它也被用於除錯或者災難性恢復。
注意,執行一個單使用者模式伺服器並不真地適合除錯伺服器,因為不會發生實際的程式間通訊和鎖定。當從 shell 中呼叫單使用者模式時,使用者可以輸入查詢並且結果會被以一種更適合開發者閱讀(不適合普通使用者)的形式列印在螢幕上。

在單使用者模式中,會話使用者將被設定為 ID 為 1 的使用者,並且這個使用者會被隱式地賦予超級使用者許可權。
該使用者不必實際存在,因此單使用者模式執行可以被用來對某些意外損壞的系統目錄進行手工恢復。

單使用者模式需要在資料庫關閉狀態使用
如下為一個例子在不能登入資料庫的狀況下,透過單使用者進入手動恢復

[postgres@localhost ~]$ pg_ctl stop -D /opt/data6000/
waiting for server to shut down.... done
server stopped
[postgres@localhost ~]$ postgres --single -D /opt/data6000 --ignore_system_indexes=on --enable_indexscan=off --enable_bitmapscan=off postgres
PostgreSQL stand-alone backend 12.1
backend> reindex database postgres;
[postgres@localhg_ctl start -D /opt/data6000/
waiting for server to start....2021-09-27 22:58:31.119 CST [7978] LOG:  starting PostgreSQL 12.1 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44), 64-bit
2021-09-27 22:58:31.119 CST [7978] LOG:  listening on IPv6 address "::1", port 6000
2021-09-27 22:58:31.119 CST [7978] LOG:  listening on IPv4 address "127.0.0.1", port 6000
2021-09-27 22:58:31.120 CST [7978] LOG:  listening on Unix socket "/tmp/.s.PGSQL.6000"
2021-09-27 22:58:31.128 CST [7979] LOG:  database system was shut down at 2021-09-27 22:58:24 CST
2021-09-27 22:58:31.129 CST [7978] LOG:  database system is ready to accept connections
 done
server started
------------------------------------
--ignore_system_indexes=on
讀取系統表時忽略系統索引(但是修改系統表時依然同時更新索引)。這在從被破壞的系統索引中恢復資料的時有用。
用於單使用者模式的選項
--enable_indexscan=off 
不允許或禁止查詢規劃器使用索引掃描計劃型別
--enable_bitmapscan=off
關閉規劃器對點陣圖掃描規劃型別的使用

下面的選項僅適用於單使用者模式。

--single
選擇單使用者模式。這必須是命令列中的第一個選項。
database
指定要訪問的資料庫的名稱。這必須是命令列中的最後一個引數。如果省略它,則預設為使用者名稱。
-E
在執行命令之前回顯所有命令到標準輸出。
-j
使用跟著兩個新行的分號而不是僅用新行作為命令終止符。
-r filename
將所有伺服器日誌輸出傳送到filename中。 只有在作為一個命令列選項提供時,這個選項才會兌現。

要啟動一個單使用者模式的伺服器,使用這樣的命令

postgres --single -D /usr/local/pgsql/data other-options my_database

用-D給伺服器提供正確的資料庫目錄的路徑,或者確保環境變數PGDATA被設定。同時還要指定你想在其中工作的特定資料庫的名字。

通常,單使用者模式的伺服器會把換行符當做命令輸入的終止符。它不明白分號的作用,因為那屬於psql。要想把一個命令分成多行,必須在最後一個換行符以外的每個換行符前面敲一個反斜線。這個反斜線和旁邊的新行都會被從輸入命令中去掉。注意即使在字串或者註釋中也會這樣做。

但是如果使用了-j命令列選項,那麼單個新行將不會終止命令輸入。相反,分號-新行-新行的序列才會終止命令輸入。也就是說,輸入一個緊跟著空行的分號。在這種模式下,反斜線-新行不會被特殊對待。此外,在字串或者註釋內的這類序列也不會被特殊對待。

不管在哪一種輸入模式中,如果輸入的一個分號不是正好在命令終止符之前或者不是命令終止符的一部分,它會被認為是一個命令分隔符。當真正輸入一個命令終止符時,已經輸入的多個語句將被作為一個單個事務執行。要退出會話,輸入EOF(通常是Control+D)。如果從上一個命令終止符以來已經輸入了任何文字,那麼EOF將被當作命令終止符,並且如果要退出則需要另一個EOF。注意單使用者模式的伺服器不會提供複雜的行編輯特性(例如沒有命令歷史)。但使用者模式也不會做任何後臺處理,例如自動檢查點或者複製。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2838441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章