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ūvēšanu
MySQL automātiski pārbūvē primārās atslēgas indeksus ALTER TABLE operācijas laikā.
Tomēr ir ļoti ieteicams arī manuāli pārbūvēt indeksus ar OPTIMIZE TABLE priekšrakstu, lai nodrošinātu optimālu datubāzes veiktspēju.
Indeksu pārbūvēšanai uz laiku var būt nepieciešama papildu diska vieta tikpat lielā apjomā, cik izmanto pati tabula. Lai iegūtu pašreizējo datu un indeksu izmēru, varat izpildīt šādus priekšrakstus:
ANALYZE TABLE auditlog;
SHOW TABLE STATUS LIKE 'auditlog';
Ja pieejamā diska vieta ir ierobežota, 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_sizepalielināšana var palīdzēt samazināt diska vietas patēriņu, manuāli pārbūvējot indeksus. Tomēr šī mainīgā modificēšana var ietekmēt datubāzes kopējo atmiņas patēriņu. - Apsveriet iespēju atbrīvot vietu, dzēšot potenciāli nevajadzīgus datus.
- Apsveriet iespēju samazināt Datu glabāšanas perioda housekeeper parametru pirms housekeeper izpildes.
Primārās atslēgas maiņa 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 (pēc izvēles, bet ļoti ieteicams; skatiet Svarīgas piezīmes par indeksu pārbūvi).
OPTIMIZE TABLE auditlog;
Primārās atslēgas maiņa bez dīkstāves
Manuālā primārās atslēgas maiņas metode ir aprakstīta šeit.
Alternatīvi varat izmantot Percona rīkkopu pt-online-schema-change.
Šī rīkkopa automātiski veic šādas darbības, vienlaikus samazinot vietu, kas nepieciešama auditlog tabulas maiņai.
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. Apmainiet 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 veikt pa daļām (vairāki INSERT INTO priekšraksti ar WHERE clock nosacījumiem pēc vajadzī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ūvi
PostgreSQL automātiski pārbūvē primārās atslēgas indeksus ALTER TABLE operācijas laikā.
Tomēr ir ļoti ieteicams arī manuāli pārbūvēt indeksus ar REINDEX TABLE CONCURRENTLY paziņojumu, lai nodrošinātu optimālu datubāzes veiktspēju.
Indeksu pārbūve īslaicīgi var prasīt līdz pat trīs reizēm vairāk diska vietas nekā pašlaik aizņem 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 ir ierobežota, ievērojiet norādījumus sadaļā Primārās atslēgas maiņa bez dīkstāves. Ir pieejamas arī citas iespējas:
- PostgreSQL parametra
maintenance_work_mempalielināšana var palīdzēt samazināt diska vietas patēriņu, manuāli pārbūvējot indeksus. Tomēr šīs vērtības modificēšana var ietekmēt datubāzes kopējo atmiņas patēriņu. - Ja jums ir cits disks vai tabulas telpa ar vairāk brīvas vietas, varat apsvērt pagaidu krātuves atrašanās vietas maiņu indeksu pārbūvei.
Varat iestatīt PostgreSQL parametru
temp_tablespaces, lai norādītu citu tabulas telpu pagaidu objektiem. - Apsveriet iespēju atbrīvot vietu, dzēšot potenciāli nevajadzīgus datus.
- Apsveriet iespēju samazināt Datu glabāšanas periods housekeeper parametru pirms housekeeper izpildes.
Primārās atslēgas maiņa 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 (pēc izvēles, 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.
Alternatīvi var apsvērt pg_repack paplašinājumu jaunas tabulas izveidei, datu kopēšanai un tabulu apmaiņai.
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. Apmainiet tabulas.
ALTER TABLE auditlog RENAME TO auditlog_old;
ALTER TABLE auditlog_new RENAME TO auditlog;
3. Nokopējiet datus no vecās tabulas uz jauno tabulu.
INSERT INTO auditlog SELECT * FROM auditlog_old;
To var veikt pa daļām (vairāki INSERT INTO priekšraksti ar WHERE clock nosacījumiem pēc vajadzības), lai izvairītos no pārmērīga resursu patēriņa.
4. Dzēsiet veco tabulu.
DROP TABLE auditlog_old;