почему нет индекса и / или ПК для таблицы DATABASECHANGELOG? - PullRequest
0 голосов
/ 11 июня 2018

Цитата из MariaDB Galera Cluster - Известные ограничения

Все таблицы должны иметь первичный ключ (поддерживаются первичные ключи из нескольких столбцов).Операции DELETE не поддерживаются в таблицах без первичного ключа.Кроме того, строки в таблицах без первичного ключа могут появляться в разных порядках на разных узлах.

Galera требует, чтобы в каждой таблице был PK или хотя бы индекс.Это связано главным образом с репликацией (плагин wsrep).

Мы работаем с кластером Galera / MariaDB, и я вижу клиентов с DATABASECHANGELOG, у которого нет индекса и PK.Я предполагаю, что эта таблица только для добавления (без операций обновления или удаления)

Я не знаю Liquibase, поэтому я спрашиваю причину отсутствия индекса и / или PK здесь.Должен ли я открыть отчет об ошибке или я не понимаю этот вариант использования?

+----------------------------------------------------------------------------------------+------------+------------+-------------+---------------------+-----------------------+
| schema                                              | table_rows | non_unique | cardinality | medium distribution | replication row reads |
+----------------------------------------------------------------------------------------+------------+------------+-------------+---------------------+-----------------------+
(...)
| xxx.DATABASECHANGELOG                               |        571 |       NULL |        NULL |            571.0000 |           326041.0000 |
| xxxx.DATABASECHANGELOG                              |        491 |       NULL |        NULL |            491.0000 |           241081.0000 |
| xxxxx.DATABASECHANGELOG                             |        433 |       NULL |        NULL |            433.0000 |           187489.0000 |
+----------------------------------------------------------------------------------------+------------+------------+-------------+---------------------+-----------------------+

1 Ответ

0 голосов
/ 11 июня 2018

Проверьте этот Jira билет

Liquibase был изменен, чтобы не создавать первичный ключ в таблице базы данных exchangelog, потому что он вводил проблемы с размерами ключей и не был действительно необходим.Я еще не проверял и не выбрасывал существующий первичный ключ.Он должен быть удален, но не вызывает проблем, если вы не попали в крайний случай, когда у вас очень длинный путь к идентификатору, автору и / или файлу.

Также описан возможный обходной путь:

Простой обходной путь может заключаться в добавлении набора изменений с предварительным условием not primaryKeyExists и изменением addPrimaryKey.Более сложный обходной путь может заключаться в создании плагина, который переопределяет CreateDatabaseChangeLogTableGenerator и / или StandardChangeLogHistoryService, которые реализуют PrioritizedService.

Ниже приведен пример простого обходного пути.Я оптимизировал индексы, чтобы уменьшить сканирование таблиц, сортировку и поиск закладок на SQL Server, но, вероятно, это в равной степени применимо к Oracle.Меня не очень беспокоило превышение максимальной длины ключа в 900 байт на SQL Server.

<?xml version="1.0" encoding="UTF-8" ?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="
      http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">

  <property name="liquibaseCatalogName" value=""/>
  <property name="liquibaseSchemaName" value="${database.liquibaseSchemaName}"/>
  <property name="databaseChangeLogTableName" value="${database.databaseChangeLogTableName}"/>
  <property name="liquibaseTablespaceName" value=""/>

  <changeSet id="1" author="your-name">
      <preConditions onFail="MARK_RAN">
          <primaryKeyExists
              catalogName="${liquibaseCatalogName}"
              schemaName="${liquibaseSchemaName}"
              tableName="${databaseChangeLogTableName}"
              primaryKeyName="PK_${databaseChangeLogTableName}"/>
      </preConditions>
      <dropPrimaryKey
          catalogName="${liquibaseCatalogName}"
          schemaName="${liquibaseSchemaName}"
          tableName="${databaseChangeLogTableName}"
          constraintName="PK_${databaseChangeLogTableName}"/>
  </changeSet>

  <changeSet id="2" author="your-name">
      <createIndex
          catalogName="${liquibaseCatalogName}"
          schemaName="${liquibaseSchemaName}"
          tableName="${databaseChangeLogTableName}"
          indexName="IX_${databaseChangeLogTableName}_DATEEXECUTED_ORDEREXECUTED"
          tablespace="${liquibaseTablespaceName}"
          clustered="true">

          <column name="DATEEXECUTED"/>
          <column name="ORDEREXECUTED"/>
      </createIndex>
  </changeSet>

  <changeSet id="3" author="your-name">
      <addPrimaryKey
          catalogName="${liquibaseCatalogName}"
          schemaName="${liquibaseSchemaName}"
          tableName="${databaseChangeLogTableName}"
          constraintName="PK_${databaseChangeLogTableName}"
          tablespace="${liquibaseTablespaceName}"
          clustered="false"
          columnNames="ID,AUTHOR,FILENAME"/>
  </changeSet>

</databaseChangeLog>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...