NOTE: alternatively, if applicable
pg_partman
Extension to manage partitioned tables by time or ID - not yet tested
<div style="text-align:right;font-size:smaller" class='TMLhtml' >
SCSArchiverCSStudioPostgresPartitioning</div>
- database_owner_ship provided:
- Download
postgres_partitioning.txt
from cs-studio@github
- Since the table
sample
is already created, optionally including FOREIGN KEY
constraints,
- skip
DROP TABLE IF EXISTS sample
, though you will run into an error
- replace
archive.
prefixes by "$schema." prefix
- add
client_encoding
and SEARCH PATH
in front
- call
pqsl
with
- option
"-f"
loading modified partitioning
- option
"-a"
to show all
%CODE{"bash"}%
export PG_Owner=<database_owner, e.g. "postgres">
export PGUSER=<schema_owner, e.g. "archiver">
export PGHOST=cbmdcs01
export PGPORT=5432
export PGDATABASE=archive
schema=archive
URL="$css-address/raw/$path/postgres_partitioning.txt"
filename=$(basename $URL )
outputdir=$(mktemp -d);
outputfile=$(mktemp -p ${outputdir}) ;
cat > ${outputfile} << EOF
---
---
SET client_encoding = "UTF-8";
SET SEARCH_PATH TO "$schema";
EOF
cd ${outputdir} &&
wget -N --no-check-certificate ${URL} &&
perl -p -e "s/\sarchive\./ $schema./g;" -e "s/OWNER TO postgres;/OWNER TO \"${PGUSER:?PGUSER undefined}\";/g;" -e "s/DROP TABLE IF EXISTS sample;.*?$//g;" ${filename} >> ${outputfile} &&
echo -e "\nSELECT archive.sample_update_partitions('2015-01-01'::timestamp, 'archive', '$PGUSER', 'week');" >> ${outputfile} &&
psql -U ${PG_Owner} -a -f ${outputfile} &&
rm -ir ${outputdir} && cd -
%ENDCODE%
- Note
- if
psql -U $(PG_Owner)
does not work, unset PGHOST;
crontab :
%CODE{"bash"}%
-- This maintenance function automatically creates partitions according to the
-- specified interval (e.g. weekly or monthly). The first partition starts at
--
and ends a day/week/month/year later. This function has to be
-- called regularly (e.g. daily by cron):
--
-- @daily psql -a -h cbmdcs01 -p 5432 -U <database_owner, e.g. "postgres"> -d archive -c "SELECT archive.sample_update_partitions('2015-01-01'::timestamp, 'archive', '<database_owner, e.g. "postgres">', 'week');"
--
-- This function is based on a more generic version by Nicholas Whittier
-- (http://imperialwicket.com/postgresql-automating-monthly-table-partitions).
%ENDCODE%
⇒ Install a cronjob on any relevant machine using .pgpass
(q.v. Psql pgwiki.gsi.de #.pgpass)
-
- (german) note about the credentials
- ... da Sie vorhaben, "psql" für Ihren CronJob zu nutzen, können Sie alle relevanten PostgreSQL-Connection-Daten in Shell-Variablen hinterlegen. Im pgWiki finden Sie dazu eine Anleitung / Empfehlung von uns, wie so ein PostgreSQL-Environment aussehen könnte. Es gibt auch die Datei ".pgpass, wo Sie Passwörter für Ihre Verbindungen hinterlegen können. 1x hinterlegt, bezieht "psql" standardmäßig aus dieser Datei die passenden Passwörter. Wichtig ist nur, dass CronJob unter dem User ausgeführt wird, bei dem die Datei .pgpass hinterlegt ist.
Sie können Ihr Environment sogar soweit "vorbereiten", dass Sie sogar den DBNamen, den Ufernamen, Port, Server, etc. bei Ihrem Cron-Aufruf nicht mehr mit angeben müssen. Die Environment-Variablen geben "psql" vor, wie und wohin er sich per Standard connecten soll.