[comment]: # ({c4cea8a3-5b27abf6})
# 4 Auditlog tabulas sagatavošana sadalīšanai nodalījumos

[comment]: # ({/c4cea8a3-5b27abf6})

[comment]: # ({f697fbbd-9f4e8194})
#### 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.

[comment]: # ({/f697fbbd-9f4e8194})

[comment]: # ({496f4662-399f6b3f})
::: noteimportant
Š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.
<br><br>
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ā](/manual/web_interface/maintenance_mode).
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).
:::

[comment]: # ({/496f4662-399f6b3f})

[comment]: # ({388a49dd-762f2fc8})
`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](/manual/web_interface/frontend_sections/administration/housekeeping) 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](/manual/appendix/install/timescaledb#upgrading-timescaledb-schema).

[comment]: # ({/388a49dd-762f2fc8})

[comment]: # ({073b5bd5-271b9416})
#### MySQL

[comment]: # ({/073b5bd5-271b9416})

[comment]: # ({f576f708-e752da32})
##### Svarīgas piezīmes par indeksu pārbūvēšanu {#important-notes-on-rebuilding-indexes-1}

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:

```sql
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](#altering-primary-key-without-downtime-1).
Ir pieejamas arī citas iespējas:

-   MySQL parametra [`sort_buffer_size`](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html) palielināš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](/manual/web_interface/frontend_sections/administration/housekeeping#overview) parametru pirms housekeeper izpildes.

[comment]: # ({/f576f708-e752da32})

[comment]: # ({de2a0c3b-e0cfde87})
##### Primārās atslēgas maiņa ar dīkstāvi {#altering-primary-key-with-downtime-1}

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

```sql
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](#important-notes-on-rebuilding-indexes-1)).

```sql
OPTIMIZE TABLE auditlog;
```

[comment]: # ({/de2a0c3b-e0cfde87})

[comment]: # ({19b5a6ba-9fb9cdb0})
##### Primārās atslēgas maiņa bez dīkstāves {#altering-primary-key-without-downtime-1}

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](https://docs.percona.com/percona-toolkit/pt-online-schema-change.html).
Šī 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.

```sql
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.

```sql
RENAME TABLE auditlog TO auditlog_old, auditlog_new TO auditlog;
```

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

```sql
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.

```sql
DROP TABLE auditlog_old;
```

[comment]: # ({/19b5a6ba-9fb9cdb0})

[comment]: # ({dc8ac96e-381b1eee})
#### PostgreSQL

[comment]: # ({/dc8ac96e-381b1eee})

[comment]: # ({64d2938a-30f863e9})
##### Svarīgas piezīmes par indeksu pārbūvi {#important-notes-on-rebuilding-indexes-2}

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:

```sql
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](#altering-primary-key-without-downtime-2).
Ir pieejamas arī citas iespējas:

-   PostgreSQL parametra [`maintenance_work_mem`](https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM) palielināš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`](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-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](/manual/web_interface/frontend_sections/administration/housekeeping#overview) parametru pirms housekeeper izpildes.

[comment]: # ({/64d2938a-30f863e9})

[comment]: # ({18dc0642-915b5f5f})
##### Primārās atslēgas maiņa ar dīkstāvi {#altering-primary-key-with-downtime-2}

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

```sql
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](#important-notes-on-rebuilding-indexes-2)).

```sql
REINDEX TABLE CONCURRENTLY auditlog;
```

[comment]: # ({/18dc0642-915b5f5f})

[comment]: # ({ab7f639c-998c6861})
##### Primārās atslēgas maiņa bez dīkstāves {#altering-primary-key-without-downtime-2}

Š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.

```sql
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.

```sql
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.

```sql
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.

```sql
DROP TABLE auditlog_old;
```

[comment]: # ({/ab7f639c-998c6861})

[comment]: # ({33200567-31083cb3})
#### Skatīt arī

-   [Datubāzes jaunināšana uz primārajām atslēgām](/manual/appendix/install/db_primary_keys)

[comment]: # ({/33200567-31083cb3})
