二进制模式演进
“二进制模式演变”(BSE)是一项非常实用的功能,它允许应用程序将存储的数据库映像的模式更新为当前运行的应用程序字典中定义的新结构。通过这一功能,您可以轻松地对数据库进行以下更改:
- 添加新类
- 删除类
- 向类中添加新字段
- 从类中删除字段
- 更改字段类型(例如,从 INT2 更改为 INT4 是允许的,但请注意这可能会导致精度损失;系统不会发出错误或警告)
- 添加或删除索引
- 向现有索引中添加或删除字段
- 将索引从唯一更改为非唯一(允许重复),反之亦然
请注意,如果存在重复值,将索引更改为唯一时会失败,mco_db_load() 将返回 MCO_S_DUPLICATE。在这种情况下,请不要继续执行 mco_db_connect(),因为这可能会导致致命错误。为了确保顺利更改索引,建议您首先遍历索引,检测并删除所有重复项,然后再更改模式并执行模式演进。
如果您需要向唯一索引添加新字段,并且打算同时添加该字段和唯一索引,建议分两步进行:
- 首先将该字段添加到模式中,并为其分配唯一的值;
- 然后再在模式中添加唯一索引,并在此第二次传递中执行模式演进。
在现有唯一索引中添加新字段的情况不应导致 mco_db_load() 返回 MCO_S_DUPLICATE,因为这不会引入新的重复项。
类名无法直接重命名。运行时会将旧类视为已被删除,并将新类视为全新的类。
SmartEDB 高可用性 BSE
SmartEDB 的高可用性(HA)运行时会自动将主节点的模式中的对象转换为副本节点的模式。此外,SmartEDB 集群运行时允许单个集群拥有不同的数据库模式。
如需了解更多详细信息,请参阅“HA 同步”和“集群实现细节”页面。
持久型数据库的二进制模式演变(BSE)
在打开持久型数据库的过程中(或指定数据库映像文件时),加载数据库字典时会自动应用二进制模式演变。SmartEDB 运行时会自动将保存映像的字典中出现的数据字段转换为当前打开的数据库字典中定义的类型,并将保存映像中不存在的数据字段设置为默认值。
不过请注意以下几点:
在模式文件末尾添加新类:当您在模式文件末尾添加新类时,SmartEDB 能够在 mco_db_connect() 期间自动执行有限的模式演变操作,这不会触发错误代码 MCO_E_DISK_SCHEMA_CHANGED,也无需调用 mco_db_save() / mco_db_load() 序列来应用 BSE。
在静态模式文件中间插入新类:在静态模式文件中间插入新类时请务必谨慎。通常情况下,尝试连接时会触发错误代码 MCO_E_DISK_SCHEMA_CHANGED,而不会执行 BSE。但在非常特殊的情况下,如果新类定义完全替换了另一个具有相同结构但名称不同的类定义,SmartEDB 不会将其视为新类定义,而是假定旧类已重命名。因此,不会发出 MCO_E_DISK_SCHEMA_CHANGED,对新类的引用可能会表现出令人困惑的行为。建议尽量避免这种情况。
示例
SDK 示例 18-backup/Migrate 展示了如何将现有的持久化数据库迁移到不同的模式。