【问题标题】:In Corda, Error parsing master.changelog.json when migrating to Enterprise在 Corda 中,迁移到 Enterprise 时解析 master.changelog.json 时出错
【发布时间】:2018-07-19 11:40:09
【问题描述】:

我正在从 Corda Open-Source 迁移到 Corda Enterprise,并创建了迁移脚本。但是,我收到以下错误:

liquibase.exception.ChangeLogParseException:解析错误 master.changelog.json 在 liquibase.parser.core.yaml.YamlChangeLogParser.parse(YamlChangeLogParser.java:98) ~[liquibase-core-3.5.3.jar:?] 在 liquibase.Liquibase.getDatabaseChangeLog(Liquibase.java:229) ~[liquibase-core-3.5.3.jar:?] 在 liquibase.Liquibase.listUnrunChangeSets(Liquibase.java:1183) ~[liquibase-core-3.5.3.jar:?] 在 liquibase.Liquibase.listUnrunChangeSets(Liquibase.java:1176) ~[liquibase-core-3.5.3.jar:?] 在 net.corda.nodeapi.internal.persistence.SchemaMigration.doRunMigration(SchemaMigration.kt:133) ~[corda-node-api-3.1.jar:?] 在 net.corda.nodeapi.internal.persistence.SchemaMigration.doRunMigration$default(SchemaMigration.kt:77) ~[corda-node-api-3.1.jar:?] 在 net.corda.nodeapi.internal.persistence.SchemaMigration.checkState(SchemaMigration.kt:66) ~[corda-node-api-3.1.jar:?] 在 net.corda.nodeapi.internal.persistence.SchemaMigration.nodeStartup(SchemaMigration.kt:49) ~[corda-node-api-3.1.jar:?] 在 net.corda.node.internal.AbstractNodeKt.configureDatabase(AbstractNode.kt:1140) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.AbstractNode.initialiseDatabasePersistence(AbstractNode.kt:852) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.Node.initialiseDatabasePersistence(Node.kt:373) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.AbstractNode.start(AbstractNode.kt:296) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.Node.start(Node.kt:387) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.EnterpriseNode.start(EnterpriseNode.kt:181) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.NodeStartup.startNode(NodeStartup.kt:270) ~[corda-node-3.1.jar:?] 在 net.corda.node.internal.NodeStartup.run(NodeStartup.kt:160) [corda-node-3.1.jar:?] 在 net.corda.node.Corda.main(Corda.kt:25) [corda-node-3.1.jar:?] 引起:liquibase.exception.SetupException: 解析第 1 行第 62 列时出错 迁移/account-application.changelog-master.xml:cvc-elt.1:不能 找到元素“changeSet”的声明。在 liquibase.changelog.DatabaseChangeLog.handleChildNode(DatabaseChangeLog.java:322) ~[liquibase-core-3.5.3.jar:?] 在 liquibase.changelog.DatabaseChangeLog.load(DatabaseChangeLog.java:282) ~[liquibase-core-3.5.3.jar:?] 在 liquibase.parser.core.yaml.YamlChangeLogParser.parse(YamlChangeLogParser.java:91) ~[liquibase-core-3.5.3.jar:?] ... 16 更多

这是account-application.changelog-master.xml文件的内容:

<changeSet author="R3.Corda" id="account_application_schema">
    <addColumn tableName="account_application_states">
        <column name="member_id" type="uuid"/>
    </addColumn>
    <addColumn tableName="account_application_states">
        <column name="fund_product_id" type="uuid"/>
    </addColumn>
    <addColumn tableName="account_application_states">
        <column name="type" type="varchar(255)"/>
    </addColumn>
    <addColumn tableName="account_application_states">
        <column name="fund_name" type="varchar(255)"/>
    </addColumn>
    <addColumn tableName="account_application_states">
        <column name="linear_id" type="uuid"/>
    </addColumn>
</changeSet> 

我尝试将内容包装在 &lt;databaseChangeLog&gt; 标记中,但我仍然遇到类似的错误。我需要在文件中添加任何额外的标题或内容吗?

【问题讨论】:

    标签: corda


    【解决方案1】:

    为 Corda Enterprise 设置空数据库时,需要按照说明 here 设置角色和模式。之后,需要创建更改日志文件并将其添加到资源/迁移文件夹中。需要在更改日志中创建表并添加索引,例如下面的示例 (account-application.changelog-master.xml)。请注意额外的(未在 MappedSchema 中定义的) output_index 和 transaction_id 列,它们是必需的,否则将抛出缺少列的错误。这些用于将自定义模式与 Corda vault_schema 连接起来。

    <databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
    http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
    <changeSet author="R3.Corda" id="account_application_schema">
        <createTable tableName="account_application_states">
            <column name="member_id" type="uuid"/>
            <column name="type" type="varchar(255)"/>
            <column name="linear_id" type="uuid"/>
            <column name="output_index" type="int"/>
            <column name="transaction_id" type="varchar(255)"/>
        </createTable>
        <createIndex indexName="account_application_index_member_id" tableName="account_application_states" unique="false">
            <column name="member_id" type="uuid"/>
        </createIndex>
        <createIndex indexName="linear_id_account_application_index" tableName="account_application_states" unique="false">
            <column name="linear_id" type="uuid"/>
        </createIndex>
        <createIndex indexName="output_index_account_application_index" tableName="account_application_states" unique="false">
            <column name="output_index" type="int"/>
        </createIndex>
        <createIndex indexName="transaction_id_account_application_index" tableName="account_application_states" unique="false">
            <column name="transaction_id" type="varchar(255)"/>
        </createIndex>
    </changeSet>
    

    这个变更日志需要被 MappedSchema 引用,如下例所示:

    override val migrationResource = "account-application.changelog-master"
    
    @Entity
    @Table(name = "account_application_states",
            indexes = arrayOf(Index(name = "member_id_account_application_index", columnList = "member_id"), Index(name = "linear_id_account_application_index", columnList = "linear_id")))
    class PersistentAccountApplication(
        @Column(name = "member_id")
        val memberId: UUID,
    
        @Column(name = "type")
        val type: String,
    
        @Column(name = "linear_id")
        val linearId: UUID
    ) : PersistentState() {
        // Default constructor required by hibernate.
        constructor(): this(UUID.randomUUID(), "", UUID.randomUUID())
    }
    

    设置完成后,需要使用 Corda 数据库迁移工具来迁移表和列(外部数据库也需要在 node.conf 文件中进行配置,并且还描述了here)。数据库迁移工具的使用说明here。用于迁移的命令示例如下:

    java -jar corda-tools-database-manager-3.1.jar --base-directory /path/to/node --execute-migration
    

    如果每个节点的过程都成功完成,您应该能够启动节点并正常运行一切。

    【讨论】:

      【解决方案2】:

      您的变更日志需要包含标准 XML 架构定义:

      <databaseChangeLog
          xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
          xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.0.xsd
          http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
      

      更多详情请参阅here

      【讨论】:

        猜你喜欢
        • 2018-12-23
        • 2020-05-02
        • 2019-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-13
        • 2018-08-24
        • 1970-01-01
        相关资源
        最近更新 更多