4 Auditlog tabulas sagatavošana sadalīšanai nodalījumos

Pārskats

Dažām datubāzēm (piemēram, MySQL) ir nepieciešams, lai particionēšanas kolonna būtu daļa no tabulas unikālā ierobežojuma. Tādēļ, lai particionētu auditlog tabulu pēc laika, primārā atslēga ir jāmaina no auditid uz salikto atslēgu auditid + clock.

Šajā sadaļā ir sniegti norādījumi, kā mainīt auditlog tabulas primāro atslēgu.

Šajā lapā sniegtie norādījumi ir paredzēti pieredzējušiem lietotājiem. Ņemiet vērā, ka šie norādījumi var būt jāpielāgo jūsu konkrētajai konfigurācijai. Primārās atslēgas maiņa var arī nebūt saderīga ar turpmākajiem jaunināšanas ielāpiem, tāpēc var būt nepieciešama turpmāko jauninājumu manuāla apstrāde.

Primārās atslēgas maiņa var būt resursietilpīga darbība, kas atkarībā no auditlog tabulas lieluma var aizņemt daudz laika. Ieteicams uz izmaiņu veikšanas laiku apturēt Zabbix serveris un pārslēgt Zabbix lietotāja saskarne apkopes režīmā. Tomēr, ja tas ir absolūti nepieciešams, ir veids, kā mainīt primāro atslēgu bez dīkstāves (skatiet tālāk).

auditlog tabulas sadalīšana particijās var uzlabot, piemēram, novecojušo datu tīrīšanu lielās vidēs. Lai gan Zabbix novecojušo datu tīrīšana pašlaik nevar izmantot particionētu tabulu priekšrocības (izņemot TimescaleDB), varat atspējot Zabbix novecojušo datu tīrīšanu un dzēst particijas, izmantojot skriptus.

Sākot ar Zabbix 7.0, TimescaleDB auditlog tabula ir pārveidota par hipertabulu, kas ļauj novecojušo datu tīrīšanas procesam dzēst datus pa gabaliem. Lai jauninātu esošo auditlog tabulu uz hipertabulu, skatiet TimescaleDB shēmas jaunināšana.

MySQL

Svarīgas piezīmes par indeksu pārbūvi

MySQL automātiski pārbūvē primārās atslēgas indeksus ALTER TABLE darbības laikā. Tomēr ir ļoti ieteicams arī manuāli pārbūvēt indeksus, izmantojot OPTIMIZE TABLE priekšrakstu, lai nodrošinātu optimālu datubāzes veiktspēju.

Indeksu pārbūvei īslaicīgi var būt nepieciešams tikpat daudz papildu diska vietas, cik izmanto pati tabula. Lai iegūtu pašreizējo datu un indeksu lielumu, varat izpildīt šādus priekšrakstus:

ANALYZE TABLE auditlog;
SHOW TABLE STATUS LIKE 'auditlog';

Ja pieejamā diska vieta rada bažas, ievērojiet norādījumus sadaļā Primārās atslēgas maiņa bez dīkstāves. Ir pieejamas arī citas iespējas:

  • MySQL parametra sort_buffer_size palielināšana var palīdzēt samazināt diska vietas izmantošanu, manuāli pārbūvējot indeksus. Tomēr šī mainīgā modificēšana var ietekmēt kopējo datubāzes atmiņas izmantošanu.
  • Apsveriet iespēju atbrīvot vietu, dzēšot potenciāli nevajadzīgus datus.
  • Apsveriet iespēju samazināt housekeeper parametru Datu glabāšanas periods pirms housekeeper izpildes.
Primārās atslēgas mainīšana ar dīkstāvi

1. Noņemiet pašreizējo auditlog tabulas primāro atslēgu un pievienojiet jauno primāro atslēgu.

ALTER TABLE auditlog DROP PRIMARY KEY, ADD PRIMARY KEY (auditid, clock);

2. Pārbūvējiet indeksus (neobligāti, bet ļoti ieteicams; skatiet Svarīgas piezīmes par indeksu pārbūvēšanu).

OPTIMIZE TABLE auditlog;
Primārās atslēgas maiņa bez dīkstāves

Šeit ir aprakstīta primārās atslēgas manuāla maiņas metode. Alternatīvi varat izmantot Percona pt-online-schema-change rīkkopu. Šī rīkkopa automātiski veic tālāk norādītās darbības, vienlaikus samazinot auditlog tabulas pārveidošanai izmantotās vietas apjomu.

1. Izveidojiet jaunu tabulu ar jauno primāro atslēgu un izveidojiet indeksus.

CREATE TABLE `auditlog_new` (
  `auditid`            varchar(25)                               NOT NULL,
  `userid`             bigint unsigned                           NULL,
  `username`           varchar(100)    DEFAULT ''                NOT NULL,
  `clock`              integer         DEFAULT '0'               NOT NULL,
  `ip`                 varchar(39)     DEFAULT ''                NOT NULL,
  `action`             integer         DEFAULT '0'               NOT NULL,
  `resourcetype`       integer         DEFAULT '0'               NOT NULL,
  `resourceid`         bigint unsigned                           NULL,
  `resource_cuid`      varchar(25)                               NULL,
  `resourcename`       varchar(255)    DEFAULT ''                NOT NULL,
  `recordsetid`        varchar(25)                               NOT NULL,
  `details`            longtext                                  NOT NULL,
  PRIMARY KEY (auditid,clock)
) ENGINE=InnoDB;
CREATE INDEX `auditlog_1` ON `auditlog_new` (`userid`,`clock`);
CREATE INDEX `auditlog_2` ON `auditlog_new` (`clock`);
CREATE INDEX `auditlog_3` ON `auditlog_new` (`resourcetype`,`resourceid`);

