Swap MergeRequest ID columns (Step 2)
# Timeline of bigint column migration on `merge_requests` table We split the Step 2 of bigint migration into 3 stages to avoid possible issues related to WAL rate caused by creating two many indexes all at once. Please see https://gitlab.com/gitlab-org/gitlab/-/issues/507695#note_2595156011 for more information about how we're splitting these up. We will append MRs as we created to each steps below for tracking purposes. # Stage 1 * Step 1: Async index creation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/196224+, Have run [on weekend 30th Aug 2025](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/196224#note_2721094201) on GitLab.com * Step 2: Async FK creation / validation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/203213+ - Have run [on weekend 6th Sep 2025](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/203213#note_2737941131) * Step 3: Swap columns, index & FK removal * https://gitlab.com/gitlab-org/gitlab/-/merge_requests/203979+ - Have run [on weekend 10th Nov 2025](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/20701) for CR We add two MRs as users reporting existing mr indexes are missing from old instances, causing the bigint swap migration failure. For next two stages, we will also add these kind of MRs as well. - https://gitlab.com/gitlab-org/gitlab/-/work_items/581662+ - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/215161+ - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/215501+ `assignee_id`, `merge_user_id`, `updated_by_id`, `milestone_id`, `source_project_id` related ```sql "index_merge_requests_on_assignee_id" btree (assignee_id) "index_merge_requests_on_merge_user_id" btree (merge_user_id) WHERE merge_user_id IS NOT NULL "index_merge_requests_on_updated_by_id" btree (updated_by_id) WHERE updated_by_id IS NOT NULL "index_merge_requests_on_milestone_id" btree (milestone_id) "idx_merge_requests_on_source_project_and_branch_tate_opened" btree (source_project_id, source_branch) WHERE state_id = 1 "index_merge_requests_on_source_project_id_and_source_branch" btree (source_project_id, source_branch) ``` ```sql ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_6149611a04 FOREIGN KEY (assignee_id) REFERENCES users(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_641731faff FOREIGN KEY (updated_by_id) REFERENCES users(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_6a5165a692 FOREIGN KEY (milestone_id) REFERENCES milestones(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_ad525e1f87 FOREIGN KEY (merge_user_id) REFERENCES users(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_source_project FOREIGN KEY (source_project_id) REFERENCES projects(id) ON DELETE SET NULL; ``` # Stage 2 * Step 1: Async index creation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/204153+ - Have run [on weekend 30th Nov 2025](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/204153#note_2922803434) * Step 2: Async FK creation / validation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/212201+ - Have run on [weekend 14th Dec 2025](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/212201#note_2952988398) * Step 3: Swap columns, index & FK removal - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/216433+ - Have run [on weekend 25th Jan 2026](https://gitlab.com/gitlab-com/gl-infra/production/-/issues/20863#note_3032544433) `target_project_id` and `latest_merge_request_diff_id` and `last_edited_by_id` related ```sql "index_merge_requests_on_target_project_id_and_iid" UNIQUE, btree (target_project_id, iid) "index_merge_requests_on_target_project_id_and_merged_commit_sha" btree (target_project_id, merged_commit_sha) "index_merge_requests_on_target_project_id_and_source_branch" btree (target_project_id, source_branch) "index_merge_requests_on_target_project_id_and_squash_commit_sha" btree (target_project_id, squash_commit_sha) "index_merge_requests_on_target_project_id_and_target_branch" btree (target_project_id, target_branch) WHERE state_id = 1 AND merge_when_pipeline_succeeds = true "index_merge_requests_on_latest_merge_request_diff_id" btree (latest_merge_request_diff_id) "index_merge_requests_for_latest_diffs_with_state_merged" btree (latest_merge_request_diff_id, target_project_id) WHERE state_id = 3 -- Following indexes are recreated due to other column migration "idx_mrs_on_target_id_and_created_at_and_state_id" btree (target_project_id, state_id, created_at, id) "index_merge_requests_on_target_project_id_and_created_at_and_id" btree (target_project_id, created_at, id) "index_merge_requests_on_target_project_id_and_updated_at_and_id" btree (target_project_id, updated_at, id) "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id" btree (target_project_id, merge_commit_sha, id) "index_merge_requests_on_author_id_and_target_project_id" btree (author_id, target_project_id) "index_on_merge_requests_for_latest_diffs" btree (target_project_id) INCLUDE (id, latest_merge_request_diff_id) ``` ```sql ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_a6963e8447 FOREIGN KEY (target_project_id) REFERENCES projects(id) ON DELETE CASCADE; ALTER TABLE p_generated_ref_commits ADD CONSTRAINT fk_generated_ref_commits_merge_request_id FOREIGN KEY (project_id, merge_request_iid) REFERENCES merge_requests(target_project_id, iid) ON DELETE CASCADE; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_06067f5644 FOREIGN KEY (latest_merge_request_diff_id) REFERENCES merge_request_diffs(id) ON DELETE SET NULL; ``` ## Stage 3 * Step 1: Async index creation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/220712+ - Have run on [weekend 22th Feb 2026](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/220712#note_3104001799) * Step 2: Async FK creation / validation (wait 1 weekend for execution) - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/221813+ - Have run on [weekend 8th Mar 2026](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/225419#note_3161365909) * Step 3: Swap columns, index & FK removal - https://gitlab.com/gitlab-org/gitlab/-/merge_requests/225419+ - Have run on [weekend 12th April 2026](https://gitlab.com/gitlab-com/gl-infra/production/-/work_items/21427#note_3243326255) `id` and `author_id` related ```sql "merge_requests_pkey" PRIMARY KEY, btree (id) "idx_merge_requests_on_id_and_merge_jid" btree (id, merge_jid) WHERE merge_jid IS NOT NULL AND state_id = 4 "idx_merge_requests_on_merged_state" btree (id) WHERE state_id = 3 "idx_merge_requests_on_unmerged_state_id" btree (id) WHERE state_id <> 3 "index_merge_requests_on_author_id_and_id" btree (author_id, id) "index_merge_requests_on_author_id_and_created_at" btree (author_id, created_at) -- Following indexes are recreated due to other column migration "idx_mrs_on_target_id_and_created_at_and_state_id" btree (target_project_id, state_id, created_at, id) "index_merge_requests_on_target_project_id_and_created_at_and_id" btree (target_project_id, created_at, id) "index_merge_requests_on_target_project_id_and_updated_at_and_id" btree (target_project_id, updated_at, id) "index_merge_requests_on_tp_id_and_merge_commit_sha_and_id" btree (target_project_id, merge_commit_sha, id) "index_on_merge_requests_for_latest_diffs" btree (target_project_id) INCLUDE (id, latest_merge_request_diff_id) "index_merge_requests_on_author_id_and_target_project_id" btree (author_id, target_project_id) ``` ```sql ALTER TABLE ONLY environments ADD CONSTRAINT fk_01a033a308 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_request_assignment_events ADD CONSTRAINT fk_08f7602bfd FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY scan_result_policy_violations ADD CONSTRAINT fk_17ce579abf FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_requests_compliance_violations ADD CONSTRAINT fk_290ec1ab02 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY approvals ADD CONSTRAINT fk_310d714958 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY agent_activity_events ADD CONSTRAINT fk_3af186389b FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE SET NULL; ALTER TABLE ONLY merge_requests_approval_rules_merge_requests ADD CONSTRAINT fk_74e3466397 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_diffs ADD CONSTRAINT fk_8483f3258f FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY security_policy_dismissals ADD CONSTRAINT fk_bc10da1827 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_requests ADD CONSTRAINT fk_e719a85f8a FOREIGN KEY (author_id) REFERENCES users(id) ON DELETE SET NULL; ALTER TABLE ONLY duo_workflows_workflows ADD CONSTRAINT fk_ed58162ace FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY status_check_responses ADD CONSTRAINT fk_f3953d86c6 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY approval_policy_merge_request_bypass_events ADD CONSTRAINT fk_f39e177609 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY approval_merge_request_rules ADD CONSTRAINT fk_rails_004ce82224 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_context_commits ADD CONSTRAINT fk_rails_0fe0039f60 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY description_versions ADD CONSTRAINT fk_rails_12b144011c FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY resource_state_events ADD CONSTRAINT fk_rails_3112bba7dc FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_blocks ADD CONSTRAINT fk_rails_364d4bea8b FOREIGN KEY (blocked_merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_assignees ADD CONSTRAINT fk_rails_443443ce6f FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_requests_closing_issues ADD CONSTRAINT fk_rails_458eda8667 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_merge_schedules ADD CONSTRAINT fk_rails_5294434bc3 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE merge_requests_merge_data ADD CONSTRAINT fk_rails_593f9b7924 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY reviews ADD CONSTRAINT fk_rails_5ca11d8c31 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_approval_metrics ADD CONSTRAINT fk_rails_5cb1ca73f8 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY resource_iteration_events ADD CONSTRAINT fk_rails_6830c13ac1 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY resource_state_events ADD CONSTRAINT fk_rails_7ddc5f7457 FOREIGN KEY (source_merge_request_id) REFERENCES merge_requests(id) ON DELETE SET NULL; ALTER TABLE ONLY deployment_merge_requests ADD CONSTRAINT fk_rails_86a6d8bf12 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY excluded_merge_requests ADD CONSTRAINT fk_rails_8c973feffa FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_cleanup_schedules ADD CONSTRAINT fk_rails_92dd0e705c FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY resource_label_events ADD CONSTRAINT fk_rails_9851a00031 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY resource_milestone_events ADD CONSTRAINT fk_rails_a006df5590 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_user_mentions ADD CONSTRAINT fk_rails_aa1b2961b1 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_trains ADD CONSTRAINT fk_rails_b374b5225d FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_predictions ADD CONSTRAINT fk_rails_b3b78cbcd0 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_reviewers ADD CONSTRAINT fk_rails_d9fec24b9d FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_metrics ADD CONSTRAINT fk_rails_e6d7c24d1b FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY draft_notes ADD CONSTRAINT fk_rails_e753681674 FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY merge_request_blocks ADD CONSTRAINT fk_rails_e9387863bc FOREIGN KEY (blocking_merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ALTER TABLE ONLY timelogs ADD CONSTRAINT fk_timelogs_merge_requests_merge_request_id FOREIGN KEY (merge_request_id) REFERENCES merge_requests(id) ON DELETE CASCADE; ``` ## NOT TOUCHED ```sql "index_merge_requests_on_sprint_id" btree (sprint_id) "index_merge_requests_on_created_at" btree (created_at) "index_merge_requests_on_source_branch" btree (source_branch) "index_merge_requests_on_title_trigram" gin (title gin_trgm_ops) WITH (fastupdate='false') "index_merge_requests_on_description_trigram" gin (description gin_trgm_ops) WITH (fastupdate='false') "index_merge_requests_on_head_pipeline_id" btree (head_pipeline_id) "index_merge_requests_on_target_branch" btree (target_branch) ``` ## Next Step After above stages in Step 2 are all finished, we would move on to step 3 and 4 in follow up issues. * Step 3: [Remove the trigger and all old integer columns](https://gitlab.com/gitlab-org/gitlab/-/issues/507696) * Step 4: [Remove ignore rules](https://gitlab.com/gitlab-org/gitlab/-/issues/507697)
issue