35 lines
872 B
Bash
35 lines
872 B
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
echo "== Creating publication in each database =="
|
|
|
|
for db in $(psql -Atqc "SELECT datname FROM pg_database WHERE datallowconn AND datname NOT IN ('template0','template1')"); do
|
|
echo "Processing DB: $db"
|
|
|
|
# Create publication (idempotent)
|
|
psql -d "$db" -v ON_ERROR_STOP=1 <<SQL
|
|
DO \$\$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_publication WHERE pubname = 'migrate_pub'
|
|
) THEN
|
|
CREATE PUBLICATION migrate_pub FOR ALL TABLES;
|
|
END IF;
|
|
END
|
|
\$\$;
|
|
SQL
|
|
|
|
# Create logical replication slot (idempotent-ish)
|
|
SLOT="migrate_slot_${db}"
|
|
|
|
if ! psql -d "$db" -Atqc "SELECT 1 FROM pg_replication_slots WHERE slot_name = '$SLOT'" | grep -q 1; then
|
|
echo " Creating slot: $SLOT"
|
|
psql -d "$db" -c "SELECT pg_create_logical_replication_slot('$SLOT', 'pgoutput');"
|
|
else
|
|
echo " Slot already exists: $SLOT"
|
|
fi
|
|
|
|
done
|
|
|
|
echo "== Done =="
|