service:postgres
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:postgres [20.07.2024 07:55] – [Взаимодействие с ОС] viacheslav | service:postgres [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== PostgreSQL ====== | ||
+ | <code bash> | ||
+ | # Сделать новый контейнер | ||
+ | docker run --rm -d -e POSTGRES_PASSWORD=123456 -v / | ||
+ | # Создать базу | ||
+ | docker exec postgres psql -U postgres -c " | ||
+ | # Список баз | ||
+ | docker exec postgres psql -U postgres -t -c " | ||
+ | # Подключиться к базе testdb1 в контейнере postgres интерактивно | ||
+ | docker exec -it postgres psql -U postgres -d testdb1 | ||
+ | # Наполнение базы тестовыми данными - https:// | ||
+ | |||
+ | # Список схем в БД testdb1 | ||
+ | docker exec postgres psql -U postgres -d testdb1 -t -c " | ||
+ | |||
+ | # Удалить (drop) базу | ||
+ | docker exec -it postgres psql -U postgres -c "DROP DATABASE testdb1;" | ||
+ | </ | ||
+ | |||
+ | ===== Бэкап ===== | ||
+ | Бэкап баз | ||
+ | <code bash> | ||
+ | container=$(docker ps -qf " | ||
+ | user=postgres | ||
+ | backup_dir="/ | ||
+ | current_date=$(date +%F-%H-%M) | ||
+ | days_keep=7 | ||
+ | |||
+ | mkdir -p $backup_dir/ | ||
+ | for db_name in $(docker exec $container psql -U $user -t -c " | ||
+ | do | ||
+ | docker exec $container pg_dump -U $user $db_name > $backup_dir/ | ||
+ | gzip $backup_dir/ | ||
+ | # combined backup + gzip | ||
+ | # docker exec $container pg_dump -U $user $db_name |gzip > $backup_dir/ | ||
+ | done | ||
+ | |||
+ | find $backup_dir -maxdepth 1 -type d -mtime +$days_keep -exec rm -r {} + | ||
+ | </ | ||
+ | https:// | ||
+ | ===== Восстановление ===== | ||
+ | <code bash> | ||
+ | # Восстановить базу testdb1 из сжатого дампа | ||
+ | zcat db_backups/ | ||
+ | |||
+ | # Удалить схему public базы testdb1 вместе с вложенными объектами (cascade) | ||
+ | docker exec -i postgres psql -U postgres -d testdb1 -c 'drop schema public cascade;' | ||
+ | # Восстановить схему public базы testdb1 из сжатого дампа | ||
+ | zcat db_backups/ | ||
+ | </ | ||
+ | |||
+ | ====== DBA1 ====== | ||
+ | https:// | ||
+ | Демо-база: | ||
+ | ===== Установка и управление сервером ===== | ||
+ | https:// | ||
+ | |||
+ | <code yaml> | ||
+ | --- | ||
+ | # https:// | ||
+ | |||
+ | services: | ||
+ | postgres: | ||
+ | image: postgres: | ||
+ | ports: | ||
+ | - 5432:5432 | ||
+ | environment: | ||
+ | POSTGRES_PASSWORD: | ||
+ | POSTGRES_INITDB_ARGS: | ||
+ | TZ: Europe/ | ||
+ | PGTZ: Europe/ | ||
+ | volumes: | ||
+ | - ./ | ||
+ | |||
+ | networks: | ||
+ | default: | ||
+ | name: postgres | ||
+ | external: false | ||
+ | |||
+ | </ | ||
+ | Если база уже создана, | ||
+ | https:// | ||
+ | |||
+ | [[https:// | ||
+ | |||
+ | PGDATA - переменная, | ||
+ | |||
+ | Ключ '' | ||
+ | |||
+ | <code bash> | ||
+ | mkdir / | ||
+ | export PGDATA=/ | ||
+ | export PATH=/ | ||
+ | # Можно без -D, т. к. PGDATA задана. Если не указывать -U, то запрос будет идти от имени текущего пользователя. | ||
+ | initdb -U postgres -k -D / | ||
+ | </ | ||
+ | |||
+ | [[https:// | ||
+ | <code bash> | ||
+ | # Запуск с логом. Без -D, т. к. PGDATA задана. | ||
+ | pg_ctl start -l / | ||
+ | pg_ctl stop | ||
+ | |||
+ | # С какими параметрами собран кластер | ||
+ | docker exec postgres-postgres-1 pg_config --configure | ||
+ | |||
+ | # Проверка/ | ||
+ | pg_ctl stop | ||
+ | sudo / | ||
+ | sudo / | ||
+ | pg_ctl start | ||
+ | # Без остановки сервера статус контрольных сумм можно проверить | ||
+ | psql -Axtc 'show data_checksums' | ||
+ | docker exec -u postgres postgres-postgres-1 pg_controldata |grep checksum # Data page checksum version: 1 (включено) | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | **Специфика Ubuntu:** вместо '' | ||
+ | <code bash> | ||
+ | sudo pg_ctlcluster 16 main start # stop/ | ||
+ | # Местоположение лога при пакетной установке | ||
+ | ls -l / | ||
+ | </ | ||
+ | ===== Использование psql ===== | ||
+ | psql — терминальный клиент для работы с СУБД. При запуске требуются параметры подключения. Выполняет команды SQL и psql.\\ | ||
+ | Содержит инструменты для интерактивной работы, | ||
+ | https:// | ||
+ | https:// | ||
+ | <code powershell> | ||
+ | # Клиент на винде | ||
+ | # Подключение к БД postgres, пользователь postgres, хост ubuntu, порт 5432 | ||
+ | psql.exe -d postgres -U postgres -h ubuntu -p 5432 | ||
+ | # Информация о подключении в консоли postgres | ||
+ | \conninfo | ||
+ | Вы подключены к базе данных " | ||
+ | # новое подключение, | ||
+ | \c[onnect] | ||
+ | # Команды SQL, в отличие от команд psql, могут располагаться на нескольких строках. | ||
+ | SELECT schemaname, tablename, tableowner | ||
+ | FROM pg_tables | ||
+ | LIMIT 5; | ||
+ | </ | ||
+ | |||
+ | ==== Форматирование вывода результатов запроса ==== | ||
+ | Формат по умолчанию - включены заголовки, | ||
+ | <code sql> | ||
+ | SELECT schemaname, tablename, tableowner FROM pg_tables LIMIT 3; | ||
+ | | ||
+ | ------------+------------------+------------ | ||
+ | | ||
+ | | ||
+ | | ||
+ | (3 строки) | ||
+ | </ | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | |||
+ | ==== Взаимодействие с ОС ==== | ||
+ | <code bash> | ||
+ | \! pwd | ||
+ | # Задать переменную hello | ||
+ | \setenv hello world | ||
+ | \! echo hello | ||
+ | world | ||
+ | # \o[ut] - вывод в файл (в Windows тоже нужно использовать / в путях, например, | ||
+ | \o folder/ | ||
+ | \o # Вернуть вывод на экран | ||
+ | </ | ||
+ | |||
+ | ==== Скрипты ==== | ||
+ | <code bash> | ||
+ | # Сгенерировать строки путём запроса и выгрузить в файл. Если файл не указывать, | ||
+ | SELECT format(' | ||
+ | \g (tuples_only=on format=unaligned) tmp/ | ||
+ | # Выполнить файл как скрипт (\i[nclude]), | ||
+ | \i tmp/ | ||
+ | psql < tmp/ | ||
+ | psql -f tmp/ | ||
+ | # Можно запрос сразу выполнить как скрипт | ||
+ | SELECT format(' | ||
+ | </ | ||
+ | |||
+ | ==== Переменные, | ||
+ | <code sql> | ||
+ | -- Связать переменную User с переменной окружения USER (в Windows переменную %USERNAME% нужно писать без %) | ||
+ | \getenv Username USER | ||
+ | -- Задать переменную Test | ||
+ | \set Test Hi | ||
+ | -- Вывод | ||
+ | \echo :Test :Username! | ||
+ | Hi student! | ||
+ | -- Запись запроса в переменную (запрос должен возвращать только одну запись) | ||
+ | SELECT now() AS curr_time \gset | ||
+ | \echo :curr_time | ||
+ | 2024-07-20 08: | ||
+ | -- Вывести все переменные | ||
+ | \set | ||
+ | |||
+ | -- Условие - если переменная не определена, | ||
+ | \if : | ||
+ | \else | ||
+ | -- В винде будет `echo %cd%` | ||
+ | \set working_dir `pwd` | ||
+ | \endif | ||
+ | |||
+ | </ | ||
+ | |||
+ | ==== Настройка psql ==== | ||
+ | При запуске psql выполняются 2 скрипта, | ||
+ | |||
+ | <code sql> | ||
+ | -- Если добавить этот код в ~/.psqlrc, то сразу после старта psql можно будет ввести :top5 для просмотра 5 самых больших таблиц | ||
+ | \set top5 ' | ||
+ | </ | ||
+ | |||
+ | |||
+ | ===== Настройка сервера ===== | ||
+ | https:// | ||
+ | [[https:// | ||
+ | |||
+ | Базовая конфигурация хранится в файлах конфигурации. Основной файл (путь по умолчанию) - '' | ||
+ | раз, будет использоваться значение, | ||
+ | |||
+ | Каталог с доп. файлами конфигурации - ''/ | ||
+ | <code sql> | ||
+ | -- Показать путь к файлу конфигурации | ||
+ | SHOW config_file; | ||
+ | </ |