1. 程式人生 > >Greenplum upgrade from 4.3.4.1 to 4.3.30.0 準備工作

Greenplum upgrade from 4.3.4.1 to 4.3.30.0 準備工作

升級前的準備工作

1.保證升級可以回滾

2.按官方文件提示的升級相關檢視,修改相關引數

第一步首先保證greenplum 4.3.4.1的安裝目錄檔案不做任何變動,我的目錄為/opt/greenplum-db-4.3.4.1

第二步由於我是從4.3.4.1升級到4.3.30.0,所以只升級相關檢視,修改引數即可

1.修改引數

gpconfig -c gp_interconnect_type -v UDPIFC -m UDPIFC 如果之前是UDP一定要修改為UDPIFC,否則節點之間無法通訊

2.升級檢視gp_toolkit.gp_bloat_expected_pages

因為有可能在分割槽表中,主表即使沒有資料,也會報告主分割槽表膨脹,而導致主表也進行vacuum full.
檢視檢視定義
\d+ gp_toolkit.gp_bloat_expected_pages
更新的檢視新增了以下謂詞
AND NOT EXISTS
( SELECT parrelid
     FROM pg_partition
     WHERE parrelid = pgc.oid )

升級gp_toolkit.gp_bloat_expected_pages 
1.在master複製指令碼到文字檔案
2.在master每一個庫執行文字檔案,這裡假設複製到了gp_bloat_expected_pages.sql檔案中,在mytest庫執行
psql -f /home/gpadmin/gp_bloat_expected_pages.sql -d mytest

gp_bloat_expected_pages.sql指令碼內容如下:
BEGIN;
CREATE OR REPLACE VIEW gp_toolkit.gp_bloat_expected_pages
AS
    SELECT
      btdrelid,
      btdrelpages,
       CASE WHEN btdexppages < numsegments
          THEN numsegments
          ELSE btdexppages
        END as btdexppages
    FROM
    ( SELECT
        oid as btdrelid,
        pgc.relpages as btdrelpages,
        CEIL((pgc.reltuples * (25 + width))::numeric / current_setting('block_size')::numeric) AS btdexppages,
        (SELECT numsegments FROM gp_toolkit.__gp_number_of_segments) AS numsegments
        FROM
        ( SELECT pgc.oid, pgc.reltuples, pgc.relpages
            FROM pg_class pgc
            WHERE NOT EXISTS
            ( SELECT iaooid
                FROM gp_toolkit.__gp_is_append_only
                WHERE iaooid = pgc.oid AND iaotype = 't' )
            AND NOT EXISTS
            ( SELECT parrelid
                FROM pg_partition
                WHERE parrelid = pgc.oid )) AS pgc
        LEFT OUTER JOIN
          ( SELECT  starelid, SUM(stawidth * (1.0 - stanullfrac)) AS width
              FROM pg_statistic pgs
              GROUP BY 1) AS btwcols
        ON pgc.oid = btwcols.starelid
        WHERE starelid IS NOT NULL) AS subq;

GRANT SELECT ON TABLE gp_toolkit.gp_bloat_expected_pages TO public;
COMMIT;

3.升級檢視gp_toolkit.gp_bloat_diag

檢查是否需要更新,這裡顯示btdexppages integer,所以需要更新,如果是numeric則不需要
\df gp_toolkit.gp_bloat_diag
List of functions
-[ RECORD 1 ]-------+------------------------------------------------------------------------------------------------
Schema              | gp_toolkit
Name                | gp_bloat_diag
Result data type    | record
Argument data types | btdrelpages integer, btdexppages integer, aotable boolean, OUT bltidx integer, OUT bltdiag text
Type                | normal

1.拷貝檔案到一個文字檔案
2.在每個資料庫執行該指令碼檔案
注意在GP低負載的時候做相關操作,雖然不影響功能使用,但是有可能會影響效能

指令碼程式碼如下:
BEGIN;
CREATE OR REPLACE FUNCTION gp_toolkit.gp_bloat_diag(btdrelpages int, btdexppages numeric, aotable bool,
    OUT bltidx int, OUT bltdiag text)
AS
$$
    SELECT
        bloatidx,
        CASE
            WHEN bloatidx = 0
                THEN 'no bloat detected'::text
            WHEN bloatidx = 1
                THEN 'moderate amount of bloat suspected'::text
            WHEN bloatidx = 2
                THEN 'significant amount of bloat suspected'::text
            WHEN bloatidx = -1
                THEN 'diagnosis inconclusive or no bloat suspected'::text
        END AS bloatdiag
    FROM
    (
        SELECT
            CASE
                WHEN $3 = 't' THEN 0
                WHEN $1 < 10 AND $2 = 0 THEN -1
                WHEN $2 = 0 THEN 2
                WHEN $1 < $2 THEN 0
                WHEN ($1/$2)::numeric > 10 THEN 2
                WHEN ($1/$2)::numeric > 3 THEN 1
                ELSE -1
            END AS bloatidx
    ) AS bloatmapping

$$
LANGUAGE SQL READS SQL DATA;

GRANT EXECUTE ON FUNCTION gp_toolkit.gp_bloat_diag(int, numeric, bool, OUT int, OUT text) TO public;

CREATE OR REPLACE VIEW gp_toolkit.gp_bloat_diag
AS
    SELECT
        btdrelid AS bdirelid,
        fnnspname AS bdinspname,
        fnrelname AS bdirelname,
        btdrelpages AS bdirelpages,
        btdexppages AS bdiexppages,
        bltdiag(bd) AS bdidiag
    FROM
    (
        SELECT
            fn.*, beg.*,
            gp_toolkit.gp_bloat_diag(btdrelpages::int, btdexppages::numeric, iao.iaotype::bool) AS bd
        FROM
            gp_toolkit.gp_bloat_expected_pages beg,
            pg_catalog.pg_class pgc,
            gp_toolkit.__gp_fullname fn,
            gp_toolkit.__gp_is_append_only iao

        WHERE beg.btdrelid = pgc.oid
            AND pgc.oid = fn.fnoid
            AND iao.iaooid = pgc.oid
    ) as bloatsummary
    WHERE bltidx(bd) > 0;

GRANT SELECT ON TABLE gp_toolkit.gp_bloat_diag TO public;
COMMIT;

參考: