问题标签 [schema-migration]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
977 浏览

apache-spark - 复杂类型的模式演化

arraysspark中structs(复杂类型)的模式演变状态如何?

我知道对于常规简单类型的 ORC 或 Parquet 来说工作得很好(添加一个新列),但是到目前为止我找不到任何我想要的案例的文档。

我的用例是有一个类似于这个的结构:

我希望能够向数组中的结构添加新字段。

Map(键值)复杂类型会导致效率低下吗?在那里,我至少可以确定添加新字段(标签)会很灵活。

编辑

缺少其他列!为什么?

此行为针对 spark 2.2.3_2.11 和 2.4.2_2.12 进行了评估。

0 投票
1 回答
334 浏览

google-cloud-firestore - 架构更改的 Firestore 完整集合更新

我正在尝试找出一种可靠的策略来处理 Firestore 中的架构更改。我的想法是,架构更改通常需要读取然后写入集合中的每个文档(或者可能是不同集合中的文档)。

以下是我的担忧:

  • 不知道以后的收藏有多大。在单个查询中可以读取多少个文档时,我会遇到任何限制吗?
  • 我目前的计划是从 Cloud Build 运行架构更改脚本。这可能会超时吗?
  • 进行实际更新的最有效方法是什么?(例如读取文档,将更新写入文档,重复...)
  • 我应该使用批量写入吗?

另外,如果您认为这是实现架构更改的完全错误方法,请随时告诉我,并提出更好的解决方案。

0 投票
1 回答
182 浏览

ruby-on-rails - 当我在数据迁移之前运行模式迁移时,使用 ActiveRecord,数据库中的数据没有正确更新

截至目前,我有一个包含列的用户表 id, name, email, status

statusfield 是一个整数类型,其值 1 和 2 分别代表一个活跃用户和非活跃用户。

我想将status字段更改为字符串类型并迁移数据 - 将 1 转换为“活动”,将 2 转换为“非活动”

我生成了2个迁移文件rails g migration

user.rb

db/migrate/20190906115523_update_user_status_type.rb

db/migrate/20190906115828_update_user_statuses.rb

运行后rails db:migrate

Expected:迁移完成后,每个用户的状态都应转换为“活动”或“非活动”。

Actual Results:每个用户的状态都转换为"0"字符串类型。

0 投票
1 回答
1210 浏览

postgresql - 如何实现 PostgreSQL 数据库的架构迁移

我需要为 PostgreSQL 实现模式迁移机制。只是为了消除歧义:对于模式迁移,我的意思是我需要将我的数据库结构升级到最新版本,而不管它们在特定服务器实例上的当前状态如何。

例如,在版本一中我创建了一些表,然后在版本二中我重命名了一些列,在版本三中我删除了一个表并创建了另一个。我有多个服务器,在其中一些服务器上我有版本一,一些版本三等。

我的想法:

  • 为产生的输出生成哈希

pg_dump --schema-only

每次在我更改数据库架构之前。这将是一种可靠的方式来识别将来应该应用补丁的数据库版本。

  • 包含补丁列表以及它们应该应用的相关散列。
  • 当我需要升级我的数据库时,我将运行一个应用程序来搜索与当前数据库结构相对应的哈希(通过计算本地数据库的哈希并将其与我拥有的哈希集进行比较)并应用相关的补丁。
  • 重复直到找不到下一个哈希。

您能否指出这种方法的任何弱点?

0 投票
1 回答
748 浏览

database-migration - 异步运行 Flyway 迁移

按照设计,flyway 迁移在事务中运行,并且在应用程序启动期间很早就同步。这通常是需要的,以确保在业务逻辑开始执行之前数据库处于一致状态(已迁移)或迁移失败并且应用程序崩溃。

在某些情况下,我真的希望能够启动应用程序而无需等待某些迁移完成(长时间运行的迁移、创建索引或物化视图等)。从 CI 服务器部署并使用部署超时/健康检查(不能无限期地提高)以确保部署按预期工作时,也可能需要这样做。

