PostgreSQL Antipatterns: sui faʻamaumauga e ala i le faʻaosoina

Ise taimi mulimuli ane, e tele tagata o loʻo feagai ma le manaʻoga e faʻasaʻo tele se mea i faʻamaumauga o laulau. ua uma ona ou ta'u mai ia te a'u le auala e fai lelei ai, ma faʻafefea - e sili atu le aua le faia. O le asō o le a ou talanoa e uiga i le vaega lona lua o le faʻafouina tele - e uiga i fa'aoso.

Mo se faʻataʻitaʻiga, i luga o se laulau e te manaʻomia e faʻasaʻo ai se mea, o loʻo i ai se mea leaga ON UPDATE, fa'aliliu uma suiga i nisi fa'apotopotoga. Ma e tatau ona e faʻafouina mea uma (amataina se fanua fou, mo se faʻataʻitaʻiga) ma le faʻaeteete ina ia le aʻafia nei iunite.

Sei o tatou tape na o mea fa'aoso!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- тут долго-долго
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

O le mea moni, pau lava lena- ua uma ona tautau mea uma.

Talu ai ALTER TABLE fa'atupu AccessExclusive-o se loka i lalo e leai se tasi e tamoe tutusa, e oo lava i se tasi faigofie SELECT, o le a le mafai ona faitau se mea mai le laulau. O lona uiga, seʻia maeʻa lenei fefaʻatauaiga, o tagata uma e manaʻo e "naʻo le faitau" o le a faʻatali. Ma tatou te manatua lena mea UPDATE ua leva ona tatou...

Tatou tape vave, ona ki loa lea!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;

UPDATE ...;

BEGIN;
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

O lea ua sili atu le tulaga, o le taimi faʻatali e matua itiiti lava. Ae na o le lua faafitauli e faaleagaina uma ai le matagofie:

  • ALTER TABLE o ia lava e faʻatali mo isi gaioiga uma i luga o le laulau, e aofia ai ma umi SELECT
  • A'o pe le fa'aoso, so'o se suiga o le a "felelei atu" i le laulau, e oo lava ia i tatou. Ma o le a le oʻo i totonu o iunite, e ui lava e tatau. Fa'alavelave!

Puleaina o Feauaiga o le Sauniga

O lea la, i le lomiga talu ai na matou maua ai se mea taua - e tatau ona tatou aʻoaʻoina le faʻaoso e iloagofie ai "a tatou" suiga i le laulau mai le "e le o tatou". “O matou” ua misia e pei ona i ai, ae “e le o tatou” e faaosoina. Mo lenei mea e mafai ona e faʻaaogaina fesuiaiga o sauniga.

session_replication_role

Faitauga tusi lesona:

E a'afia fo'i le masini fa'aoso i le fetuutuuna'iga o fa'atulagaga session_replication_role. A fa'agaoioia e aunoa ma nisi fa'atonuga (fa'aletonu), o le a mu fa'aoso pe a fai o le fa'asologa o le matafaioi o le "a'a'aga" (fa'aletonu) po'o le "lotoifale". Fa'aosoina fa'atonuga ENABLE REPLICA, e na'o le aoga pe a faiga o sauniga o iai nei - "fa'atusa", ma fa'aoso e mafai ona fa'amaoti ENABLE ALWAYS, o le a fa'aosoina e tusa lava po'o le a le faiga o lo'o iai nei.

Ou te fia faamamafa faapitoa atu o le faatulagaga e le faatatau i tagata uma i le taimi e tasi, e pei o ALTER TABLE, ae na'o la tatou sootaga fa'apitoa. I le aofaʻi, ina ia leai se faʻaosoina talosaga e faʻaosoina:

SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние

Tulaga i totonu o se fa'aoso

Ae o le filifiliga o loʻo i luga e aoga mo faʻalavelave uma i le taimi e tasi (pe e te manaʻomia le "suia" i luma o faʻaoso e te le manaʻo e faʻamalo). Ma afai tatou te manaomia "tapē" se tasi fa'aoso fa'apitoa?

O le a fesoasoani lea ia i tatou "tagata fa'aoga" fesuiaiga o le sauniga:

O igoa fa'aopoopo fa'aopoopo o lo'o tusia fa'apea: igoa fa'aopoopo, togi, ona fa'aigoa ai lea o le igoa fa'amau, e tutusa ma igoa fa'apitoa i SQL. Mo se fa'ata'ita'iga: plpgsql.variable_conflict.
Talu ai o filifiliga e le o ni faiga e mafai ona seti i faiga e le faʻapipiʻiina ai le faʻaopoopoga faʻaopoopoga tutusa, e talia e PostgreSQL tau mo soʻo se igoa e lua vaega.

Muamua tatou te suia le faʻaoso, pei o lenei:

BEGIN
    -- процессу конвертации можно делать все
    IF current_setting('mycfg.my_table_convert_process') = 'TRUE' THEN
        IF TG_OP IN ('INSERT', 'UPDATE') THEN
            RETURN NEW;
        ELSE
            RETURN OLD;
        END IF;
    END IF;
...

I le ala, e mafai ona faia lenei mea "ola", e aunoa ma le poloka, ala CREATE OR REPLACE mo le galuega fa'aoso. Ona sosoo ai lea ma le fesoʻotaʻiga faʻapitoa matou te setiina "la matou" fesuiaiga:


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние

E te iloa isi auala? Fa'asoa i fa'amatalaga.

puna: www.habr.com

Faʻatau talimalo faʻatuatuaina mo nofoaga ma DDoS puipuiga, VPS VDS servers 🔥 Fa'atau le 'upega tafa'ilagi talimalo fa'atuatuaina ma le puipuiga DDoS, 'au'aunaga VPS VDS | ProHoster