1. 程式人生 > >greenplum(四)greenplum 常用資料庫管理語句,sql工具

greenplum(四)greenplum 常用資料庫管理語句,sql工具

在greenplum 使用過程中積累的一些常用查詢語句,整理出來備忘。歡迎各位留言補充。都是SQL命令以及資料字典的使用。熟悉資料字典非常重要。三個重要的schema:pg_catalog,pg_toolkit,information_schema,其中information_schema 中的資料字典都在檢視中,並且這個schema中提供了大量的操作資料字典的函式值得研究。

一 資料庫執行狀態查詢管理

1. greenplum查詢正在執行的sql,session

-- 方法1:
SELECT
    tt.procpid,  -- pid
    usename user_name, -- 執行的使用者
    backend_start,  -- 會話開始時間
    query_start, -- 查詢開始時間
    waiting,  -- 是否等待執行
    now() - query_start AS current_query_time, -- 累計執行時間
  now() - backend_start AS current_session_time,*/
    current_query,
    client_addr , datname
FROM
    pg_stat_activity tt
 WHERE      current_query != '<IDLE>'
ORDER BY current_query_time DESC;


-- 方法2(通過檢視查)
SELECT
    procpid,
  START,
  now()   - START AS lap,
    current_query,
  -- count() over() count_num,
  t2.rolname,t3.rsqname,
  ip
FROM
    (
        SELECT
            backendid,
      pg_stat_get_backend_userid(S.backendid) as uid,
      pg_stat_get_backend_client_addr(S.backendid) as ip,
            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 t1 left join pg_authid  t2 on t1.uid=t2.oid
    left join pg_resqueue t3 on t2.rolresqueue=t3.oid
WHERE
    current_query!= '<IDLE>'
ORDER BY lap DESC;

-- 方法3(限定了角色和資源佇列,查當前賬號正在查詢的語句)
SELECT
    rolname,
    rsqname,
    pid,
    GRANTED,
    current_query,
    datname
FROM
    pg_roles  t1,
    gp_toolkit.gp_resqueue_status t2 ,
    pg_locks t3 ,
    pg_stat_activity t4
WHERE
    t1.rolresqueue = t3.objid
AND t3.objid=t2.queueid
and t4.procpid=t3.pid


2.終止執行的sql

select pg_terminate_backend(48988); --pid

3.檢視greemplum資源佇列狀態

SELECT * FROM gp_toolkit.gp_resqueue_status;

4. 檢視greemplum資源佇列鎖

SELECT * FROM gp_toolkit.gp_locks_on_resqueue WHERE lorwaiting='true';

5.檢視greemplum資源佇列優先順序

select *  from gp_toolkit.gp_resq_priority_statement;

6. 檢視greemplum所有連線 類似mysql SHOW PROCESSLIST

select * from pg_stat_activity; -- 所有狀態的連線

7.greemplum磁碟使用,通過SQL檢視Greenplum中用了多少空間

select datname,pg_size_pretty(pg_database_size(datname)) from pg_database;  

8.檢視greemplum節點狀態

select * from gp_segment_configuration tt
select * from gp_segment_configuration tt where tt.status='d'; -- 狀態為down

9. 節點故障等歷史資訊

select * from gp_configuration_history tt order by 1 desc ;

10.資料傾斜

SELECT
    t1.gp_segment_id,
    t1.count_tatol,
    round(t1.count_tatol-(AVG(t1.count_tatol)  over()) ,0)
FROM
    (
        SELECT
            gp_segment_id,
            COUNT (*) count_tatol
        FROM
           <tablename>  -- 要查的表
        GROUP BY
            gp_segment_id
    ) t1
order by 3

11.greemplum表或索引大小 (佔用空間)

select pg_size_pretty(pg_relation_size('gp_test'));

12.greemplum表和索引大小(佔用空間)

select pg_size_pretty(pg_total_relation_size('gp_test'));

13.greemplum檢視指定資料庫大小(佔用空間)

select pg_size_pretty(pg_database_size('postgres'));

14.greemplum所有資料庫大小(佔用空間)

select datname,pg_size_pretty(pg_database_size(datname)) from pg_database;

15.檢視greemplum資料分佈情況

select gp_segment_id,count(*) from gp_test group by gp_segment_id order by 1;

二 查源資料

16.檢視greemplum資料表更新時間

SELECT
    *
FROM
    pg_stat_last_operation,
    pg_class
WHERE
    objid = oid
AND relname = 'base_common'; -- 表名

17.通過sql 獲取greemplum表的預估資料量

select
    relname,
    reltuples::int as total
from
    pg_class
where
    relname = 'base_common'
    and relnamespace = (select oid from pg_namespace where nspname = 'positions');

18.通過sql 獲取greemplum獲取分佈鍵

 SELECT string_agg(att.attname,',' order by attrnums) as distribution
        FROM gp_distribution_policy a,pg_attribute att
        WHERE a.localoid ='bi_data.schoolmate_relations'::regclass
      and a.localoid = att.attrelid
      and att.attnum = any(a.attrnums);

19. 通過sql獲取 greemplum指定表結構

 SELECT   
         attname, typname
     FROM
           pg_attribute
           INNER JOIN pg_class  ON pg_attribute.attrelid = pg_class.oid
           INNER JOIN pg_type   ON pg_attribute.atttypid = pg_type.oid
           INNER JOIN pg_namespace on pg_class.relnamespace=pg_namespace.oid  --
     WHERE
           pg_attribute.attnum > 0
       AND attisdropped <> 't'
       AND pg_namespace.nspname='resumes'
       AND pg_class.relname= 'base_common'
--     and pg_class.relname ~~* any(array['%some%', '%someelse']));
order by  pg_attribute.attnum

