[comment]: # translation:outdated

[comment]: # ({c4cea8a3-5b27abf6})
# 4 Припрема auditlog табеле за партиционисање

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

[comment]: # ({f697fbbd-9f4e8194})
#### Преглед

Неке базе података (на пример, MySQL) захтевају да колона за партиционисање буде део јединственог ограничења табеле.
Стога, да бисте поделили табелу `auditlog` по времену, примарни кључ мора да се промени из `auditid` у композитни кључ `auditid` + `clock`.

Ова секција пружа упутства за промену примарног кључа табеле `auditlog `.

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

[comment]: # ({496f4662-399f6b3f})
::: noteimportant
Упутства наведена на овој страници су намењена напредним корисникцима.
Имајте на уму да ће ова упутства можда морати да се прилагоде вашој специфичној конфигурацији.
Промена примарног кључа такође може бити некомпатибилна са будућим закрпама за надоградњу, тако да може бити потребно ручно руковање будућим надоградњама.
<br><br>
Промена примарног кључа може бити операција која захтева много ресурса и која захтева много времена у зависности од величине табеле `auditlog `.
Препоручује се заустављање Zabbix сервера и пребацивање Zabbix корисничког интерфејса на [режим одржавања](/manual/web_interface/maintenance_mode) за време промене.
Међутим, ако је апсолутно неопходно, постоји начин да се промени примарни кључ без прекида рада (погледајте доле).
:::

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

[comment]: # ({388a49dd-762f2fc8})
Партиционирање табеле `auditlog` може побољшати, на пример, одржавање у великим окружењима.
Иако Zabbix [housekeeping](/manual/web_interface/frontend_sections/administration/housekeeping) тренутно не може да искористи предности партиционираних табела (осим за TimescaleDB), можете онемогућити Zabbix одржавање и избрисати партиције помоћу скрипти.

