Команды и скрипты postgresql db

Удаление пользователя

Чтобы удалить пользователя необходимо передать его права другому, а затем только удалить

REASSIGN OWNED BY doomed_role TO successor_role;
DROP OWNED BY doomed_role;

— повторить предыдущие команды для каждой базы в кластере

DROP ROLE doomed_role;

Скрипт по табличного бэкапа postgres.

Исполнять из под user’a — postgres. Если в кронах — то также из под юзера postgresql.

#!/bin/bash
DBNAMES="web";
USER="postgres";
DB_NAME="web";
NEW_OWNER="user_remote";
DATE_Y=`/bin/date '+%y'`
DATE_M=`/bin/date '+%m'`
DATE_D=`/bin/date '+%d'`
SERVICE="pgdump"
BACKUP_DIR="/var/backup_db/20${DATE_Y}/${DATE_M}/${DATE_D}"
mkdir -p $BACKUP_DIR;
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" ${DB_NAME}` \
           `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" ${DB_NAME}` \
           `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" ${DB_NAME}` ;
do
echo "Exporting table $tbl from db ${DB_NAME} to file tables3/$tbl.backup"
#pg_dump  --format p --verbose --table public.$tbl ${DB_NAME} > $BACKUP_DIR/$tbl
pg_dump  --format p --verbose --table public.$tbl ${DB_NAME} | gzip >  $BACKUP_DIR/$tbl
#pg_dump -a -d -t public.$tbl ${DB_NAME} > tables3/$tbl.sql
done
##################БЭКАП ФУНКЦИЙ POSTGRES
# Делаем dump базы без даты, для того что дальше извлечь их нее функции
pg_dump  -Fc -s -f $BACKUP_DIR/db_dump ${DB_NAME}
/bin/sleep 4;
# Создаем список функция
pg_restore -l $BACKUP_DIR/db_dump | grep FUNCTION > $BACKUP_DIR/function_list
##Как восстановить функции
#########################
#pg_restore -h localhost -U username -d имя_базы -L function_list db_dump
########################

Скрипт по табличного бэкапа postgres. написан на perl

Исполнять из под user’a — postgres. Если в кронах — то также из под юзера postgresql.

#!/usr/bin/env perl
use strict;
use warnings;
my $database_name = 'book_library';
my $query = <<"EOT";
SELECT  n.nspname as table_schema,
        c.relname as table_name
    FROM pg_catalog.pg_class c
        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
    WHERE c.relkind IN ('r','')
        AND n.nspname NOT IN ('pg_catalog', 'information_schema')
        AND n.nspname NOT LIKE '^pg_%'
    ;
EOT
$query =~ s/\n\s*/ /g;
my @results = `echo  "$query" | psql -At $database_name`;
foreach (@results) {
    chomp;
    my ($schema, $table) = split /\|/, $_;
    next unless ($schema && $table);
    my $cmd = "pg_dump -U postgres -Fp -t $schema.$table -f $schema.$table.dump $database_name";
    system($cmd);
}
#If you wanted to restore only a single function:
##pg_restore -U $username --dbname=$dbname --function=$functionname(args)
#If you wanted to restore only a single table:
##pg_restore -U $username --dbname=$dbname --table=$tablename

Бекап и восстановление таблиц

В PostgreSQL есть две утилиты для бекапа pg_dump и pg_dumpall. pg_dump используется для бекапа одной базы, pg_dumpall для бекапа всех баз и сервера в целом (необходимо запускать под postgresql-суперпользователем).

Создание бекапа базы mydb, в сжатом виде

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -f mydb.backup mydb

Создание бекапа базы mydb, в виде обычного текстового файла, включая команду для создания БД

pg_dump -h localhost -p 5432 -U someuser -C -F p -b -v -f mydb.backup mydb

Создание бекапа базы mydb, в сжатом виде, с таблицами которые содержат в имени payments

pg_dump -h localhost -p 5432 -U someuser -F c -b -v -t *payments* -f payment_tables.backup mydb

Дамп данных только одной, конкретной таблицы. Если нужно создать резервную копию нескольких таблиц, то имена этих таблиц перечисляются с помощью ключа -t для каждой таблицы.

pg_dump -a -t table_name -f file_name database_name

Создание резервной копии с сжатием в gz

pg_dump -h localhost  -O -F p -c -U postgres mydb | gzip -c > mydb.gz

Список наиболее часто используемых опций:

-h host — хост, если не указан то используется localhost или значение из переменной окруженияPGHOST.

-p port — порт, если не указан то используется 5432 или значение из переменной окружения PGPORT.

-u — пользователь, если не указан то используется текущий пользователь, также значение можно указать в переменной окружения PGUSER.

-a, --data-only — дамп только данных, по-умолчанию сохраняются данные и схема.

-b — включать в дамп большие объекты (blog’и).

-s, --schema-only — дамп только схемы.

-C, --create — добавляет команду для создания БД.

-c — добавляет команды для удаления (drop) объектов (таблиц, видов и т.д.).