是否有任何配置/约定/最佳实践来启用异步迁移?
(即命名迁移A2_00__UpdateSthLong.sql而不是 V2(标准)或 R2(可重复迁移)。

0 投票
1 回答
123 浏览

postgresql - 部署不同分支时管理 Sqitch 迁移

当我们使用 Sqitch 部署到我们的测试环境时,迁移运行并且一切正常。但是,当我们必须测试不同的代码分支时,Sqitch 迁移不会回滚。我正在寻找的是其他人如何解决这个问题的想法。例如,如果我有一个创建 table 的迁移my_table,然后从不同的分支部署迁移,Sqitch 会感到困惑而无法继续前进。

分支更改的原因:我们有使用develop分支的功能,并且正在应用修补程序master(我知道;我们将更改它)。交换来测试一个修补程序导致了所有这些混乱。

我们考虑让 Jenkins 作业来运行 asqitch revert并让用户提供要回滚的迁移,但我们希望消除手动步骤。

必须切换代码分支时如何管理迁移?

0 投票
2 回答
2422 浏览

google-cloud-platform - 如何通过 Terraform 管理 BigQuery 表的架构更改

我们目前使用以下机制创建具有预定义架构的 BigQuery 表,并创建了基础架构。

https://www.terraform.io/docs/providers/google/r/bigquery_table.html

开发团队决定通过添加另一列来修改架构,因此我们计划修改上述 terraform 脚本中的架构更改以启用此功能。

在生产环境中管理此类模式迁移的最佳方法是什么?

由于在生产环境中,我们希望在执行模式迁移时保留表数据

0 投票
1 回答
730 浏览

mongodb - 运行数据库架构迁移的最佳实践

构建服务器通常与运行实例的 VPC 分离。无论是 GCP 上的 Cloud Build,还是利用众多 CI 工具之一(CircleCI、Codeship 等),因此运行数据库模式更新特别具有挑战性。

所以,这让我想知道......什么时候运行数据库模式迁移的最佳位置?

从我的角度来看,有四种机会可以在 CD 管道中自动运行模式迁移或种子:

  1. 在构建阶段
  2. 在实例启动时
  3. 通过预热脚本(同步或异步)
  4. 通过端点,自动或手动调用部署后

选项 1 的主要问题是安全性。使用 Google Cloud Sql/Google Cloud Build,我可以通过构建步骤和 SQL 代理运行(非常困难)、模式迁移/种子。老实说,设置起来真是让人头疼……但它确实有效。

我的最新项目是使用 MongoDb,如果我需要移动一些数据/播种一些数据,我已经在 migrate-mongo 中连接了它。不幸的是,没有这样的 SQL 代理可以安全地将 MongoDb(atlas)连接到 Cloud Build(或任何其他 CI 工具),因为它不在实例的 VPC 中运行。因此,在我看来,这是一条死胡同。

因此,我对热身脚本概念进行了加热(不是双关语)。

使用 App Engine,在提供流量之前调用预热脚本,并在已经通过 VPC 访问的主机上调用。预热脚本旨在用于打开数据库连接以加快连接速度,但假设没有未完成的迁移,它会这样做 - 一个非常轻量级的 select 语句。

谁能想到这种方法有什么问题?

选项 4 也很合适(本质上是一样的)。不过,这些端点可能需要更多保护 - 特别是如果存在“向下”迁移脚本(!)

0 投票
1 回答
92 浏览

mysql - 幽灵/复制表比原始表大很多倍

信息:我正在使用 AWS RDS Mysql 5.6.34 (500GB) 实例(没有副本,只有主)

注意: Binlog 已启用并设置为 Row

目标:将列field_1从枚举修改为tinyint

额外信息:我正在使用 Rails 应用程序。所以每次我想为枚举添加一个值时,我都需要编写一个迁移。因此,将枚举字段转换为 tinyint,这样我就可以添加或删除枚举值,而无需使用Active Enum编写迁移

其他信息:我也尝试过LHM,但 RDS 实例内存不足 93%

运行 gh-ost 之前的数据库信息:

gh-ost前原表的大小:(从列表中只显示需要修改的表)

开始迁移:

当迁移完成近 93% 时,RDS 可用内存降至 20GB。所以我停止了 gh-ost。

停止 gh-ost 后的数据库信息:

停止 gh-ost 后原始表的大小:

问题:

为什么gh-ost表比原表大很多倍?

如果需要有关表、索引或数据库的更多信息,我可以提供:)

这是在 gh-ost 存储库中创建的问题的链接:https ://github.com/github/gh-ost/issues/890

0 投票
2 回答
346 浏览

java - 从 Docker 容器运行 MyBatis 迁移的最正确方法

我试图弄清楚如何以及何时从部署在 Docker Swarm 中的 Docker 容器运行 mybatis 模式迁移。我的意思是:我需要最正确的方法来做到这一点。

目前我们从 Dockerfile 构建一个 Docker 容器

然后 start.sh 脚本包含

但是通过这种方式,我们必须从 Ubuntu 构建一个映像,安装 Maven 并将环境“硬编码”到 start.sh 文件中的迁移午餐,所以我们需要来自不同环境的不同文件。

您认为在构建/部署过程中运行这些方案迁移的最正确方法是什么?

提前致谢。

编辑:我发现使用在 DockerHub 上找到并由@h3adache 发布的 mybatis 迁移 docker 映像的解决方案很有用,但仍然有一个问题试图在 DockerSwarm 上执行它:该问题与安装在主机文件夹之间的卷有关带有 mybatis 迁移文件和容器文件夹“/migration”

我的 docker-compose.yml 是

它在本地对 dockerized MySQL 运行良好,但在使用 GitLab 管道部署期间失败。

显然,当我签出代码时,该./mybatis-migrations文件夹位于我的本地主机上,并且当 GitLab 运行程序构建所有内容但不在 DockerSwarm 主机上时,它位于 GitLab 存储库的构建路径中,因此无法找到该目录。

这是错误消息:

“绑定”类型的挂载配置无效:绑定源路径不存在

我怎样才能解决这个问题?