标签: schema-migration

保持 protobuf 规范与关系数据库(例如 PostgreSQL)同步的最佳实践

1.我们有一个 Google 的 Protocol Buffers 格式的模式定义,我们用它来为不同的 gRPC 实现(Python、PHP)生成代码

2.我们有一个数据库 (PostreSQL),它从映射 Protocol Buffers 结构的 SQL 文件初始化。

问题: protobuf 规范经常发生变化。这必须反映在数据库中,这是一项繁琐的任务,手动完成时容易出错。

我们最近转移到 Alembic 迁移,以便在我们更新协议缓冲区规范时将持续更新迁移到(实时)数据库结构。但是,我们仍然觉得我们需要维护两个基本相同或至少非常相似的结构:ProtoBuf 和 SQL-Code(通过 Alembic Migrations 或在纯 *.sql 文件中管理)。

我一遍又一遍地搜索,关于其他人如何解决这个问题的信息很少。理想情况下,我们希望建立一个 CI/CD 流程,将 protobuf 规范(例如,消息名称从 更改teaspoonknife)转换为 SQL 模式定义(例如CREATE TABLE teaspoon (...);)或从中创建 SQL 迁移代码(例如ALTER TABLE teaspoon RENAME TO knife;)。

我知道它实际上比我的简单示例更复杂,但我什至找不到支持半自动和人工监督转换的代码。有什么建议吗?

到目前为止我发现了什么:

  • 从 SQL 文件,我们可以创建一个 PostgreSQL 数据库(例如在 Docker 中)并使用sqlacodegen自动创建一个 SQLAlchemy 模型
  • 从 SQLAlchemy 模型,我们可以使用 Alembic 迁移来创建(半)自动模式迁移代码
  • 我们回到零点:我们需要维护基本的 SQL 文件和 protobuf 规范
  • 有 …

postgresql schema-migration

10
推荐指数
1
解决办法
1862
查看次数

迁移现有表以使用 INT 主键而不是 UUID mysql v8

我很想听听大家对这个问题的看法。我目前在 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。感谢大家的回答和时间!我从测试中学到了很多东西。

mysql primary-key schema-migration

5
推荐指数
2
解决办法
1608
查看次数

我可以更改 cdc 架构的所有者吗?

我已使用以下命令在数据库上启用了更改数据捕获 (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

5
推荐指数
1
解决办法
221
查看次数