跳至內容

在藍色/綠色部署期間,我如何阻止 Amazon RDS for PostgreSQL 或 Aurora PostgreSQL 相容執行個體中的 DDL 作業?

2 分的閱讀內容
0

我想阻止 Amazon Relational Database Service (Amazon RDS) for PostgreSQL 或 Amazon Aurora (Aurora) PostgreSQL 相容版執行個體中的資料定義語言 (DDL) 作業。在具有邏輯複寫的藍/綠部署期間,DDL 作業會導致錯誤。

簡短描述

在具有邏輯複寫的藍/綠部署期間,當在 Amazon RDS for PostgreSQL 執行個體上執行 DDL 作業時,您會收到下列錯誤訊息:

「Data definition language (DDL) changes aren't supported...Your green databases now have a status of REPLICATION_DEGRADED.Delete and recreate your blue/green deployment and avoid future DDL changes...」(不支援資料定義語言 (DDL) 變更...您的綠色資料庫現在的狀態為 REPLICATION_DEGRADED。請刪除並重新建立您的藍/綠部署,並避免將來進行 DDL 變更...)

當您嘗試切換時,Amazon RDS 會阻止切換,並且您會收到以下錯誤訊息:

「Switchover from DB cluster to... was cancelled because there are DDL or Large Object changes on... that can't be replicated.Delete the blue/green deployment along with the target cluster, then re-create it.」(從資料庫叢集切換至...的作業已取消,因為在...上存在無法複寫的 DDL 或大型物件變更。請刪除藍/綠部署以及目標叢集,然後重新建立。)

在基於 RDS for PostgreSQL 的藍/綠部署中,執行 DDL 作業可能會降低環境之間的邏輯複寫,並需要完全重新部署。為防止此問題,您必須在藍/綠部署期間,在藍色資料庫上設定 PostgreSQL 事件觸發程序和觸發函式。

但是,您無法阻止以下 DDL 作業:

  • 針對共用物件 (例如資料庫、角色或資料表空間) 的命令
  • 針對事件觸發程序的命令
  • pg_largeobject 中的大型物件修改

**注意:**此問題只會在主要版本升級期間影響 RDS for PostgreSQL,此時 Amazon RDS 使用邏輯複寫而非實體複寫。原生 PostgreSQL 邏輯複寫的限制會限制邏輯複寫期間的 PostgreSQL 藍/綠部署。如需詳細資訊,請參閱 PostgreSQL 網站上的限制

解決方法

設定 PostgreSQL 事件觸發程序和觸發函式

在設定藍/綠部署之前,建立事件觸發程序和觸發函式。此外,您必須在每個需要 DDL 保護的資料庫中,單獨建立每個事件觸發程序和觸發函式,因為事件觸發程序會在資料庫層級運作。綠色環境預設繼承事件觸發程序和觸發程序函式。若要在綠色環境中執行 DDL 作業,請先刪除在藍色環境中建立的觸發程序和函式。

若要設定事件觸發程序和觸發函式,請完成下列步驟:

  1. 執行以下命令,以超級使用者登入資料庫:

    psql -U admin -h your_rds_endpoint -d your_database
  2. 執行以下命令建立 DDL 封鎖函式:

    CREATE OR REPLACE FUNCTION schema_name.block_ddl_bg() RETURNS event_trigger   
    SECURITY DEFINER  
    AS $$  
    DECLARE  
        -- Define allowed users and roles here  
        allowed_users TEXT[] := ARRAY['rdsadmin', 'rdsrepladmin'];  
        allowed_roles TEXT[] := ARRAY['rdsrepladmin'];  
    BEGIN  
        -- Check if either the session user or current role is allowed  
        IF NOT (session_user = ANY(allowed_users) OR current_role = ANY(allowed_roles)) THEN  
            RAISE EXCEPTION 'DDL operations are blocked to prevent Blue Green Deployment replica degradation. User: %, Role: %, Status: BLOCKED',   
                session_user, current_role;  
        END IF;  
    END;  
    $$ LANGUAGE plpgsql;

    **注意:**在上述命令中,將 schema_name 替換為您的結構描述。

  3. 執行以下命令來建立事件觸發程序:

    CREATE EVENT TRIGGER block_ddl_trigger   
        ON ddl_command_start  
        EXECUTE FUNCTION schema_name.block_ddl_bg();

    **注意:**在上述命令中,將 schema_name 替換為您的結構描述。

  4. 執行以下命令來確認觸發程序的實作:

    -- Check if the function exists  
    SELECT proname, pronamespace::regnamespace   
    FROM pg_proc   
    WHERE proname = 'block_ddl_bg';  
    
    -- Check if the event trigger exists  
    SELECT evtname, evtevent, evtowner::regrole   
    FROM pg_event_trigger   
    WHERE evtname = 'block_ddl_trigger';
  5. 執行以下命令來測試觸發程序:

    -- Try to create a test table  
    CREATE TABLE test_table (id int);  
    -- Should receive blocking message

移除事件觸發程序和觸發函式

完成藍/綠部署轉換或停用藍/綠部署後,執行以下命令。

移除事件觸發程序:

-- Remove event trigger  
DROP EVENT TRIGGER block_ddl_trigger;

移除觸發函式:

-- Remove trigger function  
DROP FUNCTION schema_name.block_ddl_bg();

**注意:**在上述命令中,將 schema_name 替換為您的結構描述。

相關資訊

PostgreSQL 網站上的事件觸發程序

PostgreSQL 網站上的事件觸發程序觸發矩陣

Aurora PostgreSQL 對藍/綠部署的限制

RDS for PostgreSQL 對具有邏輯複寫的藍綠部署限制

AWS 官方已更新 1 年前