一、 服务启停与创建
1. 服务启动
启动方法
- 直接运行postgres进程启动
 - 使用pg_ctl命令
 
#直接运行postgres进程启动
postgres -D $PGDATA &
#使用pg_ctl命令
pg_ctl -D $PGDATA start在Linux 7可以配置/usr/lib/systemd/system/postgresql.service文件,以systemctl命令启动pg,但这种方法本质上跟使用pg_ctl是一样的,参考
linux - Systemd postgresql start script - Unix & Linux Stack Exchange
单用户模式
在启动pg服务时添加 --single参数,常用的一种情况是,当记录年龄离2^31还有100万时,db将阻止用户连接,此时就需要启动到单用户模式执行vacuum
postgres --single -D $PGDATA &2. 服务停止
停止模式
- smart shutdown(相当于Oracle normal模式):不允许新连接,待已有连接全部结束后关闭数据库
 - fast shutdown(相当于Oracle immediate模式):不允许新连接,向所有活跃的服务进程发送SIGTERM信号让它们立即退出,之后等待所有子进程退出并关闭数据库
 - immediate shutdown(相当于Oracle abort模式):不允许新连接,主进程postgres向所有子进程发送SIGQUIT信号并且立即退出,所有子进程也会立即退出。下次启动时会redo wal日志进行实例恢复
 
信号类型
- SIGTERM:对应smart shutdown模式
 - SIGINT:对应fast shutdown模式
 - SIGQUIT:对应immediate shutdown模式
 
停止方法
- 直接向postgres主进程发送signal信号
 - 使用pg_ctl命令
 
#直接向postgres主进程发送signal信号
kill -TERM `head -1 /PGDATA目录/postmaster.pid`
kill -INT `head -1 /PGDATA目录/postmaster.pid`
kill -QUIT `head -1 /PGDATA目录/postmaster.pid`
#使用pg_ctl命令
pg_ctl stop -D $PGDATA -m smart
pg_ctl stop -D $PGDATA -m fast
pg_ctl stop -D $PGDATA -m immediate3. 重启pg
pg_ctl stop -D $PGDATA -m fast
pg_ctl start -D $PGDATA
#快速重启
pg_ctl -D $PGDATA restart -m fast4. pg_ctl功能
- 初始化pg实例
 - 启动、终止、重启pg服务
 - 查看pg服务状态
 - reload配置文件
 - 向指定进程发送信号
 
5. 查看控制文件内容
#不用加控制文件名
pg_controldata二、 psql常用命令
1. 常用元命令
- \h 查看sql语法
 - \? 命令行操作的帮助
 - Tab键可以补全目录
 - \i sql文件 执行sql文件
 - \l 列出所有的数据库
 - \dn 列出所有schema
 - \db 显示所有表空间(pg中的表空间是一个目录,表放在表空间相当于将表的数据文件放到该目录之下)
 - \d 查看当前schema 中所有的表、视图、序列
 - \d+ 同上,但是多额外信息,下面几个命令都有带+版,能看到更详细的信息
 - \d schema.obj 查看对象结构(相当于desc)
 - \dt 只显示匹配的表
 - \di 只显示匹配的索引
 - \ds 只显示序列
 - \dv 只显示视图
 - \df 只显示函数
 - \sf 函数名 查看函数定义
 - \du 或 \dg 列出数据库中所有角色或用户(pg中是一样的)
 - \dp 或 \z 表名 显示表的权限分配情况
 - \x 横纵显示切换 (类似mysql \G)
 - \dT+ 显示扩展类型相关属性及描述
 - \q 退出pg命令行
 - \z 或 \dp 表名 显示表的权限分配情况
 - \timing 显示执行时间
 - \watch 5 每五秒循环执行sql语句
 - \c dbname 切换数据库
 - \conninfo 查看连接信息
 - \echo 字符串 输出一行信息
 - \encoding 字符集名 设置客户端字符集
 - \set [NAME [VALUE]] 设置内部变量,不加参数则列出内部变
 

- set search to schema 切换schema
 
