**
postgresql数据库 DBA 运维 经常使用的命令
**
文章目录
(持续更新)
最近一直在维护postgresql数据库 ,整理一下经常会用到的命令,sql语句。
postgresql11 常用命令
**
一.死锁
**
因为postgresql的本身,常常会导致一部分表被锁
1.查询锁
select w1.pid as 等待进程,
w1.mode as 等待锁模式,
w2.usename as 等待用户,
w2.query as 等待会话,
b1.pid as 锁的进程,
b1.mode 锁的锁模式,
b2.usename as 锁的用户,
b2.query as 锁的会话,
b2.application_name 锁的应用,
b2.client_addr 锁的IP地址,
b2.query_start 锁的语句执行时间
from pg_locks w1
join pg_stat_activity w2 on w1.pid=w2.pid
join pg_locks b1 on w1.transactionid=b1.transactionid and w1.pid!=b1.pid
join pg_stat_activity b2 on b1.pid=b2.pid
where not w1.granted;
2.杀死死锁进程
SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid='62560'
如果仍然不能杀死会话,可以在操作系统层面,直接kill 掉
**
二.查看正在运行的进程
**
用于服务器监控,可查询进程,时间消耗与锁相关
SELECT
C.relname 对象名称,
l.locktype 可锁对象的类型,
l.pid 进程id,
l.MODE 持有的锁模式,
l.GRANTED 是否已经对锁进行授权,
l.fastpath,
psa.datname 数据库名称,
psa.usesysid 用户id,
psa.usename 用户名称,
psa.application_name 应用程序名称,
psa.client_addr 连接的IP地址,
psa.client_port 连接使用的TCP端口号,
psa.backend_start 进程开始时间,
psa.xact_start 事务开始时间,
psa.query_start 事务执行此语句时间,
psa.state_change 事务状态改变时间,
psa.wait_event_type 等待事件类型,
psa.wait_event 等待事件,
psa.STATE 查询状态,
backend_xid 事务是否有写入操作,
backend_xmin 是否执事务快照,
psa.query 执行语句,
now( ) - query_start 持续时间
FROM
pg_locks l
INNER JOIN pg_stat_activity psa ON ( psa.pid = l.pid )
LEFT OUTER JOIN pg_class C ON ( l.relation = C.oid )
-- where l.relation = 'tb_base_apparatus'::regclass
where relkind ='r'
ORDER BY query_start asc
三 PostgreSql 查询数据库,索引,表,表空间大小
– 查询表空间大小
select pg_size_pretty(pg_tablespace_size('pg_default'));
– 查询所有数据库大小
select pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) AS size from pg_databas;
– 查询指定索引大小
select pg_size_pretty(pg_relation_size('dotime'));
– 查询指定表所有索引大小
select pg_size_pretty(pg_indexes_size('tb_sys_loginfo'));
– 查询指定schema 里所有的索引大小,按从大到小的顺序排列。
select relname,indexrelname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_indexes where schemaname='public' order by pg_relation_size(relid) desc;
– 查询指定表大小(仅仅指定表数据)
select pg_size_pretty(pg_relation_size('tb_sys_loginfo'));
– 查询指定表总大小(包括表数据与索引)
select pg_size_pretty(pg_total_relation_size('tb_sys_loginfo'));
– 查询指定schema里面所有表大小(仅仅指定表数据,从大到小)
select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;
–查询指定schema里面所有表数据大小,总索引大小,总大小,行数
SELECT
table_size.relname 表名,
pg_size_pretty ( pg_relation_size ( relid ) ) 表数据大小,
pg_size_pretty ( pg_indexes_size ( relid ) ) 表总索引大小,
pg_size_pretty ( pg_total_relation_size ( relid ) ) 表总大小,
表行数
FROM
pg_stat_user_tables table_size
LEFT JOIN (
SELECT
relname,
reltuples :: DECIMAL ( 19, 0 ) 表行数
FROM
pg_class r
JOIN pg_namespace n ON ( relnamespace = n.oid )
WHERE
relkind = 'r'
AND n.nspname = 'public'
) table_num ON table_num.relname = table_size.relname
WHERE
schemaname = 'public'
ORDER BY
pg_relation_size ( relid ) DESC;
**
四 查询外部server
**
select * from pg_foreign_server;
**
五 杀掉所有数据库连接
**
SELECT
pg_terminate_backend(pid)
FROM
pg_stat_activity
WHERE
-- don't kill my own connection
pid <> pg_backend_pid()
-- don't kill the connections to other databases
AND datname = '库名'
;
**
六 重新启动服务
**
--启动服务:
systemctl start postgresql-11
--停止服务:
systemctl stop postgresql-11
--重启服务:
systemctl restart postgresql-11
--查看pgagent_11服务
systemctl enable pgagent_11
systemctl status pgagent_11
systemctl start pgagent_11
**
七 备份与还原
**
1. 备份数据库
pg_dump --file "/home/back/pgsql-all-"$(date +%F+%T)".backup" --host "0.0.0.11" --port "5432" --username "postgres" --dbname "postgres" --verbose --role "postgres" --format=c --blobs --encoding "UTF8"
2.还原数据库
pg_restore --username "postgres" --no-password --role "postgres" --dbname "hrmwv2" --verbose /home/back/pgsql-all-postgres-2020-07-22+11:03:28.backup
八 重新加载数据库配置的方法有三种:
1. 用超级用户运行
postgres=# SELECT pg_reload_conf();
2. 用UNIX的kill手动发起HUP信号
$kill -HUP PID
3.使用pg_ctl命令触发SIGHUP信号
$pg_ctl reload