为什么表DATABASECHANGELOG上没有索引和/或PK?

时间:2018-06-11 12:42:25

标签: mariadb liquibase galera

来自MariaDB Galera Cluster - Known Limitations

  

所有表都应该有一个主键(多列主键是   支持的)。没有a的表上不支持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 :(得分:2)

查看此Jira ticket

  

Liquibase被更改为不在databasechangelog表中创建主键,因为它引入了密钥大小的问题,并不是非常必要的。我还没有对现有的主键进行检查和删除。它应该被删除但不会导致问题,除非你遇到一个边缘情况,你有很长的id,作者和/或文件路径。

还介绍了一种可行的解决方法:

  

一个简单的解决方法可能是使用not添加更改集   primaryKeyExists pre-condition和addPrimaryKey更改。更多   涉及的解决方法可能是创建一个覆盖它的插件   CreateDatabaseChangeLogTableGenerator和/或   实现PrioritizedService的StandardChangeLogHistoryService。

     

以下是简单解决方法的示例。我已经优化了   用于减少SQL扫描,排序和书签查找的索引   服务器,但它可能同样适用于Oracle。我不是   真的关心SQL上900字节的最大密钥长度   超出服务器。

<?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>