GP DBA基本操做

一、查看隊列狀況sql

SELECT * FROM gp_toolkit.gp_resqueue_status;

若是出現了資源佔用大於1.1 e+11SQL,則可能存在不合理執行計劃的SQL, 基本跑不出來, 庫也會很卡。數據庫

二、查看用戶歸屬的隊列ssh

select * from gp_toolkit.gp_resq_role ;
 
三、查看某帳號下運行中sql
SELECT * from pg_stat_activity  where current_query <> '<IDLE>' and waiting ='f' and usename = 'etl_user';
全部帳號都有權限查看。
Query_start字段就是SQL真正啓動時間點
 
四、等待中sql
SELECT * from pg_stat_activity  where current_query <> '<IDLE>' and waiting ='t';
 
五、檢查執行時間超長的SQL
執行以下SQL 檢查是否有select  * from pg_stat_activity where current_query<>'<IDLE>' and query_start < now() - interval '10 mins';
 
六、終止sql
----終止sql的語句, 下語句的數字是procid,能夠經過上一頁的語句查到:
      select pg_cancel_backend(27334);
-----終止sql的同時終止會話。
      select pg_terminate_backend(27334);
超級帳號纔有終止權限, 如:super_user帳號
      必定要在數據庫裏終止一個SQL或任務, 由於在BDI界面終止一個外部程序任務事實上SQL沒有終止,還繼續運行。
 
七、執行計劃:explain  SQL
     執行SQL前用explain  SQL 查看執行計劃
    若是執行計劃存在針對很大的表作Broadcast Motion 或Nested Loop步驟則 不合理, 則嘗試如下動做:
    執行收集表的統計信息語句:ANALYZE 表名; 
     通常analyze 一天的分區: ANALYZE 表名_1_prt_data_part_20150305;
     「_1_prt_」是數據庫分區表名固定段。 「data_part_」是咱們自動腳本里生成的分區名前綴。
      從新看執行計劃,若是合理了,則表明源表缺乏統計信息致使執行計劃不合理。 只有在表的數據量發生大變化時或重來沒收集過期須要作一次收集。
 
八、執行計劃:explain  SQL
    ANALYZE完源表從新看執行計劃,若是還不合理,執行一下set optimizer to on;  更換一個執行計劃生成器。
    從新生成執行計劃。若是合理了,則後續在在SQL前加上:set optimizer to on;  不要全部SQL加這個,由於該特性未發佈。
    若是還不合理, 則須要優化SQL, 即把SQL由多張表關聯拆開。
 
九、後臺運行SQL, 免輸入密碼
    nohup psql -h 10.154.147.130 -d 'dbname=gpadmin user=etl_user password=etl_pppp' -f /home/bdiunivers/aa.sql -L /home/bdiunivers/aa.log &
   用psql 命令跑aa.sql文件,若是文件裏有多個SQL, 想一個SQL報錯後不往下跑, 則在aa.sql 文件的第一行加上下面內容, 行末沒有分號       \set ON_ERROR_STOP
 
十、報內存不足
    sql可用內存不夠大時,能夠用如下方法臨時加大。 如選擇的表分區數不少可能會報內存不足,可使用該方法。例如:
    SET statement_mem='500MB';
    SELECT * FROM my_big_table WHERE column='value' ORDER BY id limit 10;
    RESET statement_mem;
 
十一、left  join 右表很是龐大
      若是之後業務場景中確實存在left join 右表很是龐大,而且關聯字段重複值比較高,能夠採起如下方式:
         1,按照關聯字段進行數據打散
         2,在會話級別設置如下參數
              set max_statement_mem='8GB'
              set statement_mem='4GB'
              set gp_workfile_per_query=0
 
十二、使用super_user建立外部表的過程:

a. 刪除並重建err表。oop

  drop table if exists  masadw .err_ext_表名;優化

  CREATE TABLE masadw.err_ext_表名 (    cmdtime timestamp with time zone,    relname text,    filename text,    linenum integer,    bytenum integer,    errmsg text,    rawdata text,    rawbytes bytea) DISTRIBUTED RANDOMLY;code

b.把err表修改owner爲etl_user隊列

  ALTER TABLE masadw.err_ext_表名 OWNER TO etl_user;內存

c. 建立外部表:ci

  drop EXTERNAL TABLE if exists masadw.ext_表名;資源

  CREATE EXTERNAL TABLE masadw.ext_表名 (    time_id integer,    area_id integer,    grp_code character varying(50),    cust_id bigint,    usr_id bigint,    svc_code character varying(50)) LOCATION (    'gphdfs://hacluster/tmp/zht/NEW_表名.TXT') FORMAT 'text' (delimiter E'' null E'' escape E'OFF')ENCODING 'UTF8'LOG ERRORS INTO masadw.err_ext_表名 SEGMENT REJECT LIMIT 10 PERCENT;

d.把外部表修改owner爲etl_user:

  ALTER EXTERNAL TABLE masadw.ext_表名 OWNER TO etl_user;

 
 1三、不要建立default分區
       不要建立default分區, 更不要把大量數據放到default分區, 由於default分區在每一個sql都會掃描。
 
1四、找出須要作vacuum的表
        select * from gp_toolkit.gp_bloat_diag ;
        這些表須要作空間回收操做
        通常vacumm 和analyze一塊兒執行: vacuum analyze 表名
 
1五、找出沒有統計信息須要作ANALYZE的表
    select 'ANALYZE '||smischema||'.'||smitable||';' from gp_toolkit.gp_stats_missing where smisize = 'f' and smitable like '%_1_prt_%' and smitable not like 'err_%' and  smitable not like 'ext_%' and smitable like '%201503%' order by smitable limit 10;
      全部存儲過程在最後增長GPDB. analyze_partition(表名, 日期)收集一個分區表信息。
 
1六、常常檢查數據庫狀態   gpstate -e
 
1七、常常用nmon命令檢查seg節點資源佔用率
 
1八、常常檢查各機器/data目錄 gpssh -f allhosts
 
1九、常常檢查各模式下表數量,總共不要超過10萬 
select schemaname,count(*) from gp_tables group by schemaname order by 2 desc
相關文章
相關標籤/搜索