Me gustaría particionar una tabla con 1M + filas por rango de fechas. ¿Cómo se hace esto comúnmente sin requerir mucho tiempo de inactividad o arriesgarse a perder datos? Estas son las estrategias que estoy considerando, pero abiertas a sugerencias:
La tabla existente es la maestra y los hijos heredan de ella. Con el tiempo, mueva los datos de maestro a hijo, pero habrá un período de tiempo en el que algunos de los datos estarán en la tabla maestra y otros en los hijos.
Cree una nueva tabla maestra y secundaria. Cree una copia de los datos en la tabla existente en las tablas secundarias (para que los datos residan en dos lugares). Una vez que las tablas secundarias tengan datos más recientes, cambie todas las inserciones en adelante para apuntar a una nueva tabla maestra y elimine la tabla existente.
fuente
DELETE FROM ONLY master_table
es la solución.Respuestas:
Como el n. ° 1 requiere copiar datos del maestro al hijo mientras está en un entorno de producción activo, personalmente fui con el n. ° 2 (crear un nuevo maestro). Esto evita interrupciones en la tabla original mientras está en uso activo y si hay algún problema, puedo eliminar fácilmente el nuevo maestro sin problemas y continuar usando la tabla original. Estos son los pasos para hacerlo:
Crear nueva tabla maestra.
Crea hijos que hereden del maestro.
Copie todos los datos históricos a la nueva tabla maestra
Pause temporalmente nuevas inserciones / actualizaciones en la base de datos de producción
Copie los datos más recientes a la nueva tabla maestra
Cambie el nombre de las tablas para que new_master se convierta en la base de datos de producción.
Agregue la función para las instrucciones INSERT a old_master para que los datos pasen a la partición correcta.
Agregue el disparador para que esa función se invoque en INSERTOS
Establezca la exclusión de restricción en ON
Vuelva a habilitar ACTUALIZACIONES e INSERTOS en la base de datos de producción
Configure el disparador o cron para que se creen nuevas particiones y la función se actualice para asignar nuevos datos a la partición correcta. Consulte este artículo para ver ejemplos de código
Eliminar old_master_backup
fuente
vacuum
no ponerse al día o evitarse debido a sesiones "inactivas en la transacción".Hay una nueva herramienta llamada pg_pathman ( https://github.com/postgrespro/pg_pathman ) que haría esto automáticamente por usted.
Entonces algo como lo siguiente lo haría.
fuente