Come posso impedire operazioni DDL nelle mie istanze Amazon RDS per PostgreSQL o Aurora compatibile con PostgreSQL durante le implementazioni blu/verdi?
Desidero impedire operazioni DDL (Data Definition Language) nelle mie istanze Amazon Relational Database Service (Amazon RDS) per PostgreSQL o Amazon Aurora (Aurora) compatibile con PostgreSQL. Le operazioni DDL causano errori durante un'implementazione blu/verde con replica logica.
Breve descrizione
Quando un'operazione DDL viene eseguita sull'istanza Amazon RDS per PostgreSQL durante un'implementazione blu/verde con replica logica, ricevi il seguente messaggio di errore:
"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..."
Quando tenti di effettuare uno switchover, Amazon RDS lo blocca e ricevi il seguente messaggio di errore:
"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."
Le operazioni DDL in RDS per le implementazioni blu/verdi basate su PostgreSQL possono degradare la replica logica tra ambienti e richiedere una ridistribuzione completa. Per evitare il problema, devi configurare i trigger di eventi e le funzioni di attivazione di PostgreSQL sul database blu durante le implementazioni blu/verdi.
Tuttavia, non puoi impedire le seguenti operazioni DDL:
- Comandi destinati a oggetti condivisi, come database, ruoli o tablespace
- Comandi mirati a trigger di eventi
- Modifiche a oggetti di grandi dimensioni in pg_largeobject
Nota: il problema riguarda RDS per PostgreSQL solo durante gli aggiornamenti, delle versioni principali, quando Amazon RDS utilizza la replica logica anziché la replica fisica. Le restrizioni con la replica logica nativa di PostgreSQL limitano le implementazioni blu/verdi di PostgreSQL durante la replica logica. Per ulteriori informazioni, consulta Restrictions (Restrizioni) sul sito web PostgreSQL.
Risoluzione
Configura trigger di eventi e funzioni di attivazione in PostgreSQL
Crea trigger di eventi e funzioni di attivazione prima di configurare un'implementazione blu/verde. Inoltre, devi creare ogni trigger di eventi e ogni funzione di attivazione separatamente in ogni database che richiede la protezione DDL poiché i trigger di eventi funzionano a livello di database. L'ambiente verde eredita i trigger di eventi e il trigger funziona per impostazione predefinita. Per eseguire operazioni DDL nell'ambiente verde, rilascia prima i trigger e le funzioni che hai creato nell'ambiente blu.
Per configurare i trigger di eventi e le funzioni di attivazione, completa i seguenti passaggi:
-
Esegui questo comando per accedere al database come superutente:
psql -U admin -h your_rds_endpoint -d your_database -
Esegui questo comando per creare la funzione di blocco 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;Nota: nel comando precedente, sostituisci schema_name con il tuo schema.
-
Esegui questo comando per creare il trigger di eventi:
CREATE EVENT TRIGGER block_ddl_trigger ON ddl_command_start EXECUTE FUNCTION schema_name.block_ddl_bg();Nota: nel comando precedente, sostituisci schema_name con il tuo schema.
-
Esegui questo comando per verificare l'implementazione del trigger:
-- 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'; -
Esegui questo comando per testare i trigger:
-- Try to create a test table CREATE TABLE test_table (id int); -- Should receive blocking message
Rimuovi il trigger di eventi e la funzione di attivazione
Dopo aver completato il passaggio all'implementazione blu/verde o averla disattivata, esegui questo comando.
Rimuovi il trigger di eventi:
-- Remove event trigger DROP EVENT TRIGGER block_ddl_trigger;
Rimuovi la funzione di attivazione:
-- Remove trigger function DROP FUNCTION schema_name.block_ddl_bg();
Nota: nel comando precedente, sostituisci schema_name con il tuo schema.
Informazioni correlate
Event triggers (Trigger di eventi) sul sito web PostgreSQL
Event trigger firing matrix (Matrice di attivazione dei trigger di eventi) sul sito web PostgreSQL
Limitazioni di Aurora MySQL per MySQL per implementazioni blu/verdi
Limitazioni di RDS per PostgreSQL per implementazioni blu/green con replica logica
- Argomenti
- Database
- Lingua
- Italiano
