May 17, 2026, 11:40 PM

This commit is contained in:
Paweł Domański
2026-05-18 06:40:19 +00:00
commit 64944cf004
896 changed files with 310709 additions and 0 deletions
@@ -0,0 +1,49 @@
These scripts should work on all versions of PostgreSQL up to 9.4
Most have options to specify host and port.
./<script> -h shows all options
cache_hit_ratio.sh -> Shows the cache hit ration for all databases
cancel_all_queries.sh -> Terminates all queries in progress
check_postgresql_log.sh -> greps the postgres log file for ERROR, WARNING and ref's to pg_hba. You will probably need to edit and adjust the directory path and suffix for your cluster.
columns_of_type_x -> Shows all tables and columns with specific character type
connect_count.sh -> Shows connection count for each database
current_locks.sh -> Shows status for all current locks
current_queries.sh -> Shows information on all current queries, will loop continuously unless -x option is specified. -s option specifies sleeptime, default is 5 secs. -i will ignore <IDLE> queries
database_sizes.sh -> shows size of all databases
filename_tables.sh -> shows physical directory, filename, owner & size for all tables in specified database
flip_database_connect.sh -> Flips state of datallowconn for database
get_trans_min_cnt.sh -> shows transaction count per minute for cluster
groups_users.sh -> shows all groups & members in cluster and if group or user is a superuser
index_bloat.sh -> shows index ration to table size for all indexes of all or specified table in database.
index_comments.sh -> shows comments on all or specified index for database
logins_block.sh -> prevents all non-superusers from future logins. MUST be run as user postgres
logins_allow.sh -> re-allows login access to all normal users. MUST be run as user postgres
pg_backup.sh -> generic backup script for postgres database. You will need to edit and adjust for your needs.
pg_runtime.sh -> shows startup and continuous runtime for the cluster
pg_stat_all_indexes.sh -> shows stats and status of all indexes or just for specified table
pg_stat_all_tables.sh -> shows stats for all or specified table
pg_vacuum_time.sh -> Shows total time to vacuum a database
remove_ctrl.sh -> removes control characters from a script. Useful if script was created on a windows PC and then copied to Linux
role_members.sh -> Shows roles and all members
slony_status.sh -> shows status and lag time of slony cluster. Should be run on master node.
table_column_stats.sh -> shows stats for all columns of specified table
table_comments.sh -> shows comments for all or specified table
table_dependents.sh -> shows foreign key constraints for all or specified table
table_in_functions.sh -> shows all functions that reference specified table
table_in_trogger.sh -> shows all triggerss that reference specified table
tables_and_owners.sh -> shows owners and permits on all tables
tables-filenames.sh -> shows physical directory, filename, owner & size for all tables in specified database
table_sizes.sh -> shows tuple count and size for all or specified table
tablespace_use.sh -> shows tablespace used by all or specified table/index
tables_with_column_name.sh -> shows all tables that have a column name LIKE specified column name
tables_with_FKS.sh -> shows all tables taht have a foreign key constraint
tables_with_no_public_grants.sh -> shows tables that have no public grants (restricted table)
triggers_and_constraints.sh -> shows all triggers and called functions for all or specified table
user_table_access_detail.sh -> shows table access for specified user
user_table_access.sh -> shows permit and position in permit for specified user
@@ -0,0 +1,49 @@
#!/bin/bash
# Shows cache hit ratio for all databases
USER=""
PORT=""
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $USER $HOST $PORT $DBNAME <<_EOF_
SELECT pg_stat_database.datname,
pg_stat_database.blks_read,
pg_stat_database.blks_hit,
round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+1)::double precision * 100::double precision)::numeric, 2) AS cachehitratio
FROM pg_stat_database
WHERE pg_stat_database.datname !~ '^(template(0|1)|postgres)$'::text
ORDER BY round((pg_stat_database.blks_hit::double precision
/ (pg_stat_database.blks_read
+ pg_stat_database.blks_hit
+ 1)::double precision * 100::double precision)::numeric, 2) DESC;
_EOF_
@@ -0,0 +1,52 @@
#!/bin/bash
usage() {
echo "Usage: $0 [-h <host> -p <port>]"
echo "-p will default to 5432"
exit 1
}
while getopts "h:p:" OPT;
do case "${OPT}" in
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $HOST $PORT -U postgres <<_QRYVER_
SELECT substring(version() from 12 for 1);
_QRYVER_
)
}
cancel_pids()
{
psql -t $HOST $PORT -U postgres <<_QRYVER_
--SELECT pg_cancel_backend($PID)
SELECT pg_terminate_backend($PID)
FROM pg_stat_activity WHERE pg_backend_pid() <> $PID);
_QRYVER_
}
##### MAIN #####
getveri
declare -i VER
if [ "$VER" -lt 9 ]
then
PID="procpid"
else
PID="pid"
fi
cancel_pids
exit 0;
@@ -0,0 +1,35 @@
#!/bin/bash
# if arguments > 0, set count option
if [ $# -eq 0 ]
then
cntflg='-c'
else
cntflg=''
fi
set $(date '+%m%d')
MMDD=$1
#set $(date)
## if day number less than 10, prefix a '0'
#if [ $3 -le 9 ]
# then
# DD=0${3}
# else
# DD=${3}
#fi
set $(date +%m)
MM=${1}
logdir=/var/log/postgresql/
echo "Current error log is: ${logdir}postgresql.${MMDD}"
echo
echo -n "ERROR: "
grep ${cntflg} -i ERROR ${logdir}postgresql.${MMDD}
echo -n "WARNING: "
grep ${cntflg} -i WARNING ${logdir}postgresql.${MMDD}
echo -n "pg_hba: "
grep ${cntflg} -i pg_hba ${logdir}postgresql.${MMDD}
@@ -0,0 +1,77 @@
#!/bin/bash
# Shows tables and columns that are of type specified
PORT=""
USER=""
COLTYPE="?"
usage() {
echo "Usage: $0 -d <dbname> -t <coltype> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
t) COLTYPE="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="postgres"
fi
choose_qry ()
{
if [ "$COLTYPE" = "?" ]
then
echo "Usage: $0 -d <dbname> -t <coltype> [-h <host> -U <user> -p <port>]"
echo
echo "Available Data Types"
QRY="SELECT DISTINCT (c.data_type)
FROM information_schema.columns c
ORDER BY c.data_type;"
else
QRY="SELECT quote_ident(c.table_schema) as schema,
quote_ident(c.table_name) as table,
quote_ident(c.column_name) as column,
c.data_type as type,
case when c.data_type LIKE '%char%'
then COALESCE(character_maximum_length::text, 'N/A')
when c.data_type LIKE '%numeric%'
then '(' || c.numeric_precision::text || ', ' || c.numeric_scale::text || ')'
when c.data_type LIKE '%int%'
then c.numeric_precision::text
else COALESCE(character_maximum_length::text, 'N/A')
end as size
FROM information_schema.columns c
WHERE c.table_schema NOT LIKE 'pg_%'
AND c.table_schema NOT LIKE 'information%'
AND c.table_name NOT LIKE 'sql_%'
AND c.data_type LIKE '%$COLTYPE%'
AND c.is_updatable = 'YES'
ORDER BY 1, 2, 3;"
fi
psql $HOST $USER $PORT $DBNAME <<_CODE_
${QRY}
_CODE_
}
choose_qry
@@ -0,0 +1,131 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port> u]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
set $(date '+%m%d')
MMDD=$1
LOGDIR='/var/log/postgresql'
getver()
{
VER=$(psql $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT version();
_QUERY_
)
#VER=$(cat ${PGDATA}/PG_VERSION)
#use next line only if PGDATA has version in path
#VER=$(echo $PGDATA | cut -d / -f 5)
}
clear
getver
echo "PostgreSQL Version is $VER"
connect_cnts() {
DBLIST=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT d.datname
FROM pg_database d
WHERE datallowconn = TRUE
AND datistemplate = FALSE
ORDER BY 1;
_QUERY_
)
}
get_cnt() {
CNT=$(psql -t $PORT $USER $DBNAME <<_QUERY_
/*
SELECT count(*)
FROM pg_stat_activity
WHERE datname = '$DB';
*/
SELECT usename,
count(*)
FROM pg_stat_activity
WHERE datname = '$DB'
GROUP BY usename;
_QUERY_
)
}
all_count() {
CNT=$(psql -t $PORT $USER $DBNAME <<_QUERY_
SELECT count(*)
FROM pg_stat_activity;
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
connect_cnts
for DB in $DBLIST;
do
echo -n "$DB "
get_cnt
# grep -E -c "$DB.*connection auth" #LOGDIR/postgresql.${MMDD}
echo -e "\t$CNT"
done
all_count
echo
echo -e "TOTAL \t\t$CNT"
#exit 0
#echo "$(hostname -f) CONNECTION COUNTS"
#echo "Current log file is: $logdir/postgresql.$MMDD"
#echo
#for DB in $DBLIST
# do
# echo -n "$DB: "
# grep 'connection authorized' $LOGDIR/postgresql.${MMDD} | grep -c "$DB"
#done
#exit 0
@@ -0,0 +1,109 @@
#!/bin/bash
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 -d <dbname> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="postgres"
fi
#Column names changed from procpid $ current_query to pid & query from 9.2 up
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'procpid'
ELSE 'pid'
END;
_QRY_
)
TSTVER=${TSTVER:1:7}
}
gettstver
if [ "${TSTVER}" = "procpid" ]
then
COL="procpid"
QRY="current_query"
else
COL="pid"
QRY="query"
fi
getver()
{
VER=$(psql -t $HOST $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
current_locks() {
LCKLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT l.database,
d.datname,
l.relation,
n.nspname,
c.relname,
l.pid,
a.usename,
l.locktype,
l.mode,
l.granted,
l.tuple
FROM pg_locks l
JOIN pg_class c ON (c.oid = l.relation)
JOIN pg_database d ON (CASE WHEN l.database = 0 THEN d.oid = 0 ELSE d.oid = l.database END)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_stat_activity a ON (a.$COL = l.pid)
ORDER BY l.database,
l.relation,
l.pid;
_QUERY_
)
}
if [ "$DBNAME" = "" ]
then
usage
fi
current_locks
echo "${LCKLIST}"
exit 0
@@ -0,0 +1,127 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
SLEEPTIME=5
CANCEL="F"
NOIDLE=""
usage() {
echo "Usage: $0 [-s <sleeptime> -d <dbname> -h <host> -U <user> -p <port> -x -i]"
echo "-x will exit after 1 iteration"
echo "-i will exclude <IDLE> queries"
exit 1
}
while getopts "d:s:h:p:uU:xi" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
s) SLEEPTIME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
x) CANCEL="T"
;;
i) NOIDLE="AND current_query <> '<IDLE>'"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
getver() {
VER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_VER_
SELECT SUBSTR(version(), 1, 16);
_VER_
)
}
#Column names changed from procpid $ current_query to pid & query from 9.2 up
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'procpid'
ELSE 'pid'
END;
_QRY_
)
TSTVER=${TSTVER:1:7}
}
gettstver
if [ "${TSTVER}" = "procpid" ]
then
COL="procpid"
QRY="current_query"
else
COL="pid"
QRY="query"
fi
getver
echo "$VER"
sleep 2
current_qry() {
QRYLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT datname,
$COL as pid,
-- procpid as pid,
client_addr,
usename as user,
-- regexp_replace(current_query, ' (..)', ' ', 'g') as query,
regexp_replace($QRY, ' (..)', ' ', 'g') as query,
waiting,
query_start,
clock_timestamp() - query_start as duration
FROM pg_stat_activity
--WHERE procpid != pg_backend_pid()
WHERE $COL != pg_backend_pid()
$NOIDLE
ORDER BY datname,
query_start;
_QUERY_
)
}
#### MAIN ####
while [ 1 -ge 0 ]
do
clear
current_qry
echo "${QRYLIST}"
if [ "$CANCEL" = "T" ]
then
exit 0
fi
echo "Sleeping $SLEEPTIME"
sleep $SLEEPTIME
done
@@ -0,0 +1,46 @@
#!/bin/bash
# Reports sizes for all or selected database
PORT=""
USER=""
DBNAME="%"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER postgres <<_EOF_
SELECT datname,
rolname as owner,
pg_size_pretty(pg_database_size(datname) )as size_pretty,
pg_database_size(datname) as size,
(SELECT pg_size_pretty (SUM( pg_database_size(datname))::bigint)
FROM pg_database) AS total,
((pg_database_size(datname) / (SELECT SUM( pg_database_size(datname))
FROM pg_database) ) * 100)::numeric(6,3) AS pct
FROM pg_database d
JOIN pg_authid a ON a.oid = datdba
WHERE datname LIKE '%$DBNAME%'
ORDER BY datname;
_EOF_
@@ -0,0 +1,55 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS a SUPERUSER
HOST=""
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-h <host> -p <port> -U <user>]"
exit 1
}
while getopts "d:h:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
h) HOST="-h $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $HOST $PORT $USER $DBNAME <<_CODE_
SELECT d.oid as directory,
c.relfilenode as filename,
n.nspname as schema,
c.relname as table,
a.rolname as owner,
pg_size_pretty(pg_relation_size(quote_ident(n.nspname) || '.' || quote_ident(c.relname))) as size
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
ORDER BY relfilenode;
_CODE_
@@ -0,0 +1,63 @@
#!/bin/bash
# Disables or Enables connections to specified database
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-p <port> -U <user>]"
echo Database name to disable/enable is required
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
if [ $DBNAME == "postgres" ]
then
echo Disable of postgres is prohibited
exit
fi
echo changing $DBNAME
psql $PORT $USER -v ON_ERROR_STOP=on postgres <<_EOF_
SELECT datname, datallowconn
FROM pg_database
WHERE datname = '$DBNAME' ;
UPDATE pg_database
SET datallowconn = CASE
WHEN datallowconn = TRUE THEN
FALSE
ELSE
TRUE
END
WHERE datname = '$DBNAME' ;
SELECT datname, datallowconn
FROM pg_database
WHERE datname = '$DBNAME' ;
\echo Connect status for $DBNAME has been reversed
_EOF_
@@ -0,0 +1,48 @@
#!/bin/bash
# Counts transaction per minute
# for postgresql server
# Note: transactions are actual / not potential
PORT=""
USER=""
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME="$OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
get_procnum() {
PROCNUM=$(psql $PORT -q -t $USER $DBNAME <<_QUERY_
SELECT SUM(xact_commit + xact_rollback)
FROM pg_stat_database;
_QUERY_
)
}
get_procnum
echo "$PROCNUM"
FIRST_CNT=$PROCNUM
sleep 60
get_procnum
LAST_CNT=$PROCNUM
echo "$PROCNUM"
(( TOT_QRY = $LAST_CNT - $FIRST_CNT ))
echo "Total queries = $TOT_QRY"
@@ -0,0 +1,19 @@
#!/bin/bash
psql -U postgres postgres <<_EOF_
SELECT g.rolname as group,
u.rolname as user,
r.admin_option,
CASE WHEN g.rolsuper = TRUE
THEN 'SUPERUSER'
ELSE 'f'
END as g_super,
CASE WHEN u.rolsuper = TRUE
THEN 'SUPERUSER'
ELSE 'f'
END as u_super
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
ORDER BY 1;
_EOF_
@@ -0,0 +1,56 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT quote_ident(N.nspname),
quote_ident(T.relname) AS "table",
quote_ident(C.relname) AS idx_name,
round(100 * pg_relation_size(indexrelid) / pg_relation_size(indrelid) ) / 100 AS "index_ratio %",
pg_size_pretty(pg_relation_size(indexrelid) ) AS index_size,
pg_size_pretty(pg_relation_size(indrelid) ) AS table_size_size
FROM pg_index I
LEFT JOIN pg_class C ON (c.oid = I.indexrelid)
LEFT JOIN pg_class T ON (T.oid = I.indrelid)
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
AND c.relkind = 'i'
AND pg_relation_size(indrelid) > 0
AND C.relname LIKE '%$TBL%'
ORDER BY 4 DESC, 2;
_CODE_
@@ -0,0 +1,75 @@
#!/bin/bash
#Shows commnets on all or selected index
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> [-i <index> -U <user> -p <port>]"
exit 1
}
while getopts "d:i:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
i) IDX=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
QRY="SELECT quote_ident(n.nspname) as schema,
quote_ident(c.relname),
d.description as comment
FROM pg_class c
LEFT JOIN pg_description d ON (d.objoid = c.oid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$IDX%'
AND relkind = 'i'
AND d.description IS NOT NULL
ORDER BY 2;"
current_stats() {
STATLIST=$(psql $PORT -q $USER $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,78 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -h <host> -U <user> -p <port> u]"
exit 1
}
while getopts "d:h:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
allow_logins()
{
CNT=$(psql $HOST $PORT $USER $DBNAME <<_QUERY_
UPDATE pg_authid au
SET rolcanlogin = TRUE
FROM pg_lockout lo
WHERE au.rolname = lo.rolname;
_QUERY_
)
}
current_user()
{
CUSER=$(psql -t $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT TRIM(BOTH FROM current_user);
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
current_user
if [ $CUSER != "postgres" ]
then
echo "You must be postgres to execute this script."
echo "Aborting."
exit 1
fi
allow_logins
echo "Users allowed to login = $CNT"
exit 0
@@ -0,0 +1,90 @@
#!/bin/bash
DBNAME="postgres"
USER="-U postgres"
PORT="-p 5432"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port> u]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
lockout()
{
CNT=$(psql $PORT $USER $DBNAME <<_QUERY_
DROP TABLE IF EXISTS pg_lockout;
CREATE TABLE pg_lockout
AS SELECT rolname,
rolsuper,
rolcanlogin
FROM pg_authid
WHERE rolsuper IS FALSE;
ALTER TABLE pg_lockout
ADD CONSTRAINT pg_lockout_pkey PRIMARY KEY (rolname);
UPDATE pg_authid au
SET rolcanlogin = FALSE
FROM pg_lockout lo
WHERE lo.rolcanlogin = TRUE
AND au.rolname = lo.rolname;
_QUERY_
)
}
current_user()
{
CUSER=$(psql -t $PORT $USER $DBNAME <<_QUERY_
SELECT TRIM(BOTH FROM current_user);
_QUERY_
)
}
###############################################################
# MAIN #
###############################################################
current_user
echo "current user is $CUSER"
if [ $CUSER != "postgres" ]
then
echo "You must be postgres to execute this script."
echo "Aborting."
exit 1
fi
lockout
echo "Users locked out = $CNT"
exit 0
@@ -0,0 +1,3 @@
BACKFILE=pgbackup.`date +%C%y%m%d%H%M`
pg_dump -f /home/pgsql/backup/$BACKFILE -F c postgres
@@ -0,0 +1,54 @@
#!/bin/bash
# Show start and runtime for postgresql server
DBNAME="postgres"
PORT=""
USER=""
usage() {
echo "Usage: $0 [-d <dbname> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME="$OPTARG"
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
show_runtime() {
RUNTIME=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT pg_postmaster_start_time() as pg_start,
current_timestamp - pg_postmaster_start_time() as runtime;
_QUERY_
)
}
show_runtime
echo "${RUNTIME}"
exit 0
@@ -0,0 +1,140 @@
#!/bin/bash
# Shows statistics for all indexes on all selected table
PORT=""
USER=""
TBL="%"
COLS=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port> -t <table> -s ]"
echo "dbname REQUIRED"
echo "-s will show columns used in index"
exit 1
}
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
set_qry_cols() {
QRY="SELECT n.nspname as schema,
i.relname as table,
i.indexrelname as index,
i.idx_scan,
i.idx_tup_read,
i.idx_tup_fetch,
CASE WHEN idx.indisprimary
THEN 'pkey'
WHEN idx.indisunique
THEN 'uidx'
ELSE 'idx'
END AS type,
pg_get_indexdef(idx.indexrelid, 1, FALSE) as idxcol1,
pg_get_indexdef(idx.indexrelid, 2, FALSE) as idxcol2,
pg_get_indexdef(idx.indexrelid, 3, FALSE) as idxcol3,
pg_get_indexdef(idx.indexrelid, 4, FALSE) as idxcol4,
CASE WHEN idx.indisvalid
THEN 'valid'
ELSE 'INVALID'
END as status,
pg_relation_size( quote_ident(n.nspname) || '.' || quote_ident(i.relname) ) as size_in_bytes,
pg_size_pretty(pg_relation_size(quote_ident(n.nspname)|| '.' || quote_ident(i.relname) )) as size
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE i.relname LIKE '%$TBL%'
AND n.nspname NOT LIKE 'pg_%'
ORDER BY 1, 2, 3;"
}
set_qry_nocols() {
QRY="SELECT n.nspname as schema,
i.relname as table,
i.indexrelname as index,
i.idx_scan,
i.idx_tup_read,
i.idx_tup_fetch,
CASE WHEN idx.indisprimary
THEN 'pkey'
WHEN idx.indisunique
THEN 'uidx'
ELSE 'idx'
END AS type,
CASE WHEN idx.indisvalid
THEN 'valid'
ELSE 'INVALID'
END as status,
pg_relation_size(quote_ident(n.nspname) || '.' || quote_ident(i.relname) ) as size_in_bytes
FROM pg_stat_all_indexes i
JOIN pg_class c ON (c.oid = i.relid)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index idx ON (idx.indexrelid = i.indexrelid )
WHERE i.relname LIKE '%$TBL%'
AND n.nspname NOT LIKE 'pg_%'
ORDER BY 1, 2, 3;"
}
current_stats() {
STATLIST=$(psql -q -U postgres $DBNAME <<_QUERY_
$QRY
_QUERY_
)
}
###########################################################
# MAIN #
###########################################################
while getopts "d:p:st:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
s) COLS="TRUE"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "$COLS" = "TRUE" ]
then
set_qry_cols
else
set_qry_nocols
fi
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,100 @@
#!/bin/bash
# Reports statistics for all tables
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:t:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "${VER:11:3}" \< "8.3" ]
then
QRY="SELECT n.nspname as schema,
s.relname as table,
c.reltuples::bigint,
n_tup_ins,
n_tup_upd,
n_tup_del,
date_trunc('second', last_vacuum) as last_vacuum,
date_trunc('second', last_autovacuum) as last_autovacuum,
date_trunc('second', last_analyze) as last_analyze,
date_trunc('second', last_autoanalyze) as last_autoanalyze
FROM pg_stat_all_tables s
JOIN pg_class c ON c.oid = s.relid
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1, 2;"
else
QRY="SELECT n.nspname as schema,
s.relname as table,
c.reltuples::bigint,
n_live_tup,
n_tup_ins,
n_tup_upd,
n_tup_del,
date_trunc('second', last_vacuum) as last_vacuum,
date_trunc('second', last_autovacuum) as last_autovacuum,
date_trunc('second', last_analyze) as last_analyze,
date_trunc('second', last_autoanalyze) as last_autoanalyze
FROM pg_stat_all_tables s
JOIN pg_class c ON c.oid = s.relid
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1, 2;"
fi
current_stats() {
STATLIST=$(psql -q $PORT $USER $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,66 @@
#!/bin/bash
# Shows vacuum time for all or selected table.
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
t) TBL="$OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
vacuum_time() {
TIMEINFO=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT max(last_vacuum) - min(last_vacuum) as vacuum_time
FROM pg_stat_all_tables s
WHERE s.relname NOT LIKE 'pg_%'
AND s.relname NOT LIKE 'sql_%'
AND s.relname LIKE '%$TBL%'
ORDER by 1;
_QUERY_
)
}
vacuum_time
echo "${TIMEINFO}"
exit 0
@@ -0,0 +1,24 @@
#!/bin/bash
#!/bin/bash
OLDFILE=$1
usage() {
echo "Usage: $0 oldfile"
exit 1
}
if [ -z "$OLDFILE" ]
then
usage
exit 1
fi
OLDFILE=$1
NEWFILE=x$1
col -bp < $OLDFILE >> $NEWFILE
chmod +x $NEWFILE
rm $OLDFILE
mv $NEWFILE $OLDFILE
@@ -0,0 +1,64 @@
#!/bin/bash
#Shows roles and members
PORT=""
USER="-U postgres"
DBNAME="postgres"
usage() {
echo "Usage: $0 [-d <dbname> -U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
show_members() {
MEMBERS=$(psql -q $PORT $USER $DBNAME <<_QUERY_
SELECT a.rolname as role,
u.rolname as member,
CASE
WHEN m.admin_option THEN
'YES'
ELSE
'no'
END as admin
FROM pg_auth_members m
JOIN pg_authid a ON (a.oid = m.roleid)
JOIN pg_authid u ON (u.oid = m.member)
ORDER BY 1, 2
_QUERY_
)
}
show_members
echo "${MEMBERS}"
exit 0
@@ -0,0 +1,55 @@
#!/bin/bash
PORT=""
usage() {
echo "Usage: $0 [-p <port>]"
exit 1
}
while getopts "p:u" OPT;
do case "${OPT}" in
p) PORT="-p $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
getver()
{
VER=$(psql $PORT -t -U postgres postgres <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
slony_status() {
STATUS=$(psql $PORT -q <<_QUERY_
BEGIN;
SELECT st_origin as org,
st_last_event as last_event,
st_lag_num_events as lag_events,
st_lag_time
FROM _slony.sl_status;
COMMIT;
_QUERY_
)
}
slony_status
echo "${STATUS}"
exit 0
@@ -0,0 +1,83 @@
#!/bin/bash
# Reports statistics for all tables
HOST=""
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-h <host> -U <user> -p <port>]"
exit 1
}
while getopts "d:h:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
h) HOST="-h $OPTARG"
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="playmaker"
fi
if [ "$TBL" = "" ]
then
usage
fi
getver()
{
VER=$(psql -t $PORT $HOST $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
current_stats() {
STATLIST=$(psql -q $HOST $PORT $USER $DBNAME <<_QUERY_
SELECT schemaname,
tablename,
attname As colname,
n_distinct,
array_to_string(most_common_vals, E'\n') AS common_vals,
array_to_string(most_common_freqs, E'\n') As dist_freq
FROM pg_stats
WHERE tablename = '$TBL'
ORDER BY schemaname,
tablename,
attname;
_QUERY_
)
}
##### MAIN #####
echo "HOST=$HOST"
echo "PORT=$PORT"
echo "USER=$USER"
echo "TBL=$TBL"
echo "DBNAME=$DBNAME"
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,101 @@
#!/bin/bash
# Shows comments for all or specified table
USER=""
PORT=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
QRY="SELECT DISTINCT ON (c.relname)
n.nspname as schema,
c.relname,
a.rolname as owner,
0 as col_seq,
'' as column,
d.description as comment
FROM pg_class c
LEFT JOIN pg_attribute col ON (col.attrelid = c.oid)
LEFT JOIN pg_description d ON (d.objoid = col.attrelid AND d.objsubid = 0)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
-- AND d.description IS NOT NULL
UNION
SELECT n.nspname as schema,
c.relname,
'' as owner,
col.attnum as col_seq,
col.attname as column,
d.description
FROM pg_class c
JOIN pg_attribute col ON (col.attrelid = c.oid)
LEFT JOIN pg_description d ON (d.objoid = col.attrelid AND d.objsubid = col.attnum)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE n.nspname NOT LIKE 'information%'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
-- AND d.description IS NOT NULL
AND col.attnum >= 0
ORDER BY 1, 2, 4;"
current_stats() {
STATLIST=$(psql $USER $PORT -q $DBNAME <<_QUERY_
${QRY}
_QUERY_
)
}
current_stats
echo "${STATLIST}"
exit 0
@@ -0,0 +1,70 @@
#!/bin/bash
USER=""
PORT=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver()
{
VER=$(psql $PORT -t $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
get_dependents() {
DEPLIST=$(psql $PORT -q $USER $DBNAME <<_QUERY_
SELECT n.nspname as schema,
pa.relname as parent,
ch.relname as dependent,
cn.conname as constraint_name
FROM pg_constraint cn
JOIN pg_class pa ON (pa.oid = cn.confrelid)
JOIN pg_class ch ON (ch.oid = cn.conrelid)
JOIN pg_namespace n ON (n.oid = pa.relnamespace)
WHERE pa.relname LIKE '%$TBL%'
AND contype = 'f'
ORDER BY 1, 2, 3;
_QUERY_
)
}
get_dependents
echo "${DEPLIST}"
exit 0
@@ -0,0 +1,58 @@
#!/bin/bash
# Shows functions that specified table occurs in
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
t) TBL=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$TBL" = "" ]
then
usage
exit 1
fi
echo "$TBL"
psql $USER $PORT $DBNAME <<_CODE_
SELECT p.proname,
CASE WHEN p.proretset = TRUE
THEN 'SET OF '
ELSE ''
END ||
UPPER( (SELECT typname
FROM pg_type
WHERE oid = p.prorettype) ) AS return_type,
proargnames as parameters
FROM pg_proc p
WHERE prosrc LIKE '%$TBL%'
ORDER BY p.proname;
_CODE_
exit 0
@@ -0,0 +1,53 @@
#!/bin/bash
# Shows trigger functions that specified table occurs in
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -t <table> [-U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
t) TBL=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$TBL" = "" ]
then
usage
exit 1
fi
echo "$TBL"
psql $USER $PORT $DBNAME <<_CODE_
SELECT c.relname,
t.tgname,
p.proname
FROM pg_proc p
JOIN pg_trigger t ON (t.tgfoid = p.oid)
JOIN pg_class c ON (c.oid = t.tgrelid)
WHERE prosrc LIKE ('%$TBL%')
ORDER BY c.relname;
_CODE_
exit 0
@@ -0,0 +1,69 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER=""
TBL=""
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -p <port> -U <user>]"
exit 1
}
while getopts "d:p:t:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
a.rolname as owner,
d.oid as directory,
c.relfilenode as filename,
c.reltuples::integer,
pg_size_pretty(pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) )) as size,
pg_size_pretty(pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) )
+ pg_relation_size( i.indexrelid ) ) as total_size,
pg_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) ) as size_bytes,
pg_total_relation_size( quote_ident( n.nspname ) || '.' || quote_ident( c.relname ) ) as total_size_bytes,
CASE WHEN c.reltablespace = 0
THEN 'pg_default'
ELSE (SELECT t.spcname
FROM pg_tablespace t WHERE (t.oid = c.reltablespace) )
END as tablespace
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_index i ON (i.indrelid = c.oid )
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relname LIKE '%$TBL%'
AND relkind = 'r'
ORDER BY 9 DESC, 1, 2;
_CODE_
@@ -0,0 +1,49 @@
#!/bin/bash
# SHOWS TABLES AND OWNERS FOR ALL TABLES
# SHOULD BE RUN AS SUPERUSER
PORT=""
USER="-U postgres"
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
a.rolname as owner,
c.relacl as permits
FROM pg_class c
JOIN pg_namespace n ON ( n.oid = c.relnamespace )
JOIN pg_authid a ON ( a.OID = c.relowner )
WHERE relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
-- AND position('useradmin' in ARRAY_TO_STRING(c.relacl, '') )> 0
ORDER BY n.nspname,
c.relname;
_CODE_
@@ -0,0 +1,55 @@
#!/bin/bash
# SHOWS TABLES AND SIZES FOR ALL TABLES
# SHOULD BE RUN AS postgres user
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-p <port> -U <user>]"
exit 1
}
while getopts "d:p:U:u" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname as table,
-- c.relkind,
a.rolname as owner,
d.oid as directory,
c.relfilenode as filename,
pg_size_pretty(pg_relation_size( quote_ident(n.nspname ) || '.' || quote_ident( c.relname ) )) as size
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
JOIN pg_authid a ON ( a.oid = c.relowner ),
pg_database d
WHERE d.datname = current_database()
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND relkind = 'r'
-- AND relkind IN ('i', 'r')
ORDER BY 1, 2;
_CODE_
@@ -0,0 +1,58 @@
#!/bin/bash
# SHOWS FOREIGN KEY COUNT FOR EACH TABLE
# THEN SHOWS FOREIGN KEYS FOR EACH TABLE
PORT=""
USER=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
t.relname as table,
count(c.conname)
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
GROUP BY 1, 2
ORDER BY 1, 3;
SELECT n.nspname as schema,
t.relname as table,
c.conname as fk_name
FROM pg_class t
JOIN pg_constraint c ON ( c.conrelid = t.OID AND c.contype = 'f')
JOIN pg_namespace n ON (n.oid = t.relnamespace)
WHERE relkind = 'r'
AND t.relname NOT LIKE 'pg_%'
AND t.relname NOT LIKE 'sql_%'
ORDER BY 1, 2, 3;
_CODE_
@@ -0,0 +1,65 @@
#!/bin/bash
# SHOWS ALL TABLES WITH A COLUMN NAME LIKE <ColumnName>
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -c <colname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:c:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
c) COLNAME="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
echo "col=$COLNAME"
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$COLNAME" = "" ]
then
usage
exit 1
fi
psql -a $USER $PORT $DBNAME <<_CODE_
SELECt c.table_schema as schema,
c.table_name as table,
c.column_name as column,
c.data_type as type,
case when c.data_type LIKE '%char%'
then COALESCE(character_maximum_length::text, 'N/A')
when c.data_type LIKE '%numeric%'
then '(' || c.numeric_precision::text || ', ' || c.numeric_scale::text || ')'
when c.data_type LIKE '%int%'
then c.numeric_precision::text
else COALESCE(character_maximum_length::text, 'N/A')
end as size
FROM information_schema.columns c
WHERE c.table_schema NOT LIKE 'pg_%'
AND c.table_schema NOT LIKE 'information%'
AND c.table_name NOT LIKE 'sql_%'
AND c.column_name LIKE '%$COLNAME%'
AND c.is_updatable = 'YES'
ORDER BY c.table_name, c.column_name;
_CODE_
exit 0
@@ -0,0 +1,49 @@
#!/bin/bash
# SHOWS TABLES AND OWNERS FOR ALL TABLES
# That have no public grants
# SHOULD BE RUN AS SUPERUSER
USER="-U postgres"
PORT=""
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port>]"
exit 1
}
while getopts "d:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
psql $PORT $USER $DBNAME <<_CODE_
SELECT n.nspname as schema,
c.relname,
a.rolname as owner,
array_to_string(ARRAY[c.relacl], '|') as permits
FROM pg_class c
JOIN pg_authid a ON (a.OID = c.relowner)
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE relkind = 'r'
AND relname NOT LIKE 'pg_%'
AND relname NOT LIKE 'information%'
AND relname NOT LIKE 'sql_%'
AND position('|=' in array_to_string(ARRAY[relacl], '|')) = 0
ORDER BY 1, 2;
_CODE_
@@ -0,0 +1,103 @@
#!/bin/bash
# Shows tablespace use for all or selected table
# that are not in default tablespace
PORT=""
USER=""
TBL="%"
usage() {
echo "Usage: $0 -d <dbname> [-t <table> -U <user> -p <port>]"
exit 1
}
while getopts "d:t:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
t) TBL=$OPTARG
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
exit 1
fi
getver()
{
VER=$(psql -t $USER $PORT $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
gettstver()
{
TSTVER=$(psql -q -t $HOST $PORT $USER $DBNAME <<_QRY_
SELECT CASE WHEN SUBSTRING(version() FROM 12 FOR 3) < '9.2'
THEN 'oid'
ELSE 'func'
END;
_QRY_
)
TSTVER=${TSTVER:1:4}
}
gettstver
if [ "${TSTVER}" = "oid" ]
then
TSL="t.spclocation"
else
TSL="pg_tablespace_location(t.oid)"
fi
tspace_use() {
TSPACELIST=$(psql -q $USER $PORT $DBNAME <<_QUERY_
SELECT CASE WHEN t.spcname IS NULL
THEN 'pg_default'
ELSE t.spcname
END as tablespace,
$TSL as location,
n.nspname as schema,
c.relname as relation,
a.rolname as owner,
c.relkind as type
FROM pg_class c
LEFT JOIN pg_tablespace t ON (t.oid = c.reltablespace)
JOIN pg_authid a ON ( a.oid = c.relowner )
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE relname LIKE '%$TBL%'
AND relkind IN ('i', 'r')
AND c.relname NOT LIKE 'pg_%'
AND c.relname NOT LIKE 'sql_%'
ORDER BY 1, 2;
_QUERY_
)
}
tspace_use
echo "${TSPACELIST}"
exit 0
@@ -0,0 +1,125 @@
#!/bin/bash
PORT=""
USER=""
TBL="%"
CONSTR=""
# Shows trigger function on all or selected trigger
usage() {
echo "Usage: $0 -d <dbname> [-U <user> -p <port> -t <trigger> -s ]"
echo "dbname REQUIRED"
echo "-s will show constraints"
exit 1
}
getver()
{
VER=$(psql -t $PORT $USER $DBNAME <<_QRYVER_
SELECT version();
_QRYVER_
)
}
set_qry_noconstraints() {
QRY="SELECT c.relname AS table,
t.tgname,
p.proname AS function_called,
-- t.tgisconstraint AS is_constraint,
cn.conname AS constraint_nm,
CASE WHEN t.tgconstrrelid > 0
THEN (SELECT relname
FROM pg_class
WHERE oid = t.tgconstrrelid)
ELSE ''
END AS constr_tbl
FROM pg_trigger t
INNER JOIN pg_proc p ON ( p.oid = t.tgfoid)
INNER JOIN pg_class c ON ( c.oid = t.tgrelid)
LEFT JOIN pg_constraint cn ON ( cn.oid = t.tgconstraint )
WHERE tgname NOT LIKE 'pg_%'
AND tgname NOT LIKE 'RI_%' -- < comment out to see constraints
AND tgname LIKE '%$TRG%'
ORDER BY 1;"
}
set_qry_constraints() {
QRY="SELECT c.relname AS table,
t.tgname,
p.proname AS function_called,
-- t.tgisconstraint AS is_constraint,
cn.conname AS constraint_nm,
CASE WHEN t.tgconstrrelid > 0
THEN (SELECT relname
FROM pg_class
WHERE oid = t.tgconstrrelid)
ELSE ''
END AS constr_tbl
FROM pg_trigger t
INNER JOIN pg_proc p ON ( p.oid = t.tgfoid)
INNER JOIN pg_class c ON ( c.oid = t.tgrelid)
LEFT JOIN pg_constraint cn ON ( cn.oid = t.tgconstraint )
WHERE tgname NOT LIKE 'pg_%'
AND tgname LIKE '%$TRG%'
ORDER BY 1;"
}
list_triggers() {
LIST=$(psql -q $PORT $USER $DBNAME <<_QUERY_
$QRY
_QUERY_
)
}
###########################################################
# MAIN #
###########################################################
while getopts "d:p:st:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
s) CONSTR="TRUE"
;;
t) TRG="$OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
usage
fi
getver
VER=$(echo $VER | cut -c -16)
echo "Version is $VER"
if [ "$CONSTR" = "TRUE" ]
then
set_qry_constraints
else
set_qry_noconstraints
fi
list_triggers
echo "${LIST}"
exit 0
@@ -0,0 +1,59 @@
#!/bin/bash
# Shows Tables access for user specified
# SHOULD BE RUN AS SUPERUSER
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -a <user2check> [-U <user> -p <port>]"
exit 1
}
while getopts "d:a:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
a) CKUSER=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$CKUSER" = "" ]
then
usage
exit 1
fi
psql $USER $PORT $DBNAME <<_CODE_
SELECT n.nspname,
c.relname,
array_to_string(ARRAY[c.relacl], '|') as permits,
position('useradmin' in array_to_string(ARRAY[relacl], '|'))
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname not like 'pg_%'
AND n.nspname not like 'inform_%'
AND relkind = 'r'
AND (position('$CKUSER' in array_to_string(ARRAY[relacl], '|')) > 0
OR position( (SELECT g.rolname
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
AND u.rolname LIKE '$CKUSER%') in array_to_string(ARRAY[relacl], '|')) > 0 )
ORDER BY 1,2;
_CODE_
@@ -0,0 +1,76 @@
#!/bin/bash
# Shows table access detail for user specified
# SHOULD BE RUN AS SUPERUSER
USER=""
PORT=""
usage() {
echo "Usage: $0 -d <dbname> -a <user2check> [-U <user> -p <port>]"
exit 1
}
while getopts "d:a:p:uU:" OPT;
do case "${OPT}" in
d) DBNAME=$OPTARG
;;
a) CKUSER=$OPTARG
;;
p) PORT="-p $OPTARG"
;;
U) USER="-U $OPTARG"
;;
u) usage
;;
[?]) usage
esac;
done
if [ "$DBNAME" = "" ]
then
DBNAME="enf"
fi
if [ "$CKUSER" = "" ]
then
usage
exit 1
fi
psql $USER $PORT $DBNAME <<_CODE_
SELECT n.nspname,
c.relname,
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'SELECT')
THEN 'YES'
ELSE 'no'
END AS "SEL",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'INSERT')
THEN 'YES'
ELSE 'no'
END AS "INS",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'UPDATE')
THEN 'YES'
ELSE 'no'
END AS "UPD",
CASE WHEN has_table_privilege('$CKUSER', quote_ident(n.nspname) || '.' || quote_ident(c.relname), 'DELETE')
THEN 'YES'
ELSE 'no'
END AS "DEL",
array_to_string(ARRAY[c.relacl], '|') as permits
FROM pg_class c
JOIN pg_namespace n ON (n.oid = c.relnamespace)
WHERE n.nspname not like 'pg_%'
AND n.nspname not like 'inform_%'
AND relkind = 'r'
/*
AND (position('$CKUSER' in array_to_string(ARRAY[relacl], '|')) > 0
OR position( (SELECT g.rolname
FROM pg_auth_members r
JOIN pg_authid g ON (r.roleid = g.oid)
JOIN pg_authid u ON (r.member = u.oid)
AND u.rolname LIKE '$CKUSER%') in array_to_string(ARRAY[relacl], '|')) > 0 )
*/
ORDER BY 1,2;
_CODE_