2. Samainiet tabulas.

RENAME TABLE auditlog TO auditlog_old, auditlog_new TO auditlog;

3. Kopējiet datus no vecās tabulas uz jauno tabulu.

INSERT INTO auditlog SELECT * FROM auditlog_old;

To var izdarīt pa daļām (vairāki INSERT INTO priekšraksti ar WHERE clock klauzulām pēc nepieciešamības), lai izvairītos no pārmērīga resursu patēriņa.

4. Dzēsiet veco tabulu.

DROP TABLE auditlog_old;

PostgreSQL

Svarīgas piezīmes par indeksu pārbūvēšanu

PostgreSQL automātiski pārbūvē primārās atslēgas indeksus ALTER TABLE darbības laikā. Tomēr ir ļoti ieteicams arī manuāli pārbūvēt indeksus ar REINDEX TABLE CONCURRENTLY priekšrakstu, lai nodrošinātu optimālu datubāzes veiktspēju.

Indeksu pārbūvēšanai īslaicīgi var būt nepieciešams līdz pat trīs reizēm vairāk diska vietas nekā pašlaik izmanto indeksi. Lai iegūtu pašreizējo indeksu izmēru, varat izpildīt šādu vaicājumu:

SELECT pg_size_pretty(pg_indexes_size('auditlog'));

Ja pieejamā diska vieta rada bažas, sekojiet norādījumiem sadaļā Primārās atslēgas maiņa bez dīkstāves. Ir pieejamas arī citas iespējas:

  • PostgreSQL parametra maintenance_work_mem palielināšana var palīdzēt samazināt diska vietas izmantošanu manuālas indeksu pārbūves laikā. Tomēr šī mainīgā modificēšana var ietekmēt kopējo datubāzes atmiņas izmantošanu.
  • Ja jums ir cits disks vai tabulvieta ar vairāk pieejamas vietas, varat apsvērt pagaidu glabāšanas vietas maiņu indeksu pārbūvei. Varat iestatīt PostgreSQL parametru temp_tablespaces, lai norādītu citu tabulvietu pagaidu objektiem.
  • Apsveriet iespēju atbrīvot vietu, dzēšot potenciāli nevajadzīgus datus.
  • Apsveriet iespēju samazināt housekeeper parametru Datu glabāšanas periods pirms housekeeper izpildes.
Primārās atslēgas mainīšana ar dīkstāvi

1. Noņemiet pašreizējo auditlog tabulas primāro atslēgu un pievienojiet jauno primāro atslēgu.

ALTER TABLE auditlog DROP CONSTRAINT auditlog_pkey;
ALTER TABLE auditlog ADD PRIMARY KEY (auditid,clock);

2. Pārbūvējiet indeksus (neobligāti, bet ļoti ieteicams, skatiet Svarīgas piezīmes par indeksu pārbūvi).

REINDEX TABLE CONCURRENTLY auditlog;
Primārās atslēgas maiņa bez dīkstāves

Šeit ir aprakstīta primārās atslēgas manuāla maiņas metode. Kā alternatīvu var apsvērt pg_repack paplašinājumu, lai izveidotu jaunu tabulu, kopētu datus un samainītu tabulas.

1. Izveidojiet jaunu tabulu ar jauno primāro atslēgu un izveidojiet indeksus.

CREATE TABLE auditlog_new (
  auditid              varchar(25)                               NOT NULL,
  userid               bigint                                    NULL,
  username             varchar(100)    DEFAULT ''                NOT NULL,
  clock                integer         DEFAULT '0'               NOT NULL,
  ip                   varchar(39)     DEFAULT ''                NOT NULL,
  action               integer         DEFAULT '0'               NOT NULL,
  resourcetype         integer         DEFAULT '0'               NOT NULL,
  resourceid           bigint                                    NULL,
  resource_cuid        varchar(25)                               NULL,
  resourcename         varchar(255)    DEFAULT ''                NOT NULL,
  recordsetid          varchar(25)                               NOT NULL,
  details              text            DEFAULT ''                NOT NULL,
  PRIMARY KEY (auditid,clock)
);
CREATE INDEX auditlog_new_1 ON auditlog_new (userid,clock);
CREATE INDEX auditlog_new_2 ON auditlog_new (clock);
CREATE INDEX auditlog_new_3 ON auditlog_new (resourcetype,resourceid);

2. Samainiet tabulas.

ALTER TABLE auditlog RENAME TO auditlog_old;
ALTER TABLE auditlog_new RENAME TO auditlog;

3. Kopējiet datus no vecās tabulas uz jauno tabulu.

INSERT INTO auditlog SELECT * FROM auditlog_old;

To var izdarīt pa daļām (vairāki INSERT INTO priekšraksti ar WHERE clock klauzulām pēc nepieciešamības), lai izvairītos no pārmērīga resursu patēriņa.

4. Dzēsiet veco tabulu.

DROP TABLE auditlog_old;

Skatīt arī