首页 > 数据库 >PostgreSQL会话及阻塞相关常用SQL

PostgreSQL会话及阻塞相关常用SQL

时间:2022-12-06 14:56:20浏览次数:39  
标签:PostgreSQL pid 会话 pg SQL table tkk123 select size

====PostgreSQL===========
select * from pg_settings;
select version(), txid_current(), pg_backend_pid(), current_user, current_schema, current_timestamp;

-- 查询所有会话信息
select t.datname, t.usename, t.application_name, t.client_addr, t.state, t.wait_event, t.query_start, t.query, t.* 
from pg_stat_activity t
where t.pid != pg_backend_pid();

    
-- 先确定当前有哪些pid被阻塞
SELECT pid,waiting,query_start,query FROM pg_stat_activity where waiting;


-- 再根据当前的PID查阻塞源资料
select *
from (
    select procpid, start, now() - start as lap, current_query
    from (
        select backendid, pg_stat_get_backend_pid(S.backendid) as procpid, pg_stat_get_backend_activity_start(S.backendid) as start, pg_stat_get_backend_activity(S.backendid) as current_query
        from (select pg_stat_get_backend_idset() as backendid) as S 
      ) as S
    where current_query <> '<IDLE>'
    order by lap desc
  ) b
where b.procpid =(
            select pid
            from (
                select a.locktype, a.transactionid, a.virtualtransaction, b.pid, a.mode, a.granted
                from pg_locks a, pg_locks b
                where a.transactionid = b.transactionid
                    and a.transactionid is not null
                    and a.granted = 'f'
              ) b
            where b.pid != 23512
        );
  
经确认后, 可以用select pg_terminate_backend(23495)来粗暴杀死这个阻塞源.
  
  


-- 统计各数据库占用的磁盘大小
SELECT d.datname AS Name,  pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
        ELSE 'No Access'
    END AS SIZE
FROM pg_catalog.pg_database d
    ORDER BY
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(d.datname)
        ELSE NULL
    END DESC -- nulls first
    LIMIT 20;
    
    

-- 查出所有表按大小排序并分离data与index
SELECT
    table_name,
    pg_size_pretty(table_size) AS table_size,
    pg_size_pretty(indexes_size) AS indexes_size,
    pg_size_pretty(total_size) AS total_size
FROM (
    SELECT
        table_name,
        pg_table_size(table_name) AS table_size,
        pg_indexes_size(table_name) AS indexes_size,
        pg_total_relation_size(table_name) AS total_size
    FROM (
        SELECT ('"' || table_schema || '"."' || table_name || '"') AS table_name
        FROM information_schema.tables
    ) AS all_tables
    ORDER BY total_size DESC
) AS pretty_sizes;


-- 数据库表总行数
SELECT t.reltuples, pn.nspname, t.*
FROM pg_class t 
    join pg_catalog.pg_namespace pn  on t.relnamespace = pn."oid" 
WHERE t.relkind = 'r' and pn.nspname = 'gsc2206'
order by t.reltuples desc ;



--## 使用悲观锁  模拟事务
begin transaction;

rollback;
commit;


lock table gspauresulttkk02 in access share mode;
lock table gspauresulttkk02 in access exclusive mode;
lock table gspauresultbcc03 in row exclusive mode;


--## 查询存在锁的数据表
select pl.locktype, pl.database, pl.mode, pl.relation, pc.relname, ps.*
from pg_catalog.pg_locks pl
    join pg_catalog.pg_class pc on pl.relation = pc.oid 
    join pg_catalog.pg_stat_activity ps on pl.pid= ps.pid ;




--创建用户,需要密码
postgres=# CREATE USER tkk123 WITH PASSWORD 'tkk123';

--## 单独给用户,赋予访问数据库权限,schema权限
grant connect ON DATABASE "TestDB" to tkk123;
GRANT USAGE ON SCHEMA tkk123 TO tkk123;
ALTER SCHEMA tkk123 OWNER to tkk123;


--## 授予管理员权限
ALTER USER tkk123 with SUPERUSER ;
ALTER USER name RENAME TO new_name


--## 授予指定架构下所有数据表及序列的权限
grant all privileges on all tables in schema public to tkk123;
grant all privileges on all sequences in schema public to tkk123;

--## 设置访问路径
alter user tkk123 set search_path="$user", public;


--## 注意:上面的授权只对历史的一些对象授权,后期增加的对象是没有权限的,需要给个默认权限

--## 赋予默认数据表的权限
alter default privileges in schema public grant all privileges on tables to tkk123;

--## 赋予默认序列的权限
alter default privileges in schema public grant all privileges on sequences to tkk123;

 

标签:PostgreSQL,pid,会话,pg,SQL,table,tkk123,select,size
From: https://www.cnblogs.com/zhaoguan_wang/p/16955207.html

相关文章

  • mysqldump备份命令使用参数
    参数参数说明导出全部数据库。mysqldump-uroot-p--all-databases导出全部表空间。mysqldump-uroot-p--all-databases--all-tablespaces不导出任何表空间......
  • MySQL的数据表(DDL)操作
    表(Table)是数据库存储数据的主要形式,由行(Row)和列(Column)组成,类似于常见的电子表格。MySQL中的表与其他数据库的最大区别在于它们可以使用不同的存储引擎(StorageEngine)。......
  • mysql两种索引结构应用场景
    B-tree索引和Hash索引区别B+tree:B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树上的常规检索,从根节点......
  • SQL Server Merge matched 再加其他条件的示例
    这里介绍使用临时表的方式进行Merge,额外的条件语句用红色标出:假设有一个字典表dic_dict第一步先创建临时表createtable#temp_source([code][varchar](20)COLLATE......
  • SQL Server自动备份并定时清理备份文件
    在我们现有的系统中数据库的重要性不言而喻,为了避免数据宕机或误操作造成的数据丢失情况的产生,定期对数据库进行备份是必须要做的工作,下面将介绍SQLServer自带的数据库备......
  • MySQL忽略大小写的注意事项
    一、背景在阿里的规范中,不允许超过2个JOIN的关联查询,故项目中需要将复杂SQL拆分二、问题目前MySQL5.7非特殊场景默认选择utf8mb4,排序选择utf8mb4_general_ci,MySQL8默认选择u......
  • Android实验十——使用SQLite数据库存储数据
    一、实验要求和目的掌握SQLite数据库的操作方法;掌握SQLiteOpenHelper类的使用。掌握Lsitview的使用。二、实验环境部署有AndroidStudio和AndroidSDK的主机;建议......
  • sqlserver恢复数据
    若出事故的你希望能通过本文来弥补之前的错误。那么在开始阅读本文之前请先确认误操作库之前是否有一次完整数据库备份,若没有请不要再往下看了本文全程的操作仅需10分钟左......
  • pgsql 判断当前日期是否在两个时间范围
     需求  需求是当前时间根据活动开始时间与结束时间,得出一个状态值,同时并且支持搜索  2解决这里简捷的做法是直接写sql 这里使用casewhen 进行时间判......
  • mysql:数据量过多时使用索引覆盖
    1.什么是索引?索引(在MySQL中也叫“键key”)是存储引擎快速找到记录的一种数据结构,通俗来说类似书本的目录,这个比方虽然被用的最多但是也是最恰如其当的,在查询书本中的......