批量后台迁移

  • 引入于 13.11 版本。部署在功能标志后,默认禁用。
  • 默认启用于 13.12 版本。
  • 对于私有化部署版,管理员可以选择禁用

禁用已发布的功能存在风险

要批量更新数据库表,极狐GitLab 可以使用批量后台迁移。这些迁移由极狐GitLab 开发者创建,并在升级时自动运行。但是,此类迁移的范围有限,无法帮助将某些 integer 数据库列迁移到 bigint。这是为了防止某些表的整数溢出。

启用或禁用批量后台迁移

caution如果禁用此功能标志,极狐GitLab 升级可能会失败。

批量后台迁移正在开发中,但已准备好用于生产。 它部署在默认启用的功能标志后面。有权访问 Rails 控制台的极狐GitLab 管理员可以选择禁用它。

启用:

Feature.enable(:execute_batched_migrations_on_schedule)

禁用:

Feature.disable(:execute_batched_migrations_on_schedule)

在 14.x 版本中暂停批处理后台迁移

要暂停正在进行的批量后台迁移,请使用上面的 disable 命令。 此命令使迁移完成当前批次,然后等待开始下一个批次。

使用以下数据库查询,来查看当前批量后台迁移的状态:

  1. 获取正在运行的迁移的 ID:

    SELECT
     id, 
     job_class_name,
     table_name,
     column_name,
     job_arguments
    FROM batched_background_migrations
    WHERE status <> 3;
    
  2. 运行此查询,将 XX 替换为您在上一步中获得的 ID,以查看迁移状态:

    SELECT
     started_at,
     finished_at,
     finished_at - started_at AS duration,
     min_value,
     max_value,
     batch_size,
     sub_batch_size
    FROM batched_background_migration_jobs
    WHERE batched_background_migration_id = XX
    ORDER BY id DESC
    limit 10;
    
  3. 在几分钟内多次运行查询,以确保没有添加新行。如果没有添加新行,则迁移已暂停。

  4. 确认迁移已暂停后,重新开始迁移(使用上面的 enable 命令),在准备好后继续进行批量处理。在较大的实例上,每批次后台迁移可能需要长达 48 小时才能完成。

自动批处理大小优化

  • 引入于 13.12 版本。
  • 对于私有化部署实例,管理员可以禁用此功能

禁用已发布的功能存在风险

为了最大化批量后台迁移的吞吐量(根据每个时间单位更新的元组数量),批处理大小会根据之前的批处理完成的时间自动调整。

启用或禁用自动批处理大小优化

批量后台迁移的自动批处理大小优化正在开发中,但已准备好用于生产。 它部署在默认启用的功能标志后面。有权访问 Rails 控制台的管理员可以选择禁用它。

启用:

Feature.enable(:optimize_batched_migrations)

禁用:

Feature.disable(:optimize_batched_migrations)

故障排除

手动完成批量后台迁移

引入于 14.1 版本。

如果由于错误需要手动完成批量后台迁移,可以运行:

sudo gitlab-rake gitlab:background_migrations:finalize[<job_class_name>,<table_name>,<column_name>,'<job_arguments>']

用正确的参数替换尖括号中的值。例如,您收到与此类似的错误:

StandardError: An error has occurred, all later migrations canceled:

Expected batched background migration for the given configuration to be marked as 'finished', but it is 'active':
  {:job_class_name=>"CopyColumnUsingBackgroundMigrationJob", :table_name=>"push_event_payloads", :column_name=>"event_id", :job_arguments=>[["event_id"], ["event_id_convert_to_bigint"]]}

将错误消息中的参数插入命令中:

sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,push_event_payloads,event_id,'[["event_id"]\, ["event_id_convert_to_bigint"]]']

如果您需要手动运行批量后台迁移以继续升级,您可以检查数据库中的状态并从查询结果中获取参数。例如,查询返回:

            job_class_name             | table_name | column_name |           job_arguments
---------------------------------------+------------+-------------+------------------------------------
 CopyColumnUsingBackgroundMigrationJob | events     | id          | [["id"], ["id_convert_to_bigint"]]

查询的结果可以插入到命令中:

sudo gitlab-rake gitlab:background_migrations:finalize[CopyColumnUsingBackgroundMigrationJob,events,id,'[["id"]\, ["id_convert_to_bigint"]]']

BackfillNamespaceIdForNamespaceRoute 批量迁移作业失败

在 14.8 版本中,BackfillNamespaceIdForNamespaceRoute 批处理后台迁移作业可能无法完成。重试时,会返回 500 Server Error。 此问题于 14.9 版本已解决。