Од Zabbix-а 7.0, табела `auditlog ` за TimescaleDB је конвертована у хипертабелу, што омогућава домаћици да испусти податке по деловима.
Да бисте надоградили постојећу табелу `аудитлог` у хипертабелу, погледајте [Надоградњу TimescaleDB шеме](/manual/appendix/install/timescaledb#upgrading-timescaledb-schema).

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

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

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

[comment]: # ({4c0f4fb7-e752da32})
##### Важне напомене о обнављању индекса

MySQL аутоматски поново гради индексе за примарни кључ током операције `ALTER TABLE`.
Међутим, веома је препоручљиво да ручно поново направите индексе са наредбом `OPTIMIZE TABLE` да бисте осигурали оптималне перформансе базе података.

Обнова индекса може привремено да захтева онолико додатног простора на диску колико сама табела користи.
Да бисте добили тренутну величину података и индекса, можете извршити следеће наредбе:

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

Ако је доступан простор на диску забрињавајући, пратите упутства [Промена примарног кључа без прекида рада] (#altering-primary-key-without-downtime).
Доступне су и друге опције:

-  Повећање MySQL параметра [`sort_buffer_size`](https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html) може помоћи да се смањи употреба простора на диску приликом ручног обнављања индекса.
    Међутим, измена ове променљиве може утицати на укупну употребу меморије базе података.
-  Размислите о ослобађању простора брисањем потенцијално непотребних података.
-  Размислите о смањењу параметра *Период складиштења података* [одржавање](/manual/web_interface/frontend_sections/administration/housekeeping#overview) пре него што извршите одржавање.

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

[comment]: # ({e102e75a-e0cfde87})
##### Измена примарног кључа уз застоје

1\. Обришите тренутни примарни кључ табеле `auditlog` и додајте нови примарни кључ.

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

2\. Поново изградите индексе (опционо, али се веома препоручује, погледајте [Важне напомене о поновној изградњи индекса](#important-notes-on-rebuilding-indexes)).

```sql
OPTIMIZE TABLE auditlog;
```

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

[comment]: # ({0bc984a8-9fb9cdb0})
##### Измена примарног кључа без застоја

Ручни метод измене примарног кључа је описан овде.
 Алтернативно, можете користити Percona алат [pt-online-schema-change](https://docs.percona.com/percona-toolkit/pt-online-schema-change.html). 
Овај алат аутоматски извршава следеће акције, истовремено минимизујући простор који се користи за измену табеле `auditlog`.

1\. Креирајте нову табелу са новим примарним кључем и креирајте индексе.

```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\. Замените табеле.

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

3\. Копирајте податке из старе табеле у нову табелу.

```sql
INSERT INTO auditlog SELECT * FROM auditlog_old;
```

Ово може бити учињено у деловима (више `INSERT INTO` наредби са `WHERE clock` клаузулама по потреби) како би се избегло прекомерно коришћење ресурса.

4\. Обришите стару табелу.

```sql
DROP TABLE auditlog_old;
```

[comment]: # ({/0bc984a8-9fb9cdb0})

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

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

[comment]: # ({397137db-30f863e9})
##### Важне напомене о обнављању индекса

PostgreSQL аутоматски поново гради индексе за примарни кључ током операције `ALTER TABLE`.
Међутим, веома се препоручује да се индекси ручно реконструишу помоћу израза `REINDEX TABLE CONCURRENTLY` да бисте обезбедили оптималне перформансе базе података.

Обнова индекса може привремено да захтева до три пута више простора на диску који индекси тренутно користе.
Да бисте добили тренутну величину индекса, можете извршити следећи упит:

```sql
SELECT pg_size_pretty(pg_indexes_size('auditlog'));
```

Ако је доступан простор на диску забрињавајући, пратите упутства [Промена примарног кључа без прекида рада](#altering-primary-key-without-downtime-1).
Доступне су и друге опције:

-  Повећање [`maintenance_work_mem`](https://www.postgresql.org/docs/current/runtime-config-resource.html#GUC-MAINTENANCE-WORK-MEM) PostgreSQL параметра може помоћи да се смањи употреба простора на диску када се ручно индекси реконструишу.
    Међутим, измена ове променљиве може утицати на укупну употребу меморије базе података.
-  Ако имате други диск или табеларни простор са више расположивог простора, размислите о промени привремене локације за складиштење за реконструкцију индекса.
    Можете да подесите [`temp_tablespaces`](https://www.postgresql.org/docs/current/runtime-config-client.html#GUC-TEMP-TABLESPACES) PostgreSQL параметар да наведете другачији простор табеле за привремене објекте.
-  Размислите ослобађање простора брисањем потенцијално непотребних података.
-  Размислите смањење параметра *Период чувања података* [одржавање](/manual/web_interface/frontend_sections/administration/housekeeping#overview) пре него што извршите одржавање.

[comment]: # ({/397137db-30f863e9})

[comment]: # ({b08f85b7-915b5f5f})
##### Промена примарног кључа са застојем

1\. Уклоните тренутни примарни кључ табеле `auditlog ` и додајте нови примарни кључ.

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

2\. Поново изградите индексе (опционо, али се веомапрепоручује, погледајте [Важне напомене о поновној изградњи индекса](#important-notes-on-rebuilding-indexes-1)).

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

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

[comment]: # ({adcb7248-998c6861})
##### Промена примарног кључа без застоја

Овде је описана ручна метода промене примарног кључа. 
Алтернативно, екстензија `pg_repack` се може размотрити за креирање нове табеле, копирање података и замену табела.

1\. Креирајте нову табелу са новим примарним кључем и креирајте индексе.

```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\. Замените табеле.

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

3\. Копирајте податке из старе табеле у нову табелу.

```sql
INSERT INTO auditlog SELECT * FROM auditlog_old;
```

Ово се може урадити у деловима (више наредби `INSERT INTO` са клаузулама `WHERE clock` по потреби) да би се избегло прекомерно коришћење ресурса.

4\. Избришите стару табелу.

```sql
DROP TABLE auditlog_old;
```

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

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

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

[comment]: # ({6342e7f9-f5959ede})
##### Важне напомене о обнављању индекса

Oracle аутоматски поново гради индексе за примарни кључ током операције `ALTER TABLE`.
Међутим, веома је препоручљиво да се индекси ручно реконструишу са наредбама `ALTER INDEX <index> REBUILD PARALLEL` како би се обезбедиле оптималне перформансе базе података.

Обнова индекса може привремено захтевати значајан простор на диску.

Ако је доступан простор на диску забрињавајући, пратите упутства [Промена примарног кључа без прекида рада](#altering-primary-key-without-downtime-2).
Доступне су и друге опције:

-  Повећање Oracle параметра [`SORT_AREA_SIZE`](https://docs.oracle.com/en/database/oracle/oracle-database/19/refrn/SORT_AREA_SIZE.html) може помоћи да се смањи употреба простора на диску приликом ручног обнављања индекса .
    Међутим, измена ове променљиве ће утицати на укупну употребу меморије базе података.
-  Можете поставити паралелни степен користећи PARALLEL клаузулу, на пример: `ALTER INDEX auditlog_1 REBUILD PARALLEL 4`
-  Размислите о ослобађању простора брисањем потенцијално непотребних података.
-  Размислите о смањењу параметра *Период складиштења података* [одржавање](/manual/web_interface/frontend_sections/administration/housekeeping#overview) пре него што извршите одржавање.

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

[comment]: # ({c4f768d3-221f8287})
##### Промена примарног кључа са застојем

1\. Преузмите име ограничења.

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

2\. Избришите тренутни примарни кључ табеле `auditlog` и додајте нови примарни кључ.

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

3\. Поново изградите индексе (опционо, али се препоручује, погледајте [Важне напомене о поновној изградњи индекса](#important-notes-on-rebuilding-indexes-2)).

3.1\. Добавите имена индекса.

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

3.2\. Поново изградите сваки индекс.

```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]: # ({/c4f768d3-221f8287})

[comment]: # ({65243f1c-af258bb0})
##### Промена примарног кључа без застоја

1\. Креирајте нову табелу са новим примарним кључем и креирајте индексе.

```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\. Размените табеле.

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

3\. Копирајте податке из старе табеле у нову табелу.

```sql
INSERT INTO auditlog SELECT * FROM auditlog_old;
```

Ово се може урадити у деловима (више наредби `INSERT INTO` са клаузулама `WHERE clock` по потреби) да би се избегло прекомерно коришћење ресурса.

4\. Избришите стару табелу.

```sql
DROP TABLE auditlog_old;
```

[comment]: # ({/65243f1c-af258bb0})

[comment]: # ({33200567-31083cb3})
#### Погледајте такође

–  [Надоградња базе података на примарне кључеве](/manual/appendix/install/db_primary_keys)

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