2010-07-09 75 views
13

En el servidor de desarrollo me gustaría eliminar las bases de datos no utilizadas. Para darme cuenta de que necesito saber si la base de datos todavía es utilizada por alguien o no.¿Cómo obtener el último acceso/fecha de modificación de una base de datos PostgreSQL?

¿Hay alguna forma de obtener el último acceso o fecha de modificación de una base de datos, esquema o tabla determinados?

+2

Todos los enfoques que se basan en las pruebas de la operación El tiempo de modificación del archivo del sistema es incorrecto, vea http://dba.stackexchange.com/a/58246/7788 –

Respuesta

9

Puede hacerlo comprobando la última hora de modificación del archivo de la tabla. en PostgreSQL, cada mesa se corresponden uno o más archivos de sistema operativo, así:

select relfilenode from pg_class where relname = 'test'; 

la relfilenode es el nombre de archivo de la tabla de "prueba" .A continuación, se puede encontrar el archivo en el directorio de la base de datos.

en mi entorno de prueba:

cd /data/pgdata/base/18976 

ls -l -t | head 

los últimos medios de control incluyen todos los archivos ordenados por la última fecha de modificación.

+0

Esto es incluso mejor. ¡Gracias! –

+6

Obtendrá falsos positivos debido a la actividad 'vacuum', la configuración de bit de sugerencia, etc. –

1

Supongo que deberías activar algunas opciones de registro. Puede obtener información sobre cómo iniciar sesión en postgreSQL here.

+0

I estaba esperando que haya forma de hacerlo con psql. Sin embargo, su sugerencia también puede usarse en scripts. Si todo lo demás falla, usaré los archivos de registro. ¡Gracias! –

+0

Los registros no mostrarán cosas como una tabla modificada mediante un 'seleccionar' de una función. Parece que va a estar bien para este caso de uso, pero no funcionará para las personas que buscan los tiempos de modificación reales. –

+0

http://dba.stackexchange.com/a/58246/7788 – user637338

1

Mi manera de conseguir la fecha de modificación de mis tablas:

función de Python

CREATE OR REPLACE FUNCTION py_get_file_modification_timestamp(afilename text) 
    RETURNS timestamp without time zone AS 
$BODY$ 
    import os 
    import datetime 
    return datetime.datetime.fromtimestamp(os.path.getmtime(afilename)) 
$BODY$ 
    LANGUAGE plpythonu VOLATILE 
    COST 100; 

consultas SQL

SELECT 
    schemaname, 
    tablename, 
    py_get_file_modification_timestamp('*postgresql_data_dir*/*tablespace_folder*/'||relfilenode) 
FROM 
    pg_class 
INNER JOIN 
    pg_catalog.pg_tables ON (tablename = relname) 
WHERE 
    schemaname = 'public' 

No estoy seguro de si las cosas como puede aspirar este lío aproach , pero en mis pruebas es una forma bastante acurrucada de obtener tablas que ya no se usan, al menos, en las operaciones INSERT/UPDATE.

+3

Esto es incorrecto por las razones dadas en la publicación vinculada en mi comentario sobre la pregunta principal. –

7

No hay una forma integrada de hacerlo - y all the approaches that check the file mtime described in other answers here are wrong. La única opción confiable es agregar desencadenantes a cada tabla que registre un cambio en una sola tabla de historial de cambios, lo que es terriblemente ineficiente y no puede hacerse retroactivamente.

Si solo le preocupa la "base de datos utilizada" frente a la "base de datos no utilizada", puede recopilar esta información de los archivos de registro de la base de datos con formato CSV. Detectar "modificado" frente a "no modificado" es mucho más difícil; considere SELECT writes_to_some_table(...).

Si no es necesario para detectar antigua actividad, puede utilizar pg_stat_database, que registra la actividad desde las últimas estadísticas restablecen. ej .:

-[ RECORD 6 ]--+------------------------------ 
datid   | 51160 
datname  | regress 
numbackends | 0 
xact_commit | 54224 
xact_rollback | 157 
blks_read  | 2591 
blks_hit  | 1592931 
tup_returned | 26658392 
tup_fetched | 327541 
tup_inserted | 1664 
tup_updated | 1371 
tup_deleted | 246 
conflicts  | 0 
temp_files  | 0 
temp_bytes  | 0 
deadlocks  | 0 
blk_read_time | 0 
blk_write_time | 0 
stats_reset | 2013-12-13 18:51:26.650521+08 

por lo que se puede ver que no tiene sido la actividad en este DB ya restablecer la última estadísticas. Sin embargo, no sé nada de lo que sucedió antes del reinicio de las estadísticas, por lo que si tuviera un DB que mostrara cero actividad desde que reinicié la cuenta hace media hora, no sabría nada útil.

3

PostgreSQL 9.5 nos permite rastrear el último compromiso modificado.

  1. Comprobar pista cometen es activado o desactivado con la siguiente consulta

    show track_commit_timestamp; 
    
  2. Si la vuelta "en" vaya al paso 3 cosa modificar postgresql.conf

    cd /etc/postgresql/9.5/main/ 
    vi postgresql.conf 
    

    Cambio

    track_commit_timestamp = off 
    

    a

    track_commit_timestamp = on 
    

    Reiniciar el sistema

    Repita el paso 1.

  3. Usar la siguiente consulta para realizar un seguimiento de la última confirmación

    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME; 
    
    SELECT pg_xact_commit_timestamp(xmin), * FROM YOUR_TABLE_NAME where COLUMN_NAME=VALUE; 
    
Cuestiones relacionadas