[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ūvi {#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 indeksus pārbūvēt arī manuāli, izmantojot `OPTIMIZE TABLE` priekšrakstu, lai nodrošinātu optimālu datubāzes veiktspēju.

Indeksu pārbūvei 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 apjomu, varat izpildīt šādus priekšrakstus:

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

Ja pieejamā diska vieta ir ierobežota, izpildiet norādījumus sadaļā [Primārās atslēgas maiņa bez dīkstāves](#altering-primary-key-without-downtime-1).
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, iespējams, nevajadzīgus datus.
-   Apsveriet iespēju samazināt *Datu glabāšanas perioda* [housekeeper](/manual/web_interface/frontend_sections/administration/housekeeping#overview) parametru pirms housekeeper palaišanas.

[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}

Šeit ir aprakstīta primārās atslēgas manuāla maiņas metode.
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 tālāk norādītās 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 indeksus pārbūvēt arī manuāli, izmantojot `REINDEX TABLE CONCURRENTLY` paziņojumu, lai nodrošinātu optimālu datubāzes veiktspēju.

Indeksu pārbūvei uz laiku var būt nepieciešama līdz pat trīsreiz lielāka diska vieta nekā pašlaik aizņem indeksi.
Lai uzzinā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, izpildiet 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 šī mainīgā modificēšana var ietekmēt datubāzes kopējo atmiņas patēriņu.
-   Ja jums ir cits disks vai tablespace 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 tablespace pagaidu objektiem.
-   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 palaišanas.

[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 maiņas manuālā 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]: # ({2a8e17b6-2132d968})
#### Oracle

[comment]: # ({/2a8e17b6-2132d968})

[comment]: # ({fe750069-f5959ede})
##### Svarīgas piezīmes par indeksu pārbūvi {#important-notes-on-rebuilding-indexes-3}

Oracle 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, izmantojot `ALTER INDEX <index> REBUILD PARALLEL` paziņojumus, lai nodrošinātu optimālu datubāzes veiktspēju.

Indeksu pārbūve īslaicīgi var prasīt ievērojamu diska vietu.

Ja pieejamā diska vieta rada bažas, izpildiet norādījumus sadaļā [Primārās atslēgas maiņa bez dīkstāves](#altering-primary-key-without-downtime-3).
Ir pieejamas arī citas iespējas:

-   Oracle parametra [`SORT_AREA_SIZE`](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/SORT_AREA_SIZE.html) palielināšana var palīdzēt samazināt diska vietas izmantošanu, manuāli pārbūvējot indeksus.
    Tomēr šīs vērtības modificēšana ietekmēs datubāzes kopējo atmiņas izmantošanu.
-   Varat iestatīt paralēlās izpildes pakāpi, izmantojot PARALLEL klauzulu, piemēram: `ALTER INDEX auditlog_1 REBUILD PARALLEL 4`
-   Apsveriet iespēju atbrīvot vietu, dzēšot, iespējams, nevajadzīgus datus.
-   Apsveriet iespēju samazināt *Datu glabāšanas perioda* [housekeeper](/manual/web_interface/frontend_sections/administration/housekeeping#overview) parametru pirms housekeeper palaišanas.

[comment]: # ({/fe750069-f5959ede})

[comment]: # ({586dc269-221f8287})
##### Primārās atslēgas maiņa ar dīkstāvi {#altering-primary-key-with-downtime-3}

1\. Iegūstiet ierobežojuma nosaukumu.

```sql
SELECT CONSTRAINT_NAME FROM all_constraints WHERE TABLE_NAME = 'AUDITLOG' AND CONSTRAINT_TYPE = 'P';
```

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

```sql
ALTER TABLE auditlog DROP CONSTRAINT <constraint_name>;
ALTER TABLE auditlog ADD CONSTRAINT auditlog_pk PRIMARY KEY (auditid, clock);
```

3\. 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-3)).

3.1\. Iegūstiet indeksu nosaukumus.

```sql
SELECT index_name FROM user_indexes WHERE table_name='AUDITLOG';
```

3.2\. Pārbūvējiet katru indeksu.

```sql
ALTER INDEX auditlog_pk REBUILD PARALLEL;
ALTER INDEX auditlog_1 REBUILD PARALLEL;
ALTER INDEX auditlog_2 REBUILD PARALLEL;
ALTER INDEX auditlog_3 REBUILD PARALLEL;
```

[comment]: # ({/586dc269-221f8287})

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

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

```sql
CREATE TABLE auditlog_new (
  auditid              nvarchar2(25)                             ,
  userid               number(20)                                NULL,
  username             nvarchar2(100)  DEFAULT ''                ,
  clock                number(10)      DEFAULT '0'               NOT NULL,
  ip                   nvarchar2(39)   DEFAULT ''                ,
  action               number(10)      DEFAULT '0'               NOT NULL,
  resourcetype         number(10)      DEFAULT '0'               NOT NULL,
  resourceid           number(20)                                NULL,
  resource_cuid        nvarchar2(25)                             ,
  resourcename         nvarchar2(255)  DEFAULT ''                ,
  recordsetid          nvarchar2(25)                             ,
  details              nclob           DEFAULT ''                ,
  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\. 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]: # ({/d714ab21-af258bb0})

[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})
