Estoy trabajando con una base de datos postgreSQL, que se actualiza en lotes. Necesito saber cuándo fue la última vez que la base de datos (o una tabla en la base de datos)ha sido actualizado o modificado, o bien va a hacer.

Vi que alguien en el postgeSQL foro había sugerido que el uso de registro y la consulta de los registros de la época. Esto no va a funcionar para mí, ya que yo no tengo control sobre los clientes de la base de código.

5 Comentarios

  1. 26

    Puede escribir un gatillo para que se ejecute cada vez que un insert/update se hace en una tabla en particular. El uso común es el de establecer un «creado» o «last_updated» columna de la fila a la hora actual, pero también se puede actualizar el tiempo en una ubicación central si no quieres cambiar las tablas existentes.

    Así, por ejemplo, una forma típica es la siguiente:

    CREATE FUNCTION stamp_updated() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
    BEGIN
      NEW.last_updated := now();
      RETURN NEW;
    END
    $$;
    -- repeat for each table you need to track:
    ALTER TABLE sometable ADD COLUMN last_updated TIMESTAMP;
    CREATE TRIGGER sometable_stamp_updated
      BEFORE INSERT OR UPDATE ON sometable
      FOR EACH ROW EXECUTE PROCEDURE stamp_updated();

    A continuación, para encontrar la última actualización de tiempo, usted necesita para seleccionar «MAX(last_updated)» de cada mesa en la que se de seguimiento y tomar el mayor de ellos, por ejemplo:

    SELECT MAX(max_last_updated) FROM (
      SELECT MAX(last_updated) AS max_last_updated FROM sometable
      UNION ALL
      SELECT MAX(last_updated) FROM someothertable
    ) updates

    Para las tablas con una serie (o similar)-generado) primary key, usted puede tratar de evitar el examen secuencial para encontrar la más reciente actualización de tiempo mediante el índice de clave principal o crear índices en last_updated.

    -- get timestamp of row with highest id
    SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1

    Tenga en cuenta que esto puede dar un poco mal de resultados en el caso de los Identificadores de no ser muy secuencial, pero, ¿cuánto exactitud qué necesitas? (Tenga en cuenta que las transacciones significa que las filas pueden hacerse visibles en un orden diferente para ellos ser creado).

    Un enfoque alternativo para evitar la adición de ‘actualización’ de las columnas de cada tabla es tener una mesa central para almacenar la actualización de las marcas de tiempo en. Por ejemplo:

    CREATE TABLE update_log(table_name text PRIMARY KEY, updated timestamp NOT NULL DEFAULT now());
    CREATE FUNCTION stamp_update_log() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
    BEGIN
      INSERT INTO update_log(table_name) VALUES(TG_TABLE_NAME);
      RETURN NEW;
    END
    $$;
    -- Repeat for each table you need to track:
    CREATE TRIGGER sometable_stamp_update_log
     AFTER INSERT OR UPDATE ON sometable
     FOR EACH STATEMENT EXECUTE stamp_update_log();

    Esto le dará una tabla con una fila para cada actualización de la tabla: a continuación, puede simplemente hacer:

    SELECT MAX(updated) FROM update_log

    Para obtener la última actualización del tiempo. (Se puede dividir en la tabla si quería). Esta tabla será, por supuesto, sólo seguir creciendo: crear un índice en ‘actualizado’ (que debe hacer llegar el último, bastante rápido) o truncar periódicamente si que encaja con el caso de uso, (por ejemplo, un bloqueo exclusivo en la tabla, obtener la actualización más reciente en el tiempo, luego de truncar si usted necesita para comprobar periódicamente si se han realizado cambios).

    Un enfoque alternativo – que podría ser lo que la gente en el foro que significaba – es establecer ‘log_statement = mod» en la configuración de base de datos (ya sea a nivel mundial para el clúster, o en la base de datos o de usuario que usted necesita para realizar un seguimiento) y, a continuación, todas las declaraciones que modificar la base de datos se escriben en el registro del servidor. A continuación, tendrás que escribir algo fuera de la base de datos a escanear el registro del servidor, el filtrado de tablas que no están interesados en, etc.

  2. 4

    Me gusta Jack enfoque. Puede consultar la tabla de estadísticas y saber el número de inserciones, actualizaciones, eliminaciones y así:

    select n_tup_upd from pg_stat_user_tables  where relname = 'YOUR_TABLE';

    cada actualización va a aumentar el número de 1.

    desnudo en cuenta que este método es viable cuando se tiene una sola DB. varias instancias requerirá enfoque diferente, probablemente.

  3. 0

    Puede escribir un procedimiento almacenado en una «confianza» de lenguaje (por ejemplo, plpythonu): Esto permite el acceso a los archivos en el postgres «base» del directorio. Devolver el más grande mtime de estos archivos en el procedimiento almacenado.

    Pero esto es sólo vagos, ya vacío de cambiar estos archivos y el mtime.

Dejar respuesta

Please enter your comment!
Please enter your name here