greenplum(四)greenplum 常用資料庫管理語句,sql工具
阿新 • • 發佈:2019-02-13
在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;