Estoy buscando modificar cómo se realizan las copias de seguridad y me pregunto si hay una manera de determinar qué bases de datos en un clúster postgreql no se han cambiado recientemente.
En lugar de usar pg_dumpall, me gustaría usar pg_dump y solo volcar las bases de datos que han cambiado desde la última copia de seguridad (algunas bases de datos no se actualizan muy a menudo), la idea es que si nada ha cambiado, la copia de seguridad actual debería aun así se bueno.
¿Alguien sabe de una manera de determinar cuándo se actualizó / cambió por última vez una base de datos específica?
Gracias...
Actualizar:
Esperaba no tener que escribir disparadores en todo el lugar, ya que no tengo control sobre la creación de bases de datos en un clúster en particular (y mucho menos la creación de objetos db dentro de una base de datos).
Excavando más, parece que hay una correlación entre el contenido del archivo $ PGDATA / global / pg_database (específicamente el segundo campo) y los nombres de directorio bajo $ PGDATA / base.
Saliendo a la luz, supongo que el segundo campo del archivo pg_database es el oid de la base de datos y que cada base de datos tiene su propio subdirectorio bajo $ PGDATA / base (con el oid para el nombre del subdirectorio). ¿Es eso correcto? Si es así, ¿es razonable usar las marcas de tiempo del archivo de $ PGDATA / base / * como desencadenante para necesitar una copia de seguridad?
...¿O hay un mejor camino?
Gracias de nuevo...
fuente
Respuestas:
Si bien usar
select datname, xact_commit from pg_stat_database;
según lo sugerido por @Jack Douglas no funciona del todo (aparentemente debido al vacío automático),select datname, tup_inserted, tup_updated, tup_deleted from pg_stat_database
parece funcionar. Tanto los cambios DML como DDL cambiarán los valores de las columnas tup_ * mientras que avacuum
no lo hace (vacuum analyze
por otro lado ...).En caso de que esto pueda ser útil para otros, incluyo el script de respaldo que he implementado. Esto funciona para Pg 8.4.x pero no para 8.2.x-- YMMV dependiendo de la versión de Pg utilizada.
Actualización: el script se ha puesto en github aquí .
fuente
Parece que puede usar
pg_stat_database
para obtener un recuento de transacciones y verificar si esto cambia de una ejecución de copia de seguridad a la siguiente:Si alguien lo ha llamado,
pg_stat_reset
no puede estar seguro de si una base de datos ha cambiado o no, pero puede considerar que es poco probable que eso suceda, seguido de exactamente el número correcto de transacciones para que coincida con su última lectura.--EDITAR
vea esta pregunta SO por qué esto podría no funcionar No estoy seguro de por qué podría suceder esto, pero habilitar el registro podría arrojar algo de luz ...
fuente
pg_stat_reset
entonces la probabilidad de que el valor de xact_commit coincida con el anterior sería bastante baja, ¿no? Así que ciertamente parece captar la existencia de cambios DML. Ahora todo lo que necesito es atrapar si ha habido cambios DDL.create table ...
prueba rápida parece aumentar xact_commit.De cavar alrededor de los documentos de postgres y grupos de noticias:
txid_current()
le dará una nuevaxid
: si vuelve a llamar a la función en una fecha posterior, si obtiene unaxid
más alta, sabrá que no hay transacciones confirmadas entre las dos llamadas. Sin embargo, puede obtener falsos positivos, por ejemplo, si alguien llamatxid_current()
fuente
Recuerde la marca de tiempo en sus archivos que contienen los datos de la base de datos y observe si han cambiado. Si lo hicieron, hubo una escritura.
Editar después de la sugerencia de WAL: debe hacer esto solo después de vaciar las escrituras pendientes.
fuente
Postgresql 9.5 nos permite rastrear la última marca de tiempo modificada, consulte este enlace https://thirumal-opensource.blogspot.in/2017/03/to-track-last-modified-commit-or-get.html
fuente