-O — не добавлять команды для установки владельца объекта (таблиц, видов и т.д.).

-F, --format {c|t|p} — выходной формат дампа, custom, tar, или plain text.

-t, --table=TABLE — указываем определенную таблицу для дампа.

-v, --verbose — вывод подробной информации.

-D, --attribute-inserts — дамп используя команду INSERT с списком имен свойств.

Бекап всех баз данных используя команду pg_dumpall.

pg_dumpall > all.sql
# проверка бекапа 
grep "^[\]connect" all.sql
\connect db1
\connect db2

В PostgreSQL есть две утилиты для восстановления базы из бекапа.

  • psql — восстановление бекапов, которые хранятся в обычном текстовом файле (plain text);
  • pg_restore — восстановление сжатых бекапов (tar);

Восстановление всего бекапа с игнорированием ошибок

psql -h localhost -U someuser -d dbname -f mydb.sql

Восстановление всего бекапа с остановкой на первой ошибке

psql -h localhost -U someuser --set ON_ERROR_STOP=on -f mydb.sql

Для восстановления из tar-арихива нам понадобиться сначала создать базу с помощью CREATE DATABASE mydb; (если при создании бекапа не была указана опция -C) и восстановить

pg_restore --dbname=mydb --jobs=4 --verbose mydb.backup

Восстановление резервной копии БД, сжатой gz

gunzip mydb.gz
psql -U postgres -d mydb -f mydb

Начиная с версии 9.2 можно восстановить только структуру таблиц с помощью опции --section

# создаем БД
CREATE DATABASE mydb2;
# восстанавливаем
pg_restore --dbname=mydb2 --section=pre-data --jobs=4 mydb.backup

Обслуживание таблицы

VACUUM ANALYZE table;
REINDEX DATABASE dbName;
REINDEX TABLE tabName;

Перенос директории с данным (data directory)

Узнать текущий путь

# способ 1
$ su - postgres
$ psql
psql > SHOW data_directory;
# способ 2
$ ps ax | grep 'postgres -D'

Создадим новую директорию, назначим пользователя и инициализируем

mkdir -p /pathto/postgresql/data
chown -R postgres:postgres /pathto/postgresql
su - postgres
initdb -D /pathto/postgresql/data

Теперь надо подправить файл с сервисом, который стартует postgresql

# под arch linux
sudo vim /etc/systemd/system/multi-user.target.wants/postgresql.service
Environment=PGROOT=/pathto/postgresql/
PIDFile=/pathto/postgresql/data/postmaster.pid

Очищение таблицы

Очищение таблицы tablename и обнуление счетчика с ID.

TRUNCATE TABLE tablename RESTART IDENTITY CASCADE;

CASCADE нужен на случай если tablename связана с другой таблицей.

Удаление NULL у поля

ALTER TABLE movies ALTER COLUMN year DROP NOT NULL;

Утилиты

pgcli утилита командной строки с авто-дополнениям и подсветкой синтаксиса.

Установка

pip install pgcli

Запуск

pgcli -U postgres -W dbname

 

Скрипт изменения владельца базы данных и таблиц postgresql

#!/bin/bash
usage()
{
cat << EOF
usage: $0 options
This script set ownership for all table, sequence and views for a given database
Credit: Based on https://stackoverflow.com/a/2686185/305019 by Alex Soto
        Also merged changes from @sharoonthomas
OPTIONS:
   -h      Show this message
   -d      Database name
   -o      Owner
EOF
}
DB_NAME=
NEW_OWNER=
while getopts "hd:o:" OPTION
do
    case $OPTION in
        h)
            usage
            exit 1
            ;;
        d)
            DB_NAME=$OPTARG
            ;;
        o)
            NEW_OWNER=$OPTARG
            ;;
    esac
done
if [[ -z $DB_NAME ]] || [[ -z $NEW_OWNER ]]
then
     usage
     exit 1
fi
for tbl in `psql -qAt -c "select tablename from pg_tables where schemaname = 'public';" ${DB_NAME}` \
           `psql -qAt -c "select sequence_name from information_schema.sequences where sequence_schema = 'public';" ${DB_NAME}` \
           `psql -qAt -c "select table_name from information_schema.views where table_schema = 'public';" ${DB_NAME}` ;
do
    psql -c "alter table \"$tbl\" owner to ${NEW_OWNER}" ${DB_NAME} ;
done

Отправка postgresql в rsyslog > fluentd > kibana

Макет для rsyslog.d

$ModLoad imfile
$InputFileName /var/log/postgresql/postgresql-9.4-main.log
$InputFileTag postgresql-9.4-main.log
$InputFileStateFile postgresql-9.4-main.log.state
$InputFileFacility local6
$InputRunFileMonitor
$template simple, " %msg%"
local6.* @;simple

Postgres pgpool2 presentation

pgpool-ii-3-5-presentation

Добавить комментарий

Войти с помощью: 

Ваш e-mail не будет опубликован. Обязательные поля помечены *