1.我们有一个 Google 的 Protocol Buffers 格式的模式定义,我们用它来为不同的 gRPC 实现(Python、PHP)生成代码
2.我们有一个数据库 (PostreSQL),它从映射 Protocol Buffers 结构的 SQL 文件初始化。
问题: protobuf 规范经常发生变化。这必须反映在数据库中,这是一项繁琐的任务,手动完成时容易出错。
我们最近转移到 Alembic 迁移,以便在我们更新协议缓冲区规范时将持续更新迁移到(实时)数据库结构。但是,我们仍然觉得我们需要维护两个基本相同或至少非常相似的结构:ProtoBuf 和 SQL-Code(通过 Alembic Migrations 或在纯 *.sql 文件中管理)。
我一遍又一遍地搜索,关于其他人如何解决这个问题的信息很少。理想情况下,我们希望建立一个 CI/CD 流程,将 protobuf 规范(例如,消息名称从 更改teaspoon为knife)转换为 SQL 模式定义(例如CREATE TABLE teaspoon (...);)或从中创建 SQL 迁移代码(例如ALTER TABLE teaspoon RENAME TO knife;)。
我知道它实际上比我的简单示例更复杂,但我什至找不到支持半自动和人工监督转换的代码。有什么建议吗?
到目前为止我发现了什么:
我很想听听大家对这个问题的看法。我目前在 RDS 中使用 Innodb mysql v8。我们的数据库中等,有大约 130 个表,大多数都很小,最大的表在 6 年内有大约 3000 万行。目前,我们已经将 RDS 即时垂直扩展得比我们的数据库需要的要大得多,但我们仍然受到 CPU 限制,并且无法使用副本,因为从属设备落后太多了。我确信这是因为我们将 UUID 版本 1 作为表的主键,并且必须为我们的应用程序进行大量字符串比较。
我想做的是通过创建使用自动递增 INT 作为主键和外键的表子集来证明这一点,但我正在努力了解这是如何工作的。如果我只是向当前表添加一个自动递增列,我们的 ORM 使用的查询将不会包含它,因此不会有太大的收益。我想知道如何使用转换表将值从 UUID 交换到 INT。例如,ORM 查询现在的内容如下:
select id_primary_key from table_old where id_foreign_key in (UUID1, UUID2, UUID3) ,输出为:1d3sed4a-5812-a35c-0204-515f6at42b46
如果我创建一个包含 auto_inc INT 和旧 UUID 的转换表,那么下一步是什么,以便当 ORM 运行该查询时,它针对 INT 而不是 UUID 进行查询?
select id_primary_key from table_new where id_foreign_key in (1, 2, 3) 输出:58743
有什么想法吗?
更新——看来我们将来会研究更多的全局模型,其中有多个数据库,因此将保留 UUID。我们将尝试走分片路线,并尝试将它们存储为 VARBINARY(16) 并使用 UUIDtoBIN() 并将交换标志设置为 true,因为我们使用的是 UUID v1。感谢大家的回答和时间!我从测试中学到了很多东西。
我已使用以下命令在数据库上启用了更改数据捕获 (CDC)exec sys.sp_cdc_enable_db
这将创建一个由cdc用户拥有的新cdc架构
select
s.*
, dp.name
from sys.schemas as s
join sys.database_principals as dp
on dp.principal_id = s.principal_id
Run Code Online (Sandbox Code Playgroud)
因为我想利用所有权链接并使用 proc 从此架构中读取数据,所以我可以将所有者更改为dbo吗?
ALTER AUTHORIZATION ON SCHEMA::cdc TO dbo
Run Code Online (Sandbox Code Playgroud)
此命令起作用并更改所有者。但疾病预防控制中心已经启用了一段时间,我担心未来会进一步破坏一些东西。
security change-data-capture owner sql-server-2019 schema-migration