来自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 |
+----------------------------------------------------------------------------------------+------------+------------+-------------+---------------------+-----------------------+
答案 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>