PostGreSQL常用命令
PostGreSQL常用命令
1. 基础使用
shell命令
1
2
3
4
5
6
7
8
9
10
11
12#默认的用户和数据库是postgres
psql -U user -d dbname -h localhost -p port -d databaseName
# -U指定用户 -d要连接的数据库 -h要连接的主机 -W提示输入密码 -p指定端口 -d 指定连接数据库
#导入sql
psql -h localhost -p port -d postgres -f *.sql
#pgpool启停
sudo pgpool -C -D -n > /data/pgpool/logfile/pgpool.log 2>&1 &
pgpool -m fast stop
#-C --clear-oidmaps Clear query cache oidmaps when memqcache_method is memcached
#-D --discard-status Discard pgpool_status file and do not restore previous status
#-C,在memqcache_method=memcached时清除查询缓存oidmaps(如果是shmem,则在pgpool启动时丢弃。)
#-D,--放弃状态放弃pgpool_status文件,不还原以前的状态1.1增
1
2
3
4
5
6
7
8
9
10#创建用户
CREATE USER userName WITH PASSWORD 'passwd' ;
#创建角色
CREATE ROLE rolename;
#创建数据库
create database [数据库名];
#创建模式
create schema [schema_name];
#创建表
create TABLE ([字段名1] [类型1] <references 关联表名(关联的字段名)>;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;); \copyright1.2 删
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29#删除数据库
DROP database [数据库名];
#删除数据库是提示 有进程在连接该数据库则执行如下sql
#pg_terminate_backend 用来终止与数据库的连接的进程id的函数
#pg_stat_activity 是一个系统表,用于存储服务进程的属性和状态
#pg_backend_pid() 是一个系统函数,获取附加到当前会话的服务器进程的ID
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname='smart_horn' AND pid<>pg_backend_pid();
#删除一个表
DROP TABLE [表名];
DELETE FROM [表名];
#清空表
TRUNCATE table_name;
TRUNCATE TABLE table_name RESTART IDENTITY;#postgresql 的自增字段 是通过序列sequence来实现的,在清空表的时候,还需要还原序列
#删除表中的字段
ALTER TABLE [表名] DROP column [字段名];
#删除表中某行数据
DELETE FROM [表名] WHERE [该行特征];
#删除库表保留表结构 执行如下sql生成删除sql脚本语句
select CONCAT('TRUNCATE TABLE ',table_name,' CASCADE',';') FROM information_schema.tables WHERE TABLE_SCHEMA = 'public' and table_type = 'BASE TABLE';
TRUNCATE TABLE tablename CASCADE;#会删除引用此表的关联表数据、此命令为清空表命令
##删除表
#若该表有字段被其他表引用成外键,要用级联方式删所有关联的数据 CASCADE
DROP TABLE tablename CASCADE;##会删除引用此表的引用表外键
#删除用户和组
DROP ROLE IF EXISTS role_name;
#回收用户的所有权限再删除
revoke all on database databasename from username;1.3 改
修改用户属性
1 | #修改用户权限 |
- 修改表
1 | #重命名一个表 |
1.4 查
1 | #SQL 命令语法上的说明,用 * 显示全部命令 |
2. 常见问题
1. pgpool集群互斥问题
2. pgsql主从流复制问题
1 | #查看进程 ps -aux |
3. pgsql归档备份问题
如何使用归档备份
pg_waldump
https://www.escapelife.site/posts/b47f1fcb.html
https://www.infoq.cn/article/Yh39wx9xlrjJMC90TFPN1
2
3
4
5
6
7
8
9
10#在数据库查看具体的日志编号LSN
select proname from pg_proc where proname like 'pg_%_location';
#查询到当前的日志编号情况
select pg_current_xlog_location();
#获得当前预写式日志写入位置
select pg_current_wal_lsn();
#强制切换到一个新的预写式日志文件(默认只限于超级用户,但是可以授予其他用户 EXECUTE 特权来执行该函数)
pg_switch_wal()
pg_resetwal -f /data/pgsql11/data/问题:归档后主从不同步
优雅clean wal目录
4. pgsql 配置文件软载入
pg_ctl -D /data/pgsql11/data -l /data/pgsql11/log/pgsql.log reload
5. pgsql主从切换问题
- 主库挂了后,pgpool会进入只读,需重启(主库和pgpool主节点为统一节点)
当pgpool状态改变后,需要重启pgpool集群才能改变? - https://www.cnblogs.com/miclis/p/10480979.html
6. pgsql 监控
并发\执行时间\集群状态
数据库监控指标
PostgreSQL 锁等待监控 珍藏级SQL - 谁堵塞了谁
PostgreSQL 用系统表来分析postgresql的问题
6. pgpool
问题原因
pgpool作为postgresql的中间件,当集群内存在至少两个节点时,就会进行选举,如果此时第三个节点还没起来,当选举完成后,pgpool不会将没有参加选举的节点自动加入集群,需要手工attach进集群,或者同时重启pgpool进行重启选举,即pgpool本身不具有重启后能自动加入集群并恢复的机制。
解决方案
- 方案1:手动attach
1
2
3
4
5#将掉线节点手动重新加入数据库集群中,例如掉线节点为192.168.1.1并且node id为0,执行下面的attach命令:
#pcp port :9898
pcp_attach_node -n 0 -p 9898 -h 192.168.1.1 -U app
pcp_attach_node -n 2 - 方案2:重启pgpool,触发重新选举
Pgpool每次选举都会读取pgpool状态文件,为了避免影响下次选举,所以需要删除该状态文件
- 方案1:手动attach