Help us learn about your current experience with the documentation. Take the survey.

数据库迁移管道

通过自动化迁移测试管道, 我们可以在生产环境类似的环境中(使用Database Lab)自动测试迁移。 该管道基于架构设计文档

GitLab 项目中, 对于添加新数据库迁移的更改会启用迁移测试。 在 test 阶段手动运行 db:gitlabcom-database-testing 作业来触发此测试。 为避免浪费资源,仅在您的 MR 准备好审查时运行此作业。 此外,确保 MR 具有 “database” 标签,以便管道出现在测试阶段。

该作业在ops GitLab 实例上启动管道。 出于安全考虑,对管道的访问权限仅限于数据库管理员。

当管道启动时,机器人会在合并请求中通过评论通知您。 当测试完成时,评论会更新为测试结果。

该评论包含 mainci 数据库的测试信息。 每个测试的数据库都有以下四个部分。

摘要

评论的第一部分包含测试结果的摘要,包括:

  • 警告 - 突出显示关键问题,如异常或长时间运行的查询。
  • 迁移 - 每个迁移的完成时间、是否成功以及数据库大小的增量。
  • 运行时间直方图 - 展开此部分查看所有迁移的查询运行时间直方图。

迁移详情

评论的下一部分包含每个迁移的详细信息,包括:

  • 详情 - 迁移类型、总持续时间和数据库大小变化。
  • 查询 - 迁移期间执行的每个查询,以及调用次数、计时和更改的行数。
  • 运行时间直方图 - 显示该迁移查询时间的分布。

数据库大小增加

偶尔,即使迁移预计不会导致大小增加,也会显示 +8.00 KiB 的大小增加。 完成任何迁移都会在 schema_migrations 表中添加一行,这可能需要创建新的磁盘页面。 如果创建了新的磁盘页面,数据库大小将正好增加 8 KiB。

后台迁移详情

评论的下一部分包含每个批量后台迁移的详细信息,包括:

  • 采样信息 - 此测试运行期间采样的批次数。 采样的批次在表的 ID 范围内均匀选择。采样运行 30 分钟, 在每个要测试的后台迁移中平均分配。
  • 聚合查询信息 - 关于在所有采样批次中执行的每个查询的聚合数据, 包括调用次数、计时和更改的行数。
  • 批次运行时间直方图 - 来自该后台迁移的每个采样批次的计时直方图。
  • 查询运行时间直方图 - 在该后台迁移的任何批次中执行的所有查询的计时直方图。

克隆详情和工件

评论底部包含一些额外信息:

  • GitLab.com 上待处理的迁移 - 尚未部署到 GitLab.com 的迁移摘要。 当测试已合并但尚未部署的迁移时,此信息很有用。
  • 克隆详情 - 为此测试管道创建的 Postgres.ai 薄克隆的链接, 以及其过期信息。可用于进一步探索运行迁移的结果。 仅数据库管理员或通过访问请求可访问。
  • 工件 - 管道工件的链接。每个迁移的完整查询日志(以 .log 结尾)都可在那里获取, 仅数据库管理员或通过访问请求可访问。特定批量后台迁移采样批次的信息也可获取。

测试数据库测试管道的更改

要测试对数据库测试管道本身的更改,您需要:

  1. 针对 GitLab Org 的合并请求。
  2. 要测试的更改必须存在于 GitLab Ops 上的分支中。

使用此自记录脚本来测试 GitLab Org 上的合并请求与 GitLab Ops 上的任意分支:

#! /usr/bin/env bash

# 以下内容必须在每次调用时单独设置:
TESTING_TRIGGER_TOKEN='[REDACTED]'              # 在项目 CI 部分创建的测试触发令牌
CI_COMMIT_REF_NAME='55-post-notice-on-failure'  # 您要在 ops 上运行的分支
CI_MERGE_REQUEST_IID='117901'                   # 您要测试的 gitlab.com 上 MR 的合并请求 ID
SHA="fed6dd8a58d75a0e053a4972765b4fc08c5814a3"  # 您要在 gitlab-org/gitlab 上测试的分支 HEAD 的提交 SHA

# 以下内容在调用之间不应更改:
CI_JOB_URL='https://gitlab.com/gitlab-org/database-team/gitlab-com-database-testing/-/jobs/1590162939'
# CI_JOB_URL 似乎不必设置为特定值即可成功运行管道,
# 但这通常是调用 DB 测试管道的上游作业的 URL。
CI_MERGE_REQUEST_PROJECT_ID='278964'    # gitlab-org/gitlab 的数字 ID。不应更改。
CI_PROJECT_ID="gitlab-org/gitlab"       # 标识 gitlab-org/gitlab 的 slug。

curl --verbose --request POST \
     --form "token=$TESTING_TRIGGER_TOKEN" \
     --form "ref=$CI_COMMIT_REF_NAME" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_IID]=$CI_MERGE_REQUEST_IID" \
     --form "variables[TOP_UPSTREAM_MERGE_REQUEST_PROJECT_ID]=$CI_MERGE_REQUEST_PROJECT_ID" \
     --form "variables[TOP_UPSTREAM_SOURCE_JOB]=$CI_JOB_URL" \
     --form "variables[TOP_UPSTREAM_SOURCE_PROJECT]=$CI_PROJECT_ID" \
     --form "variables[VALIDATION_PIPELINE]=true" \
     --form "variables[GITLAB_COMMIT_SHA]=$SHA" \
     --form "variables[TRIGGER_SOURCE]=$CI_JOB_URL" \
     "https://ops.gitlab.net/api/v4/projects/429/trigger/pipeline"