PostgreSQL 笔记

管理

无前缀的为普通用户命令,$ 为 postgres 命令,# 为 psql 命令。

  • 切到 postgres 用户:sudo -iu postgres
  • 新建用户:$ createuser --interactive
  • 删除用户:$ dropuser ${username}
  • 新建库:createdb ${db_name} -U ${username}
  • 删除库:dropdb ${db_name} -U ${username}
  • 连接数据库:psql -d ${db_name} -U ${username}
  • 切换数据库:# \c ${db_name}
  • 切换用户:# \c - ${user_name}
  • 列出所有用户:# \du
  • 列出所有库:# \l# SELECT * FROM pg_database;
  • 列出所有表:\dt# SELECT * FROM pg_tables;
  • 列出所有模式:\dn
  • 退出 psql:\q 或 CTRL + D
  • 配置表:SELECT * FROM pg_settings;
  • 优先修改 postgresql.auto.conf 而非 postgresql.conf,前者会覆盖后者,但不要手动修改,使用 # ALTER SYSTEM SET ${prop_name} = ${value};,如 # ALTER SYSTEM SET work_mem = '500M'; 会自动刷新 auto* 的数据
  • postgresql*.conf 中可以 include ${path_releate_conf} 引入其他配置文件
  • PostgreSQL 异常关闭可能会导致 postmaster.pid 残留,删除了才能正常启动
  • pg.hba.conf 规定哪些 IP 哪些用户哪种方式登录,自上至下匹配,常用的身份验证方式:trust 没要求,md5 md5 的密码,password 明文密码,ident 用户映射(Win 不支持),peer 操作系统用户名一致就能登录,cer SSL 证书
  • 获取当前执行的进程 SELECT * FROM pg_stat_activity;,查找阻塞的语句 SELECT * FROM pg_stat_activity WHERE wait_event IS NOT NULL
  • 取消进程连接:SELECT pg_cancel_backend(${pid});
  • 终止进程连接:SELECT pg_terminate_backend(${pid});,连接终止了执行的 SQL 也会终止,举个例子,终止 test_user 用户的所有连接 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE usename = 'test_user';
  • 还有一些语句参数阈值,超过某阈值的语句会被自动杀掉,0 表示禁用,deadlock_timeout 死锁超时(更建议使用 SELECT FOR UPDATE NOWAIT ... 而非依赖这个阈值),statement_timeout 语句最长执行时间(可针对单个语句自定义),lock_timeout 锁等待超时,idle_in_transaction_session_timeout 空闲事务最大超时时长
  • 创建模板:CREATE DATABASE my_db TEMPLATE my_template_db; 模板数据库禁止编辑与删除,将普通数据库修改为模板数据库:UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'mydb';,修改为非模板数据库 datistemplateFALSE 即可
  • scheme 用于对 database 进行分组管理(有很多表的话),同一个 scheme 中对象名不允许重复,创建时默认的表是 public scheme 的,创建 scheme 的语句为 CREATE SCHEME ${name},scheme 不同的话需要在表名前加上,还可以设置 search_path,去在不同的 scheme 中查找表,比如在 postgresql.conf 中配置 search_path = "$user", public,则会优先查找用户同名的 scheme
  • 查询当前用户 SELECT user;
  • 常用的几种权限,INSERT, SELECT, UPDATE, ALTER, EXECUTE, TRUNCATE
  • 对象所有者天生拥有对象所有权限,无需授予,但是这个权限对子对象没有继承关系,

SQL

  • 创建用户
CREATE ROLE ol3l_ox7 WITH LOGIN ENCRYPTED PASSWORD 'Changeme_123' NOSUPERUSER NOCREATEDB
    NOCREATEROLE INHERIT NOREPLICATION NOBYPASSRLS CONNECTION LIMIT -1;
  • 创建数据库
CREATE DATABASE music_hub WITH OWNER ol3l_ox7 TEMPLATE template0 ENCODING 'UTF8'
    LC_COLLATE 'en_US.utf8' LC_CTYPE 'en_US.utf8' ALLOW_CONNECTIONS TRUE CONNECTION LIMIT -1 IS_TEMPLATE FALSE;
  • 按 database 授予权限
GRANT ALL PRIVILEGES ON DATABASE music_hub TO ol3l_ox7;
  • 按 scheme 授予权限
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO ol3l_ox7;
  • 收回部分权限,这里的 PUBLIC 是所有人的意思,系统会默认将某些权限授予 PUBLIC (即所有人)
REVOKE EXECUTE ON ALL FUNCTIONS IN SCHEMA ol3l_ox7 FROM PUBLIC;
posted @ 2021-01-27 09:46  seliote  阅读(75)  评论(0)    收藏  举报