Iterace přes všechny databáze na více serverech

Z PostgreSQL
Skočit na navigaci Skočit na vyhledávání
Verze k tisku již není podporovaná a může obsahovat chyby s vykreslováním. Aktualizujte si prosím záložky ve svém prohlížeči a použijte prosím zabudovanou funkci prohlížeče pro tisknutí.

Cílem je identifikovat podezřelé databáze, která v určitém sloupečku učité tabulky obsahují pouze několik málo hodnot. Problémem je množství databází (s různými schématy) a množství databázových serverů.

Kombinací bashe, ssh a psql lze poměrně jednoduše takovou úlohu provést.

Nejdříve potřebujeme skript, který chceme spustit na každém serveru:

su - postgres -c '
for db in `psql -At -c "select datname from pg_database where not datistemplate and datallowconn limit 1000" postgres`;
do
  echo $db;
  psql -At -c  "select current_database(), \$_\$ALERT\$_\$ from pg_stats where attname = \$_\$foo_id\$_\$ and tablename like \$_\$bar%\$_\$ and n_distinct between 0 and 10" $db;
  psql -At -c  "select current_database(), \$_\$OK\$_\$ from pg_stats where attname = \$_\$foo_id\$_\$ and tablename like \$_\$bar%\$_\$ and NOT n_distinct between 0 and 10" $db;
done'

Dále potřebuje distribuční skript - skript se pustí na pozadí, vzdálená execuce se pustí paralelně:

for i in dbserver{21..26}; do echo $i; ( ssh -T -o StrictHostKeyChecking=no root@$i < check_pg_cluster.sh & )  ; done > log &