2. 常用参数
非交互模式执行脚本
psql -f file_path/file_name非交互模式执行SQL
psql -d db_name -c "sql语句1;sql语句2;sql语句3;"ssl连接
psql -h连接串  \ "user=root dbname=postgres sslmode=require"查看版本
psql -V 
psql -c "select version()"执行os命令
\! ls
\cd /tmp传变量
\set v_id 2
select * from test where id=:v_id;
#或
psql -v v_id=1 mydb pguser -f select.sql-t只显示输出结果,-A去除尾部空行(shell脚本取结果常用)
psql -At -c "sql"获取psql中命令实际执行的sql:在启动时加入 -E 或执行 \set ECHO_HIDDEN on
psql -E mydb pguser关闭pg的自动提交(AUTOCOMMIT不能小写)
\set AUTOCOMMIT off三、 其他psql命令
可以作为参考
1. psql参数
基本语法  | 支持参数  | 参数含义  | |
psql  | 连接参数  | -h  | 数据库服务器的主机名或IP  | 
-p  | 数据库服务器的端口号  | ||
-U  | 连接该数据库服务器时使用的数据库用户  | ||
-w  | 连接服务器时不需要输入用户密码  | ||
-W  | 连接服务器时需要输入用户密码  | ||
通用参数  | -c  | 执行单一SQL命令  | |
-d  | 指定要连接的数据库  | ||
-f  | sql脚本文件  | ||
-l  | 输出服务器中的所有数据库名  | ||
-v  | 设置psql的变量,形如 -v PARAMETER=VALUE  | ||
-V  | 输出版本信息  | ||
-X  | 不读取启动文件~/.psqlrc  | ||
-1(one)  | 以单一事务执行命令文件  | ||
-?  | 显示帮助信息  | ||
输入输出参数  | -a  | 显示所有来自脚本的输入  | |
-b  | 回显失败的命令  | ||
-e  | 回显发送给服务器的命令  | ||
-E  | 回显内部命令产生的查询  | ||
-L  | 指定会话日志文件  | ||
-n  | 禁用增强命令行编辑功能(readline)  | ||
-o  | 将查询结果输出到文件或Linux管道  | ||
-q  | 静默方式运行(只输出结果,不显示消息)  | ||
-s  | 单步模式,该模式下需要对每个命令进行确认  | ||
-S  | 单行模式,该模式下一行就是一条 SQL 命令  | ||
输出格式参数  | -A  | 非对齐表格输出模式  | |
-F  | 为字段设置分隔符,用于不整齐的输出,缺省为"|"  | ||
-H  | HTML表格输出模式  | ||
-P  | 设置将变量打印到参数的选项(查阅 \pset 命令)  | ||
-R  | 为不整齐的输出设置行分隔符(默认:换行符号)  | ||
-t  | 只打印记录  | ||
-T  | 设定HTML表格标记属性(例如,宽度,边界)  | ||
-x  | 打开扩展表格输出  | ||
-z  | 为不整齐的输出设置字段分隔符为字节0  | ||
-O  | 为不整齐的输出设置行分隔符为字节0  | 
2. 元命令
功能  | 命令  | 命令作用  | 
获取帮助  | \? [commands]  | 显示元命令帮助说明  | 
\? options  | 显示psql命令的帮助信息  | |
\? variables  | 显示psql变量的帮助信息  | |
\h [commands]  | 显示SQL命令的帮助信息  | |
一般性  | \copyright  | 显示PostgreSQL的发行和使用条款  | 
\g [file]  | 执行命令,然后将结果输出到文件  | |
\gset [PREFIX]  | 执行命令,然后以psql变量存储结果  | |
\q  | 退出psql  | |
\watch [sec]  | 每个[SEC]秒,重复执行sql命令  | |
查询  | \d[S+]  | 列出当前数据库中的表、视图、序列  | 
\da[S]  | 列出聚合函数  | |
\db[+]  | 列出表空间  | |
\dc[S+]  | 列出字符转码函数  | |
\dC[+]  | 列出类型转换函数  | |
\dd[S]  | 列出对象描述  | |
\ddp  | 列出缺省权限  | |
\dD[S+]  | 列出域  | |
\det[+]  | 列出foreign table  | |
\des[+]  | 列出foreign server  | |
\deu[+]  | 列出用户映射  | |
\dew[+]  | 列出foreign data wrapper  | |
\df[antw][S+]  | 列出[聚合/常规/触发器/窗口]函数  | |
\dF[+]  | 列出文本检索配置  | |
\dFd[+]  | 列出文本检索字典  | |
\dFp[+]  | 列出文件检索解析器  | |
\dFt[+]  | 列出文件检索模板  | |
\dg[+]  | 列出角色  | |
\di[S+]  | 列出索引  | |
查询  | \dl      | 列出大对象  | 
\dL[S+]  | 列出所有过程语言  | |
\dm[S+]  | 列出所有物化视图  | |
\dn[S+]  | 列出所有模式  | |
\do[S]   | 列出所有操作符  | |
\dO[S+]  | 列出所有排序规则  | |
\dp      | 列出表、视图、序列的访问权限  | |
\drds   | 列出每个数据库的角色定义  | |
\ds[S+]  | 列出序列  | |
\dt[S+]  | 列出表  | |
\dT[S+]  | 列出数据类型  | |
\du[S+]  | 列出角色  | |
\dv[S+]  | 列出视图  | |
\dE[S+]  | 列出外部表  | |
\dx[+]   | 列出扩展  | |
\dy      | 列出事件触发器  | |
\l[+]    | 列出数据库  | |
\sf[+]   | 列出指定函数的定义  | |
\z       | 等同于\dp  | |
连接  |  \c[onnect] {[DBNAME|- USER|- HOST|- PORT|-]  | 在psql下,以指定用户连接到指定端口服务器的数据库  | 
\encoding [ENCODING]  | 设置客户端编码  | |
\password [USERNAME]   | 安全的设置用户密码  | |
\conninfo  | 显示当前连接的相关信息  | |
操作系统  | \cd [DIR]  | 切换工作目录  | 
\setenv NAME [VALUE]  | 设置/清空环境变量  | |
\timing [on|off]  | 是否开启命令计时命令  | |
\! [COMMAND]  | 执行操作系统命令  | |
内置变量  | \prompt [TEXT] NAME  | 提示用户设置内置变量  | 
\set [NAME [VALUE]]  | 设置内置变量  | |
\unset NAME   | 重置变量  | |
输入输出  | \copy ...  | 执行copy命令,将数据流发送到客户端主机  | 
\echo [STRING]  | 标准屏幕输出指定字符串  | |
\i FILE   | 执行操作系统脚本  | |
\ir FILE    | 与\i  | |
\o [FILE]   | 将查询结果输出到指定文件  | |
\qecho [STRING]  | 用法类似\o,将字符串写到查询输出流  | |
缓存区  | \e [FILE] [LINE]   | 使用外部编辑器编辑查询缓存区(或文件)  | 
\ef [FUNCNAME [LINE]]  | 使用外部编辑器编辑函数定义  | |
\p  | 显示查询缓存区的内容  | |
\r   | 重置(清除)查询缓存区  | |
\s [FILE]  | 显示历史记录或将历史记录保存在文件中  | |
\w FILE  | 将查询缓存区的内容写入文件  | |
输出格式  | \a  | 在非对齐模式和对齐模式之间切换  | 
\C [STRING]  | 设置表的标题,如果没有的标题就取消  | |
\f [STRING]  | 显示或设定非对齐模式查询输出的字段分隔符  | |
\H   | 切换为HTML输出模式 (缺省关闭)  | |
\pset [NAME [VALUE]]  | 设置表输出选项  | |
\t [on|off]  | 只显示记录 (缺省关闭)  | |
\T [STRING]  | 设置HTML <表格>标签属性, 如果没有的话取消设置  | |
\x [on|off|auto]   | 切换扩展输出模式(缺省关闭)  | 
参考
PGCE课程《psql使用》
psql元素周期表









