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。注意单用户模式的服务器不会提供复杂的行编辑特性(例如没有命令历史)。但用户模式也不会做任何后台处理,例如自动检查点或者复制。