Preciso adicionar uma chave primária a uma tabela grande do PostgreSQL (aproximadamente 2 TB) com alto tráfego. Esta é uma operação crítica e estou procurando orientação sobre como fazê-la com eficiência.
Eu já tentei os passos abaixo:
-- Step 1: Add id identity column
ALTER TABLE users
ADD COLUMN id BIGINT GENERATED ALWAYS as IDENTITY;
-- Step 2: Add unique index on (id, user_id) concurrently
CREATE UNIQUE INDEX CONCURRENTLY users_id_user_id_idx
ON users (id, user_id);
-- verify that step 2 is completed
-- Step 3: Add primary key
ALTER TABLE users
ADD CONSTRAINT users_pkey PRIMARY KEY USING INDEX users_id_user_id_idx;
Estou enfrentando dois problemas:
A tabela está completamente bloqueada na própria "Etapa 1".
Eu sei que isso é esperado, mas se houver alguma opção para evitar isso, sugira.
Eu recebo o erro abaixo,
ERRO: não foi possível estender o arquivo "base/16401/90996": Não há espaço restante no dispositivo DICA: Verifique o espaço livre em disco.
Mas ainda tenho espaço 600GB
de armazenamento no meu servidor.
Como a tabela ficará bloqueada na "Etapa 1", e se não houver opção para evitar isso, eu poderia aproveitar o tempo de inatividade e adicionar a id
coluna primeiro e depois executar os outros dois scripts.
Não sei se isso resolveria o erro de armazenamento.
Forneça sugestões para que eu possa adicionar o PK com o menor tempo de inatividade possível.
PostgreSQL v14.6