一、什么是单用户模式
通常情况下,Postgres可以以Bootstrap模式、单用户模式、Normal模式等三种模式启动。Bootstrap模式用于在系统初始化时创建核心元数据,之后是单用户模式,用于创建初始化内存、参数配置等操作。最后是Normal模式即多用户模式,也就是系统正常运行的模式,也是我们作为用户最常用的模式。
其中,单用户模式(single-user mode)是PostgreSQL数据库支持的一种特殊运行模式,顾名思义,即只允许一个超级用户访问数据库系统,其他用户连接会被拒绝。这种模式除了可以在initdb阶段使用外,还多用于数据库维护和紧急恢复等特殊场景,可以认为是Postgres的一种应急模式。
二、单用户模式的使用场景
1.数据库维护
单用户模式允许数据库管理员(通常是超级用户)独占式地连接到数据库系统,从而进行一些需要排他性访问的维护任务。这些任务可能包括数据库重建、修复损坏的系统表、执行数据库升级或者修复损坏的数据文件等。
2. 紧急恢复
当数据库因为严重故障或者系统问题无法正常启动时,管理员可以进入单用户模式来尝试修复问题。在这种模式下,管理员可以以最高权限直接访问数据库,尝试解决造成系统不稳定的问题。
3.初始化场景的initdb阶段。
三、操作示例
进入单用户模式的操作步骤如下:
1)停止 PostgreSQL 实例,确保当前运行的 PostgreSQL实例处于停止状态。
2)单用户模式启动
通过命令行以某个用户(需要保证具有足够的操作权限)运行postgres程序时,带上“--single”参数,即可进入单用户模式,而非后台服务模式。
命令参考:
postgres --single -O -D /path/to/data/directory -p 5432 dbname
选项解释:
--single: 启动单用户模式
-O: 指定数据库的超级用户ID
-D:指定数据库的数据目录,即上述命令中的/path/to/data/directory
-p: 指定数据库的监听端口,默认为5432
dbname:指定访问的数据库名称,例如:postgres。
3)通过步骤2连接进入数据库以后,就可以执行操作语句。
典型场景:
PostgreSQL的事务年龄最大为2^31,处于临界状态下,需要通过单用户模式来手动清理,此时可以执行VACUUM FULL操作清理历史数据,强制释放数据空间,紧急修复数据库。