【问题标题】:why no index and/or PK on table DATABASECHANGELOG?为什么表 DATABASECHANGELOG 上没有索引和/或 PK?
【发布时间】:2018-11-20 17:19:36
【问题描述】:

引用MariaDB Galera Cluster - Known Limitations

所有表都应该有一个主键(多列主键是 支持的)。不支持 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 |
+----------------------------------------------------------------------------------------+------------+------------+-------------+---------------------+-----------------------+

【问题讨论】:

    标签: mariadb liquibase galera


    【解决方案1】:

    看看这个Jira ticket

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

    还描述了一种可能的解决方法:

    一个简单的解决方法是添加一个带有 not primaryKeyExists 前置条件和 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-08
      • 2017-06-03
      • 1970-01-01
      • 2022-06-16
      相关资源
      最近更新 更多