批量后台迁移
要批量更新数据库表,极狐GitLab 可以使用批量后台迁移。这些迁移由极狐GitLab 开发者创建,并在升级时自动运行。但是,此类迁移的范围有限,无法帮助将某些 integer
数据库列迁移到 bigint
。这是为了防止某些表的整数溢出。
启用或禁用批量后台迁移
批量后台迁移正在开发中,但已准备好用于生产。 它部署在默认启用的功能标志后面。有权访问 Rails 控制台的极狐GitLab 管理员可以选择禁用它。
启用:
Feature.enable(:execute_batched_migrations_on_schedule)
禁用:
Feature.disable(:execute_batched_migrations_on_schedule)
在 14.x 版本中暂停批处理后台迁移
要暂停正在进行的批量后台迁移,请使用上面的 disable
命令。
此命令使迁移完成当前批次,然后等待开始下一个批次。
使用以下数据库查询,来查看当前批量后台迁移的状态:
-
获取正在运行的迁移的 ID:
SELECT id, job_class_name, table_name, column_name, job_arguments FROM batched_background_migrations WHERE status <> 3;
-
运行此查询,将
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;
-
在几分钟内多次运行查询,以确保没有添加新行。如果没有添加新行,则迁移已暂停。
-
确认迁移已暂停后,重新开始迁移(使用上面的
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 版本已解决。