• postgresql dba常用sql查询语句


    查看帮助命令
    DB=# help  --总的帮助
    DB=# h    --SQL commands级的帮助
    DB=# ?    --psql commands级的帮助
    dn[S+] [PATTERN],其中[PATTERN]表示可以使用正则表达式,比如dns f*表示列出所有f开头的schema
    
    按列显示,类似mysql的G
    DB=# x
    Expanded display is on.
    
    显示斜杠后面的命令对应的语句,ECHO_HIDDEN必须大写
    set ECHO_HIDDEN on
    或
    psql -E
    
    
    查看DB安装目录(最好root用户执行)
    find / -name initdb
    
    查看有多少DB实例在运行(最好root用户执行)
    find / -name postgresql.conf
    
    查看DB版本
    cat  $PGDATA/PG_VERSION
    psql --version
    DB=# show server_version;
    DB=# select version();
    
    查看DB实例运行状态
    pg_ctl status
    
    查看所有数据库
    psql -l              --查看5432端口下面有多少个DB
    psql -p XX -l        --查看XX端口下面有多少个DB
    DB=# l
    DB=# select * from pg_database;
    
    创建数据库
    createdb database_name
    DB=# h create database  --创建数据库的帮助命令
    DB=#  create database database_name
    
    进入或切换到某个数据库
    psql –d dbname
    DB=# c dbname
    
    查看当前数据库
    DB=# c
    DB=# select current_database();
    
    postgresql数据库启动时间
    select pg_postmaster_start_time();
    
    查询当前客户端的端口号
    select inet_client_port();
    
    查看与当前会话相关联的服务器进程ID
    select pg_backend_pid();
    
    查看配置文件最后一次载入时间
    select pg_conf_load_time();
    
    
    查看数据库文件目录
    DB=# show data_directory;
    cat $PGDATA/postgresql.conf |grep data_directory
    cat /etc/init.d/postgresql|grep PGDATA=
    lsof |grep 5432得出第二列的PID号再ps –ef|grep PID
    
    查看每个数据库对应的目录
    DB=# select oid, datname from pg_database;--每个database会在base目录下有一个子目录,base目录里的每一个数字目录对于一个database的 oid
    再到文件目录比如ll /pgdata/data/base/,就可以看到和上面oid对应的目录名称
    --drop database后,base目录下面这个数据库的子目录也随即删除了
    
    
    查看表空间(表空间是实例级别的,任意一个数据库下看到的结果都是一样,一个表空间可以让多个数据库使用,而一个数据库可以使用多个表空间。db还能看到表空间的默认存放目录)
    db
    select * from pg_tablespace;
    
    查看语言
    select * from pg_language;
    
    
    查询所有schema,必须到指定的数据库下执行
    select * from information_schema.schemata;--普通用户只能看到用户自己有权限登录的schema的信息
    SELECT nspname FROM pg_namespace;
    dnS
    
    
    查看表名
    DB=# dt  --使用默认的search_path参数,只看到public的表名,如果有几个schema,每个schema的表名相同,也只能看到一个schema下的表名,看谁在参数值的前面。如果每个schema下的表名都不一样,则所有表名都可以看到
    DB=# select * from  pg_tables WHERE tablename NOT LIKE 'pg%' AND tablename NOT LIKE 'sql_%' ORDER BY tablename;--普通用户也能查询到整个数据库下的所有表,标准语句
    DB=# select table_catalog,table_schema,table_name,table_type,is_insertable_into,is_typed from information_schema.tables where table_schema<>'information_schema' and table_schema<>'pg_catalog';--superuser可以查询到所有表,普通用户只能查询到自己owner的表,但是查询结果居然有视图在里面,所以不是标准语句
    DB=# SELECT n.nspname as "Schema",c.relname as "Name",pg_catalog.pg_get_userbyid(c.relowner) as "Owner" FROM pg_catalog.pg_class c LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE c.relkind ='r' AND n.nspname in('public',current_user) ORDER BY 2,1;
    
    
    查看表结构
    DB=# d tablename  --表名前面加上schema名称就可以不同schema下表的表结构
    DB=# select * from information_schema.columns where table_schema='public' and table_name='XX';
    
    增加多个字段
    DB=# alter table tablename add column_name1 data_type,add column_name2 data_type,add column_name3 data_type
    
    查看表对应的目录
    DB=# select pg_relation_filepath('schema_name.table_name')  --需要到指定的数据库下执行
    这个文件的时间表示的是表的checkpoint时间
    
    
    查看索引(表名前面没有schema前缀)
    DB=# di  --只能看到public这个schema下的索引
    DB=# select * from pg_indexes where tablename='tbname'; --要到当前数据库下执行  
    DB=# select * from pg_statio_all_indexes where relname='tbname';--要到当前数据库下执行  
    
    查看视图
    DB=# dv
    DB=# select * from pg_views where schemaname = 'public';
    DB=# select * from information_schema.views where table_schema = 'public';
    
    
    查看触发器
    DB=# select * from information_schema.triggers;
    
    查看序列
    DB=# select * from information_schema.sequences where sequence_schema = 'public';
    
    查看约束
    DB=# select * from pg_constraint where contype = 'p'
    DB=# select a.relname as table_name,b.conname as constraint_name,b.contype as constraint_type from pg_class a,pg_constraint b where a.oid = b.conrelid and a.relname = 'cc';
    
    
    
    
    
    
    
    
    
    
    
    查看XX数据库的大小
    SELECT pg_size_pretty(pg_database_size('XX')) As fulldbsize;
    
    
    查看所有数据库的大小
    select pg_database.datname, pg_size_pretty (pg_database_size(pg_database.datname)) AS size from pg_database;
    
    查看各数据库数据创建时间:
    select datname,(pg_stat_file(format('%s/%s/PG_VERSION',case when spcname='pg_default' then 'base' else 'pg_tblspc/'||t2.oid||'/PG_11_201804061/' end, t1.oid))).* from pg_database t1,pg_tablespace t2 where t1.dattablespace=t2.oid;
    
    按占空间大小,顺序查看所有表的大小
    select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;
    select schemaname ,round(sum(pg_total_relation_size(schemaname||'.'||tablename))/1024/1024) "Size_MB" from pg_tables where schemaname='public' group by 1;
    
    按占空间大小,顺序查看索引大小
    select indexrelname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_indexes where schemaname='public' order by pg_relation_size(relid) desc;
    select schemaname ,round(sum(pg_total_relation_size(schemaname||'.'||indexname))/1024/1024) "Size_MB" from pg_indexes where schemaname='public' group by 1;
    
    按占空间大小,顺序查看表包含索引的大小
    select indexrelname, pg_size_pretty(pg_total_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;
    
    查看各个表空间的大小
    select spcname, pg_size_pretty(pg_tablespace_size(spcname)) from pg_tablespace;
    
    
    
    
    查看参数文件
    DB=# show config_file;
    DB=# show hba_file;
    DB=# show ident_file;
    
    查看当前会话的参数值
    DB=# show all;
    
    查看参数值
    select * from pg_file_settings
    
    查看某个参数值,比如参数work_mem
    DB=# show work_mem
    
    修改某个参数值,比如参数work_mem
    DB=# alter system set work_mem='8MB'
    --使用alter system命令将修改postgresql.auto.conf文件,而不是postgresql.conf,这样可以很好的保护postgresql.conf文件,加入你使用很多alter system命令后搞的一团糟,那么你只需要删除postgresql.auto.conf,再执行pg_ctl reload加载postgresql.conf文件即可实现参数的重新加载。
    
    
    查看是否归档
    DB=# show archive_mode;
    
    查看WAL归档信息,pg_stat_archiver来源于pg_stat_get_archiver()函数,执行dS+ pg_stat_archiver可看到详细信息
    select * from pg_stat_archiver;
    
    
    查看运行日志的相关配置,运行日志包括Error信息,定位慢查询SQL,数据库的启动关闭信息,checkpoint过于频繁等的告警信息。
    show logging_collector;--启动日志收集
    show log_directory;--日志输出路径
    show log_filename;--日志文件名
    show log_truncate_on_rotation;--当生成新的文件时如果文件名已存在,是否覆盖同名旧文件名
    show log_statement;--设置日志记录内容
    show log_min_duration_statement;--运行XX毫秒的语句会被记录到日志中,-1表示禁用这个功能,0表示记录所有语句,类似mysql的慢查询配置
    
    
    查看wal日志的配置,wal日志就是redo重做日志
    存放在data_directory/pg_wal目录
    
    
    
    
    
    
    查看当前用户
    DB=# c
    DB=# select current_user;
    
    切换用户,当前用户切换到user1用户
    DB=# c - user1
    
    查看所有用户,及用户包含的权限
    DB=# du
    DB=# select * from pg_user;
    DB=# select * from pg_shadow;
    
    查看所有角色拥有的权限和包含的用户
    DB=# du
    DB=# select * from pg_roles;
    
    psql 终端可以用du 或du+ 查看,也可以查看系统表
    select * from pg_roles;
    select * from pg_user;
    
    
    查询用户XX的权限,必须到指定的数据库下执行
    select * from information_schema.table_privileges where grantee='XX';
    select * from INFORMATION_SCHEMA.role_table_grants where grantee='XX';
    
    创建用户XX,并授予超级管理员权限
    create user XXX SUPERUSER PASSWORD 'A_@#qa23'
    
    备注:创建角色,赋予了login权限,则相当于创建了用户,在pg_user可以看到这个角色
    create role "user1" superuser;--pg_roles有user1,pg_user和pg_shadow没有user1
    alter role "user1" login;--pg_user和pg_shadow也有user1了
    
    把角色role1赋给user2
    GRANT role1 to user2;
    
    
    查看某个用户是否拥有某个schema的usage权限
    dns+ schema1
    --显示结果中第三列access privileges如果有用户1,表示用户1有schema1的usage权限
    
    查看某个用户是否拥有查询某个schema的所有表的权限
    ddp schema1
    
    
    查询group
    select * from pg_group
    
    
    授权
    DB=# h grant
    GRANT ALL PRIVILEGES ON schema schemaname TO dbuser;
    grant ALL PRIVILEGES on all tables in schema fds to dbuser;
    GRANT ALL ON tablename TO user;
    GRANT ALL PRIVILEGES ON DATABASE dbname TO dbuser;
    grant select on all tables in schema public to dbuser;--给用户读取public这个schema下的所有表
    GRANT create  ON schema schemaname TO dbuser;--给用户授予在schema上的create权限,比如create table、create view等
    GRANT USAGE  ON schema schemaname TO dbuser;
    grant select on schema public to dbuser;--报错ERROR:  invalid privilege type SELECT for schema
    --USAGE:
    对于LANGUAGE过程语言而言,表示允许使用指定的过程语句(pl/sql,pl/python等)创建相应的函数。目前过程语句上只有这一种权限控制
    对于SCHEMA模式而言,表示允许查询模式中对象,当然,如果要查询一个模式中的表,实际上还需要有表的select权限。当然如果没有usage权限仍然有办法可以看见模式下的对象的名字,比如通过查询系统视图pg_tables
    对于SEQUENCE序列而言,表示允许使用currval和nextval函数
    对于FOREIGN DATA WRAPPER外部数据封装器来说,表示允许被授权者使用外部数据封装器创建新的外部服务器(FOREIGN SERVERS)
    对于FOREIGN SERVER外部服务器来说,允许创建外部表(FOREIGN TABLE)
    --CREATE:对于数据库,允许在数据库上创建Schema;对于Schema,允许对Schema上创建数据库对象;对于表空间,允许把表或是索引指定到对应的表空间上。
    --ALL PRIVILEGES,其中关键字PRIVILEGES可以忽略
    
    
    在psql中的查看权限的快捷指令
    (options: S = show system objects, + = additional detail)
    du或dg   列出role名称和在它所属的哪个权限组
    --du或dg等价,因为postgresql数据库中角色和用户不分
    dns+  列出所有schema和它的schema owner和哪些用户对它有usage权限
    ddp   列出默认权限,列出schema的名称并列出哪些角色对他什么类型的对象有权限
    dts+  列出表属于哪个schema,这些表的owner是谁,表多大,但是只能显示public这个schema的信息
    dp    列出表,视图和序列的访问权限,同z,但是只能显示public这个schema的信息
    
    drds [模式1 [模式2]] 列出每个数据库的角色设置
    dp - lists table/view permissions
    dn+ - lists schema permissions
    l+ does not list all users that can access the database
    
    
    
    
    du *owner*
    列出包含owner名称的角色名称和在它所属的哪个权限组
    dns+ s*
    列出包含s名称信息的schema和它的schema owner和哪些用户对它有usage权限
    ddp schema1
    列出schema1这个schema的名称,列出哪些角色对他什么类型的对象有权限
    dt s*
    列出包含s名称的表的信息,这些表属于哪个schema,这些表的owner是谁
    
    
    set ECHO_HIDDEN on|off或psql -E来打开命令后面的语句
    
    
    
    
    
    
    
    
    
    
    
    databaseschema、table_seq_view_etc、table_column 分4个级别来授权。
    
    schema:一个database下可以有多个schema。可以给schema指定一个owner,如果没有指定,那么当前用户就是schema的默认owner。
    
    每个schema有自己的owner,并且db owner可以操作所有schema,db owner可以访问所有schema下的表。
    
    常见问题分析
    postgresql ERROR: permission denied for schema
    不仅需要授予对schema中表的访问权限,还需要授予对schema本身的访问权限。
    手册中有这样一段:默认情况下,用户不能访问他们不拥有的schema中的任何对象。要允许这样做,schema的所有者必须授予此用户对该schema的使用权限,即使该用户有对该schema下所有对象的操作权限(public schema除外)。因此,要么让所创建的用户成为该schema的所有者,要么将schema的使用权授予这个用户。
    
    # GRANT USAGE ON SCHEMA the_schema TO some_user;
    接下来再对schema下的TABLES,SEQUENCES,FUNCTIONS等对象进行授权。
    
    
    
    
    alter schema s2 owner to owner_1;
    修改schema s2的owner为owner_1,但是s2下的表的权限还是保持原来的owner,并没有也一并成了owner1
    
    -- 变更指定表owner
    alter table s2.t1 owner to owner_1;
    
    -- 或者在不变更表的owner的情况下,批量赋权s2下的所有表权限给owner_1
    grant all on all tables in schema s2 to owner_1;
    
    
    对一个用户授予只读某个schema的权限
    grant usage on schema s9 to owner_2;
    grant select on all tables in schema s9 to owner_2;
    --授权owner_2可以访问s9下面的所有表
    -- 重要提示:这种方式仅对已经存在的表有效。以后建立的表不会自动有只读权限
    如果新建的表也能访问,则操作如下
    alter default privileges for user user1 in schema s9 grant select on tables to owner_2;
    -- 对用户user1以后在schema s9下新建的表,owner_2都可以访问
    
    alter default privileges in schema s9 grant select on tables to owner_2;
    --当前用户执行如上语句后,此用户在s9下新建的任何表,owner_2都可以访问(其他用户用户创建的表,owner_2不能访问)
    --上述语句不是这个意思:对于任何用户在s9下新建的表,owner_2都可以访问
    alter default privileges for user user1,user2 in schema s9 grant select on tables to owner_2;
    --以后user1,user2在schema s9下新建的表,用户owner_2都可以访问
    
    备注:目前postgresql没有一种方法,可以使以后任何用户在s9下新建的表,owner_2都可以访问。
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    查看表上存在哪些索引以及大小
    select relname,n.amname as index_type from pg_class m,pg_am n where m.relam = n.oid and m.oid in
    (select b.indexrelid from pg_class a,pg_index b where a.oid = b.indrelid and a.relname = 'cc');
    
    SELECT c.relname,c2.relname, c2.relpages*8 as size_kb FROM pg_class c, pg_class c2, pg_index i
    WHERE c.relname ='cc' AND c.oid =i.indrelid AND c2.oid =i.indexrelid ORDER BY c2.relname;
    
    查看索引定义
    select b.indexrelid from pg_class a,pg_index b where a.oid = b.indrelid and a.relname = 'cc';
    select pg_get_indexdef(b.indexrelid);
    
    查看过程函数定义
    select oid,* from pg_proc where proname = 'insert_platform_action_exist'; --oid = 24610
    select * from pg_get_functiondef(24610);
    
    查看表大小(不含索引等信息)
    select pg_relation_size('cc'); --368640 byte
    select pg_size_pretty(pg_relation_size('cc')) --360 kB
    t1=# dts+ cc
    
    
    
    
    
    
    查看表所对应的数据文件路径与大小
    SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'empsalary';
    
    
    posegresql查询当前lsn
    1、用到哪些方法:
    apple=# select proname from pg_proc where proname like 'pg_%_lsn';
    proname
    ---------------------------------
     pg_current_wal_flush_lsn
     pg_current_wal_insert_lsn
     pg_current_wal_lsn
     pg_last_wal_receive_lsn
     pg_last_wal_replay_lsn
    
    2、查询当前的lsn值:
    apple=# select pg_current_wal_lsn();
    pg_current_wal_lsn
    --------------------------
    0/45000098
    
    3、查询当前lsn对应的日志文件
    select pg_walfile_name('0/1732DE8');
    select pg_walfile_name(pg_current_wal_lsn());
    
    4、查询当前lsn在日志文件中的偏移量
    SELECT * FROM pg_walfile_name_offset(pg_current_wal_lsn());
    
    
    
    切换pg_wal日志
    select pg_switch_wal();
    
    查询当前lsn在pg_wal日志中的详细信息,/pgdata1/data是默认的数据文件目录,/pgdata1/data/pg_wal是它的子目录
    pg_controldata /pgdata1/data
    
    清理pg_wal日志
    pg_archivecleanup /postgresql/pgsql/data/pg_wal 000000010000000000000005
    表示删除000000010000000000000005之前的所有日志
    --pg_wal日志没有设置保留周期的参数,即没有类似mysql的参数expire_logs_days,但是pg_wal日志保留期限受参数wal_keep_segments、max_wal_size的影响
    
    
    
    查询逻辑复制中延迟数据量
    select  pid, client_addr,application_name,state, sync_state, pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), sent_lsn)) as sent_delay,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), write_lsn)) as write_delay,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), flush_lsn)) as flush_delay,pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)) as replay_delay from pg_stat_replication;
    
    
    查询有哪些slot,任意一个数据库下都可以查,查询的结果都一样
    select * from pg_replication_slots;
    
    删除复制槽
    /usr/pgsql-10/bin/pg_recvlogical -d postgres --drop-slot --slot=slotname
    select pg_drop_replication_slot('slotname');
    
    
    
    查询某个用户XX拥有的所有对象权限,要到对应的数据库下执行
    SELECT relname,relacl FROM pg_class WHERE relacl::TEXT LIKE '%user1%'
    备注:这里只有表、视图、序列、索引、物化视图、复合类型、TOAST表、外部表
          函数、类型、语言、数据库、表空间需要找对应的系统表pg_proc.proacl , pg_type.typacl , pg_language.lanacl , pg_database.datacl , pg_tablespace.spcacl
    --系统权限,postgresql没有存放系统权限的系统表或系统视图,也是说postgresql不像oracle一样有系统权限的概念,poostgresql查不到select on all tables这样的系统权限
    
    查看某用户的拥有对哪些表、视图的权限,要到对应的数据库下执行
    select * from INFORMATION_SCHEMA.role_table_grants where grantee='XX';
    select * from information_schema.table_privileges where grantee='XX';
    
    查看usage权限表
    select * from information_schema.usage_privileges where grantee='XX';
    
    查看存储过程函数相关权限表
    select * from information_schema.routine_privileges where grantee='XX';
    
    
    查询某个用户拥有的角色
    
    查询某个角色拥有的权限
    
    查看哪些用户对XX表有哪些权限
    z XX
    dp XX
    select relname,relacl from pg_class where relname='XX';
    
    
    
    创建一个用户,再删除用户,报错
    postgres=# create role "lukes.liao";
    CREATE ROLE
    postgres=# alter role "lukes.liao" login;
    ALTER ROLE
    postgres=# grant all privileges on schema fds to "lukes.liao";
    ERROR:  schema "fds" does not exist
    postgres=# c fds
    fds=# grant all privileges on schema fds to "lukes.liao";
    GRANT
    fds=# grant ALL PRIVILEGES on all tables in schema fds to "lukes.liao";
    GRANT
    fds=# c postgres
    postgres=# drop user "lukes.liao";
    ERROR:  role "lukes.liao" cannot be dropped because some objects depend on it
    DETAIL:  248 objects in database fds
    
    
    解决方法
    postgres=# c fds
    fds=# select * from INFORMATION_SCHEMA.role_table_grants where grantee='lukes.liao';
    fds=# revoke all privileges on schema fds from "lukes.liao";
    REVOKE
    fds=# drop user "lukes.liao";
    and 147 other objects (see server log for list)
    fds=# revoke ALL PRIVILEGES on all tables in schema fds from "lukes.liao";
    REVOKE
    fds=# drop user "lukes.liao";
    DROP ROLE
    
    
    查看消耗cpu的sql
    select * from pg_stat_activity where pid=XX;
    或
    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>' and procpid=XX  ORDER BY lap DESC;
    
    查看锁,需要到对应的db里面执行
    select a.locktype,a.database,a.pid,a.mode,a.relation,b.relname
    from pg_locks a
    join pg_class b on a.relation = b.oid
    
    SELECT locker.pid,  
                pc.relname,  
                locker.mode,  
                locker_act.application_name,  
                least(query_start,xact_start) start_time,  
                locker_act.state,  
                CASE  
            WHEN granted='f' THEN  
            'wait_lock'  
            WHEN granted='t' THEN  
            'get_lock'  
            END lock_satus,current_timestamp - least(query_start,xact_start) AS runtime,  
            locker_act.query  
        FROM pg_locks locker,pg_stat_activity locker_act, pg_class pc  
        WHERE locker.pid=locker_act.pid  
                AND NOT locker.pid=pg_backend_pid()  
                AND application_name<>'pg_statsinfod'  
                AND locker.relation = pc.oid  
                AND pc.reltype<>0 --and pc.relname='t'
        ORDER BY  runtime desc;
    
    
    查看sql语句的执行计划
    explain analyze select XX
    
    
    
    ANALYZE schema_name.table_name会在表上加上ShareUpdateExclusiveLock锁,这个锁不堵塞读
    
    
    不用重启,直接加载配置文件的两种方法
    1、使用linux命令pg_ctl reload
    2、使用psql命令select pg_reload_conf();
    
    客户端连接数统计
    select client_addr,count(1) from pg_stat_activity  group by client_addr;
    
    查看活动会话
    select pid,usename,datname,query,client_addr from pg_stat_activity where pid<>pg_backend_pid() and state='active' order by query;
    
    查看等待事件
    select pid,usename,datname,query,client_addr,wait_event_type,wait_event from pg_stat_activity where pid<>pg_backend_pid() and wait_event is not null order by wait_event;
    
    查看哪些字段使用了timestamptz类型
    SELECT relname, attname FROM pg_class c,pg_attribute attr WHERE c.oid = attr.attrelid and attisdropped = 'f' and atttypid=1184 and relname !~ '^pg_';
    
    
    
    制作快捷方式
    编辑家目录下.psqlrc文件,格式如下:
    set short_command 'SQL;'
    --short_commad为自定义的快捷命令名称
    --SQL里的单引号需要转义
    --需要带分号
    
    使用方法
    DB=> :short_command
    
    
    查看配置文件信息
    select name,setting from pg_settings where category='File Locations';
    
    
    查看是否自动提交
    postgres=# echo :AUTOCOMMIT
    
    
    
    FDW的一些参考语句
    select * from pg_extension;
    select * from pg_foreign_data_wrapper;
    select * from pg_foreign_server;
    select * from pg_foreign_table;
    select * from pg_user_mappings;
    
    
    
    查询表的碎片率
    select n_dead_tup,(case when n_live_tup > 0 then n_dead_tup::float8/n_live_tup::float8 else 0 end) as "dead_tup/live_tup_pert" from pg_stat_all_tables
    
    检查autovacuum是否已对膨胀的表进行过处理
    SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum FROM pg_stat_all_tables
    ORDER BY n_dead_tup / (n_live_tup* current_setting('autovacuum_vacuum_scale_factor')::float8 + current_setting('autovacuum_vacuum_threshold')::float8)
    DESC LIMIT 10;
    
    
    
    查询哪些SQL语句消耗cpu
    ps aux | grep postgres | sort -n -r -k 3 | head -10
    select procpid, start, now()-start as last_time, 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 procpid IN (spid);
    
    
    
    
    
    
    
    
    
    
    检查堵塞
    select a.txn_owner, a.txn_db, a.xid, a.pid, a.txn_start, a.lock_mode, a.relation as table_id,nvl(trim(c."name"),d.relname) as tablename, a.granted,b.pid as blocking_pid ,datediff(s,a.txn_start,getdate())/86400||' days '||datediff(s,a.txn_start,getdate())%86400/3600||' hrs '||datediff(s,a.txn_start,getdate())%3600/60||' mins '||datediff(s,a.txn_start,getdate())%60||' secs' as txn_duration
    from svv_transactions a
    left join (select pid,relation,granted from pg_locks group by 1,2,3) b
    on a.relation=b.relation and a.granted='f' and b.granted='t'
    left join (select * from stv_tbl_perm where slice=0) c
    on a.relation=c.id
    left join pg_class d on a.relation=d.oid
    where  a.relation is not null;
    
    Analyze表
    select 'analyze '||schemaname||'.'||tablename||';' from pg_tables where schemaname not in ('pg_catalog','information_schema','dms_wam','public','admin');
    
    Vacuum表
    select 'vacuum '||schemaname||'.'||tablename||';' from pg_tables where schemaname not in ('pg_catalog','information_schema','dms_wam','public','admin');
    
    
    
    
    数据库尺寸函数
    
    名字    返回类型    描述
    pg_column_size(any)    int    存储一个指定的数值需要的字节数(可能压缩过)
    pg_database_size(oid)    bigint    指定 OID 代表的数据库使用的磁盘空间
    pg_database_size(name)    bigint    指定名称的数据库使用的磁盘空间
    pg_relation_size(oid)    bigint    指定 OID 代表的表或者索引所使用的磁盘空间
    pg_relation_size(text)    bigint    指定名称的表或者索引使用的磁盘空间。表名字可以用模式名修饰。
    pg_size_pretty(bigint)    text    把字节计算的尺寸转换成一个人类易读的尺寸。
    pg_tablespace_size(oid)    bigint    指定 OID 代表的表空间使用的磁盘空间
    pg_tablespace_size(name)    bigint    指定名字的表空间使用的磁盘空间
    pg_total_relation_size(oid)    bigint    指定 OID 代表的表使用的磁盘空间,包括索引和压缩数据。
    pg_total_relation_size(text)    bigint    指定名字的表所使用的全部磁盘空间,包括索引和压缩数据。表名字可以用模式名修饰。
    
    
    锁函数
    
    名字    返回类型    描述
    pg_advisory_lock(keybigint)    void    获取排它咨询锁
    pg_advisory_lock(key1int, key2 int)    void    获取排它咨询锁
    pg_advisory_lock_shared(keybigint)    void    获取共享咨询锁
    pg_advisory_lock_shared(key1int, key2 int)    void    获取共享咨询锁
    pg_try_advisory_lock(keybigint)    boolean    尝试获取排它咨询锁
    pg_try_advisory_lock(key1int, key2 int)    boolean    尝试获取排它咨询锁
    pg_try_advisory_lock_shared(keybigint)    boolean    尝试获取共享咨询锁
    pg_try_advisory_lock_shared(key1int, key2 int)    boolean    尝试获取共享咨询锁
    pg_advisory_unlock(keybigint)    boolean    释放排它咨询锁
    pg_advisory_unlock(key1int, key2 int)    boolean    释放排它咨询锁
    pg_advisory_unlock_shared(keybigint)    boolean    释放共享咨询锁
    pg_advisory_unlock_shared(key1int, key2 int)    boolean    释放共享咨询锁
    pg_advisory_unlock_all()    void    释放当前会话持有的所有咨询锁

    转:http://blog.itpub.net/30126024/viewspace-2655205/

    作者:tigergao
    功不唐捐 玉汝于成
  • 相关阅读:
    JSONP原理
    什么是跨域,如何解决
    工程化与模块化开
    vue双向数据绑定原理
    vuex原理
    BFC 原理
    http状态码 301、302区别
    用户页面打开很慢,有哪些优化方式?
    webpack打包
    Promise 原理
  • 原文地址:https://www.cnblogs.com/tigergaonotes/p/14563734.html
Copyright © 2020-2023  润新知