/* * repmgr.sql * * Copyright (C) 2ndQuadrant, 2010-2015 * */ CREATE USER repmgr; CREATE SCHEMA repmgr; /* * The table repl_nodes keeps information about all machines in * a cluster */ CREATE TABLE repl_nodes ( id integer primary key, cluster text not null, -- Name to identify the cluster name text not null, conninfo text not null, priority integer not null, witness boolean not null default false ); ALTER TABLE repl_nodes OWNER TO repmgr; /* * Keeps monitor info about every node and their relative "position" * to primary */ CREATE TABLE repl_monitor ( primary_node INTEGER NOT NULL, standby_node INTEGER NOT NULL, last_monitor_time TIMESTAMP WITH TIME ZONE NOT NULL, last_wal_primary_location TEXT NOT NULL, last_wal_standby_location TEXT, -- In case of a witness server this will be NULL replication_lag BIGINT NOT NULL, apply_lag BIGINT NOT NULL ); ALTER TABLE repl_monitor OWNER TO repmgr; /* * This view shows the latest monitor info about every node. * Interesting thing to see: * replication_lag: in bytes (this is how far the latest xlog record * we have received is from master) * apply_lag: in bytes (this is how far the latest xlog record * we have applied is from the latest record we * have received) * time_lag: how many seconds are we from being up-to-date with master */ CREATE VIEW repl_status AS SELECT primary_node, standby_node, name AS standby_name, last_monitor_time, last_wal_primary_location, last_wal_standby_location, pg_size_pretty(replication_lag) replication_lag, pg_size_pretty(apply_lag) apply_lag, age(now(), last_monitor_time) AS time_lag FROM repl_monitor JOIN repl_nodes ON standby_node = id WHERE (standby_node, last_monitor_time) IN (SELECT standby_node, MAX(last_monitor_time) FROM repl_monitor GROUP BY 1); ALTER VIEW repl_status OWNER TO repmgr; CREATE INDEX idx_repl_status_sort ON repl_monitor(last_monitor_time, standby_node);