同時可以參考:

【greenplum】greenplum 資料字典實踐--通過sql指令碼查詢表結構,拼裝建表語句

【greenplum】 獲取表結構,實現類似mysql show create table 功能

20.顯示哪些沒有統計資訊且可能需要ANALYZE的表

SELECT * from gp_toolkit.gp_stats_missing ;

21.  顯示在系統表中被標記為掉線的Segment的資訊

SELECT * from gp_toolkit.gp_pgdatabase_invalid;

22. 顯示庫中表的大小(單位G)

SELECT sotdoid,sotdsize/1024/1024/1024 as sotdsize,sotdtoastsize,sotdadditionalsize,sotdschemaname,sotdtablename from gp_toolkit.gp_size_of_table_disk order by sotdsize desc;

23.  查詢一個庫中有多少表(如果有分割槽表不列出子分割槽)

SELECT relname from pg_class a,pg_namespace b where relname not like '%prt%' and relkind ='r'  and a.relnamespace=b.oid and nspname not in ('pg_catalog','information_schema','gp_toolkit') and nspname not like '%pg_temp%';

24. 查詢某個使用者對某個表有什麼許可權

select * from INFORMATION_SCHEMA.role_table_grants where grantee='user_name' and table_name='table';

25. 檢視分割槽表的資訊

SELECT tablename,partitiontablename,partitiontype,partitionboundary from pg_partitions where tablename='table_name' order by partitionboundary desc;

26. 匯入資料

copy t1 from '/home/gpadmin/t1.txt' with delimiter '|' LOG ERRORS INTO INSERT_ERRS SEGMENT REJECT LIMIT 100;

27. 遠端匯入資料

psql -h 1.1.1.1  -U user_name -d db_name -W -c "copy tb1 from stdin with delimiter '|'" < /home/gpadmin/tb1.txt

28. 導資料指定分隔符(和mysql的select into outfile很像)

psql -d db_name -c "select * from tb1" -o tb1.txt -t -A -F $'\t'

29. 生成授權語句

SELECT 'grant select on '||relname||' to user_name;' from pg_class a,pg_namespace b where relname not like '%prt%' and relkind ='r' and has_table_privilege('user_name',a.oid,'select')='f' and a.relnamespace=b.oid and nspname not in ('pg_catalog','information_schema','gp_toolkit') and nspname not like '%pg_temp%';

30 .給使用者授權

select 'grant all on SCHEMA ' || tt.autnspname ||  ' to tuser;' as grant_script from gp_toolkit.__gp_user_tables tt -- group by  tt.autnspname
union -- all
select 'grant all on table ' || tt.autnspname || '.' ||tt.autrelname || ' to tuser;' grant_script from gp_toolkit.__gp_user_tables tt;