Uso de pg_repack
Escenarios
pg_repack puede reorganizar tablas e índices con bloqueos mínimos para restaurar el orden físico. A diferencia de CLUSTER y VACUUM FULL, funciona en línea, sin tener una cerradura exclusiva en las mesas procesadas durante el procesamiento.
Restricciones
- Solo el usuario root puede usar pg_repack.
- La tabla de destino debe tener una clave principal o al menos un índice total único en una columna NOT NULL.
- La realización de un reempaquetado de tabla completa requiere espacio libre en disco aproximadamente el doble que la tabla de destino y sus índices.
- pg_repack no puede reorganizar tablas temporales o tablas de clúster mediante índices GiST.
- No podrá ejecutar comandos DDL de la tabla de destino excepto VACUUM o ANALYZE mientras pg_repack esté funcionando.
- pg_repack solo se puede usar después de que un cliente se implemente localmente. Para obtener más información, consulte la documentación oficial en https://reorg.github.io/pg_repack/.
Cómo usar
- Instalar el complemento.
select control_extension('create', 'pg_repack');
- Eliminar el complemento.
select control_extension('drop', 'pg_repack');
Para obtener más información, consulte Instalación y desinstalación de un complemento en la consola de RDS y Instalación y desinstalación de un complemento mediante comandos SQL.
Ejemplo
Utilizar pg_repack para volver a empaquetar una tabla.
- Crear una tabla de prueba de pg_repack_test.
create table pg_repack_test(id bigint primary key, name varchar);
insert into pg_repack_test select i , to_char(random()*100000, 'FM000000') from generate_series(1, 1000000) i;
delete from pg_repack_test where id in (select i from generate_series(1, 600000, 2) i);
select pg_size_pretty(pg_relation_size('pg_repack_test'));
- Reempaquetar la tabla de prueba.
pg_repack --host=<RDS_ADDRESS> --port=<DB_PORT> --dbname=<DB_NAME> --username=root --no-superuser-check --no-kill-backend -t pg_repack_test
- RDS_ADDRESS: dirección de IP de la instancia de base de datos de RDS.
- DB_PORT: Puerto de la instancia de base de datos de RDS.
- DB_NAME: Nombre de la base de datos donde se encuentra la tabla pg_repack_test.
- Comprobar el tamaño de la tabla reempaquetada.
select pg_size_pretty(pg_relation_size('pg_repack_test'));
Preguntas frecuentes
Información de error |
Solución |
---|---|
ERROR: pg_repack failed with error: ERROR: permission denied for schema repack |
Utilice el usuario root. |
ERROR: pg_repack failed with error: You must be a superuser to use pg_repack |
Agregue --no-superuser-check para omitir las comprobaciones de superusuario. |
NOTICE: Waiting for 1 transactions to finish. First PID: xxxx |
Espere hasta que se complete la transacción. |