Generic PostgreSQL backend
Native | Yes |
Master | Yes |
Slave | Yes |
Superslave | Yes |
Autoserial | Yes (v3.1 and up) |
Case | All lower |
DNSSEC | Yes (set gpgsql-dnssec ) |
Disabled data | Yes (v3.4.0 and up) |
Comments | Yes (v3.4.0 and up) |
Module name | gpgsql |
Launch name | gpgsql |
This PostgreSQL backend is based on the generic SQL backend.
The default setup conforms to the schema at the bottom of this page, note that
zone2sql
with the --gpgsql
flag also assumes this layout is in place.
This schema contains all elements needed for master, slave and superslave operation. For full migration notes, please see Migration.
With PostgreSQL, you may have to run createdb pdns
first and then connect
to that database with psql pdns
, and feed it the schema above.
Settings
gpgsql-host
Host (ip address) to connect to. If pgsql-host
begins with a slash, it
specifies Unix-domain communication rather than TCP/IP communication; the value
is the name of the directory in which the socket file is stored.
WARNING: When specified as a hostname a chicken/egg situation might arise where the database is needed to resolve the IP address of the database. It is best to supply an IP address of the database here.
gpgsql-port
The port to connect to on gpgsql-host
. Default: 5432
gpgsql-dbname
Name of the database to connect to. Default: "pdns".
gpgsql-user
User to connect as. Default: "powerdns".
gpgsql-password
The password to for gpgsql-user
.
gpgsql-dnssec
Enable DNSSEC processing for this backend. Default=no.
gpsql-extra-connection-parameters
Extra connection parameters to forward to postgres. If you want to pin a specific certificate for
the connection you should set this to sslmode=verify-full sslrootcert=<path-to-CA-cert>
. Accepted
parameters are documented in the PostgreSQL documentation.
Default schema
CREATE TABLE domains (
id SERIAL PRIMARY KEY,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(6) NOT NULL,
notified_serial INT DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE TABLE records (
id BIGSERIAL PRIMARY KEY,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
change_date INT DEFAULT NULL,
disabled BOOL DEFAULT 'f',
ordername VARCHAR(255),
auth BOOL DEFAULT 't',
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername text_pattern_ops);
CREATE TABLE supermasters (
ip INET NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) NOT NULL,
PRIMARY KEY(ip, nameserver)
);
CREATE TABLE comments (
id SERIAL PRIMARY KEY,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
CONSTRAINT domain_exists
FOREIGN KEY(domain_id) REFERENCES domains(id)
ON DELETE CASCADE,
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
kind VARCHAR(32),
content TEXT
);
CREATE INDEX domainidmetaindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id SERIAL PRIMARY KEY,
domain_id INT REFERENCES domains(id) ON DELETE CASCADE,
flags INT NOT NULL,
active BOOL,
content TEXT
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id SERIAL PRIMARY KEY,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
CONSTRAINT c_lowercase_name CHECK (((name)::TEXT = LOWER((name)::TEXT)))
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);