MariaDB: Дублирующая запись для ключа на OPTIMIZE без дублирования - PullRequest
0 голосов
/ 08 июля 2019

Существует таблица с именем contracts со следующей структурой:

MariaDB [db_name]> DESCRIBE `contracts`;
+-----------------------------+--------------+------+-----+---------+----------------+
| Field                       | Type         | Null | Key | Default | Extra          |
+-----------------------------+--------------+------+-----+---------+----------------+
| id                          | int(11)      | NO   | PRI | NULL    | auto_increment |
| name                        | varchar(255) | YES  |     | NULL    |                |
| number                      | varchar(255) | YES  |     | NULL    |                |
| service_name                | varchar(255) | YES  |     | NULL    |                |
| begin_date                  | date         | YES  |     | NULL    |                |
| end_date                    | date         | YES  |     | NULL    |                |
| main_contract               | varchar(255) | YES  |     | NULL    |                |
| status                      | varchar(255) | YES  |     | NULL    |                |
| uuid                        | varchar(36)  | YES  |     | NULL    |                |
| database_id                 | int(11)      | YES  |     | NULL    |                |
| abonent_uuid                | varchar(36)  | YES  | MUL | NULL    |                |
| deleted                     | tinyint(1)   | YES  | MUL | 0       |                |
| active                      | tinyint(1)   | YES  |     | NULL    |                |
| payment_condition_name      | varchar(255) | YES  |     | NULL    |                |
| payment_condition_form_type | varchar(255) | YES  |     | NULL    |                |
| gas                         | tinyint(1)   | NO   |     | 0       |                |
| service_uuid                | varchar(36)  | YES  |     | NULL    |                |
| document_type               | int(11)      | YES  |     | NULL    |                |
| document_id                 | varchar(255) | YES  |     | NULL    |                |
| document_status             | varchar(255) | YES  |     | NULL    |                |
| signed                      | tinyint(1)   | YES  |     | 0       |                |
| saved                       | tinyint(1)   | YES  | MUL | 0       |                |
| organization_code           | varchar(255) | YES  |     | NULL    |                |
+-----------------------------+--------------+------+-----+---------+----------------+
23 rows in set (0.00 sec)

Существует уникальный составной индекс для abonent_uuid и uuid:

MariaDB [db_name]> SHOW INDEX FROM `contracts`;
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table     | Non_unique | Key_name                   | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| contracts |          0 | PRIMARY                    |            1 | id           | A         |      384633 |     NULL | NULL   |      | BTREE      |         |               |
| contracts |          0 | index_contr_on_abon_uuid   |            1 | abonent_uuid | A         |      384633 |     NULL | NULL   | YES  | BTREE      |         |               |
| contracts |          0 | index_contr_on_abon_uuid   |            2 | uuid         | A         |      384633 |     NULL | NULL   | YES  | BTREE      |         |               |
| contracts |          1 | index_contracts_on_deleted |            1 | deleted      | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
| contracts |          1 | index_contracts_on_saved   |            1 | saved        | A         |           2 |     NULL | NULL   | YES  | BTREE      |         |               |
+-----------+------------+----------------------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)

Когда япопробуйте сделать mysqlcheck или OPTIMIZE (mysqlcheck -u root -p -o db_name контракты) для этой таблицы, я получил эту ошибку:

db_name.contracts
note     : Table does not support optimize, doing recreate + analyze instead
error    : Duplicate entry '5661d82c-70d1-b019-3200-ca61e3f72e46-b9073669-4c3d-a089-6c2f-ddc' for key 'index_contr_on_abon_uuid'
status   : Operation failed

Итак, у нас есть следующие конфликтующие uuids:

5661d82c-70d1-b019-3200-ca61e3f7
2e46-b9073669-4c3d-a089-6c2f-ddc

Или только их части, полные UUID имеют длину 36 байтов.Я не знаю, почему MariaDB обрезает их.Индексы были созданы с использованием этого запроса:

ALTER TABLE `contracts` ADD UNIQUE INDEX `index_contr_on_abon_uuid` (`abonent_uuid`, `uuid`);

Также я попробовал (тот же результат):

DROP INDEX `index_contr_on_abon_uuid` ON `contracts`;
ALTER TABLE `contracts` ADD UNIQUE INDEX `index_contr_on_abon_uuid` (`abonent_uuid`(36), `uuid`(36));

Но в таблице НЕТ неуникальных записей (даже еслимы обрезаем uuids):

MariaDB [db_name]>   SELECT `abonent_uuid`, `uuid`
  ->   FROM `contracts`
  ->   GROUP BY SUBSTRING(`abonent_uuid`, 1, 32), SUBSTRING(`uuid`, 1, 32)
  ->   HAVING COUNT(*) > 1;
Empty set (8.36 sec)

Эта ошибка иногда исчезает, но иногда появляется снова и время от времени.Во время моих экспериментов на этой таблице не было произведено ни одной операции.

Следовательно, questions : ПОЧЕМУ возникает эта ошибка?КАК это исправить?

PS

Debian GNU / Linux 9 (растяжка)

mysql Ver 15.1 Distrib 10.1.38-MariaDB, дляdebian-linux-gnu (x86_64) с использованием readline 5.2

ENGINE = InnoDB;

...