Работа с PostgreSQL
Эта инструкция охватывает подключение к PostgreSQL, запущенному на сервере 192.168.0.103, и базовые операции.
текущие данные для входа:
- ip 192.168.0.103
- логин postgres(супер-пользователь), kollokpoi
- пароль 12332155
Предварительные условия
На сервере уже должен быть установлен и запущен PostgreSQL. Проверить это можно командой:
# Проверить состояние службы PostgreSQL
systemctl status postgresql
# или для конкретной версии (например, 14)
systemctl status postgresql@14-main
Подключение к PostgreSQL
1. Подключение через терминал сервера (psql)
Утилита psql — это интерактивный терминал PostgreSQL.
# Подключение от имени пользователя postgres (суперпользователь)
sudo -u postgres psql
# Подключение от имени конкретного пользователя
psql -U kollokpoi -d postgres
# Подключение к конкретной базе данных
psql -U kollokpoi -d mydatabase
2. Удаленное подключение из терминала
Для подключения с локальной машины:
# Стандартное подключение
psql -h 192.168.0.103 -U kollokpoi -d postgres
# С указанием порта (по умолчанию 5432)
psql -h 192.168.0.103 -p 5432 -U kollokpoi -d postgres
3. Графические клиенты (рекомендуется)
pgAdmin (Официальный графический интерфейс)
- Скачать с официального сайта
- Полнофункциональная среда администрирования
- Визуальное построение запросов, мониторинг, управление объектами
DBeaver (Бесплатный, кроссплатформенный)
- Официальный сайт
- Универсальный клиент с отличной поддержкой PostgreSQL
- Автодополнение, форматирование SQL, ER-диаграммы
DataGrip (JetBrains, платный)
- Официальный сайт
- Продвинутая IDE для работы с базами данных
- Интеллектуальное автодополнение, рефакторинг, отладка
Postico (Только для macOS, платный)
- Официальный сайт
- Элегантный и простой интерфейс
- Отлично подходит для повседневной работы
Настройка удаленного доступа к PostgreSQL
По умолчанию PostgreSQL разрешает подключения только с localhost. Для настройки удаленного доступа:
-
Измени файл
pg_hba.conf(Host-Based Authentication):sudo nano /etc/postgresql/14/main/pg_hba.confДобавь строку для разрешения подключений с сети:
# Было (только локальные подключения):
# host all all 127.0.0.1/32 md5
# Добавь (разрешить подключения с любой сети):
host all all 0.0.0.0/0 md5
# Или только с конкретной подсети:
host all all 192.168.0.0/24 md5 -
Измени файл
postgresql.conf:sudo nano /etc/postgresql/14/main/postgresql.confНайди и измени параметр:
# Было:
# listen_addresses = 'localhost'
# Стало:
listen_addresses = '*' # или '192.168.0.103,localhost' -
Перезапусти PostgreSQL:
sudo systemctl restart postgresql -
Настрой брандмауэр (если используется):
sudo ufw allow 5432/tcp -
Проверь, что порт слушается:
sudo netstat -tlnp | grep 5432
Основные команды PostgreSQL
Мета-команды psql (начинаются с обратной косой черты)
-- Показать все базы данных
\l
-- Подключиться к базе данных
\c mydatabase
-- Показать таблицы в текущей базе
\dt
-- Показать расширенные сведения о таблицах
\dt+
-- Показать структуру таблицы
\d users
\d+ users -- расширенная информация
-- Показать список пользователей/ролей
\du
-- Выйти из psql
\q
-- Показать справку по командам
\?
Работа с базами данных
-- Создать новую базу данных
CREATE DATABASE mydatabase;
-- Создать базу с указанием владельца
CREATE DATABASE projectdb OWNER kollokpoi;
-- Удалить базу данных
DROP DATABASE mydatabase;
-- Переименовать базу данных
ALTER DATABASE oldname RENAME TO newname;
Работа с таблицами
-- Создать таблицу
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE
);
-- Создать таблицу с индексами
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2),
category_id INTEGER,
CONSTRAINT fk_category FOREIGN KEY (category_id) REFERENCES categories(id)
);
CREATE INDEX idx_products_category ON products(category_id);
CREATE INDEX idx_products_price ON products(price);
-- Удалить таблицу
DROP TABLE users;
-- Очистить таблицу (удалить все данные)
TRUNCATE TABLE users;
CRUD-операции
-- Добавление данных
INSERT INTO users (username, email)
VALUES ('kollokpoi', 'user@example.com');
-- Вставка нескольких строк
INSERT INTO users (username, email)
VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com')
RETURNING id; -- вернет id вставленных строк
-- Чтение данных
SELECT * FROM users;
SELECT username, email FROM users WHERE id = 1;
SELECT * FROM users WHERE created_at > '2024-01-01';
SELECT * FROM users ORDER BY created_at DESC LIMIT 10;
-- Обновление данных
UPDATE users SET email = 'new@example.com' WHERE id = 1;
UPDATE users SET is_active = false WHERE created_at < '2023-01-01';
-- Удаление данных
DELETE FROM users WHERE id = 1;
Расширенные возможности PostgreSQL
JSONB (работа с JSON документами)
-- Создание таблицы с JSONB полем
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
data JSONB,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Вставка JSON
INSERT INTO documents (data)
VALUES ('{"title": "PostgreSQL Guide", "tags": ["database", "sql"], "author": "kollokpoi"}');
-- Поиск по JSON
SELECT * FROM documents WHERE data @> '{"author": "kollokpoi"}';
SELECT data->>'title' AS title FROM documents;
-- Индексирование JSONB
CREATE INDEX idx_documents_data ON documents USING GIN (data);
Полнотекстовый поиск
-- Создание таблицы с полнотекстовым поиском
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title VARCHAR(200),
content TEXT,
search_vector TSVECTOR
);
-- Создание индекса
CREATE INDEX idx_articles_search ON articles USING GIN(search_vector);
-- Поиск
SELECT title FROM articles
WHERE search_vector @@ to_tsquery('english', 'PostgreSQL & руководство');
Экспорт и импорт данных
Экспорт с помощью pg_dump
# Экспорт всей базы
pg_dump -U kollokpoi -h 192.168.0.103 mydatabase > mydatabase_backup.sql
# Экспорт только схемы (без данных)
pg_dump -U kollokpoi -h 192.168.0.103 --schema-only mydatabase > mydatabase_schema.sql
# Экспорт только данных
pg_dump -U kollokpoi -h 192.168.0.103 --data-only mydatabase > mydatabase_data.sql
# Экспорт в сжатом формате
pg_dump -U kollokpoi -h 192.168.0.103 mydatabase | gzip > mydatabase_backup.sql.gz
# Экспорт конкретной таблицы
pg_dump -U kollokpoi -h 192.168.0.103 -t users mydatabase > users_backup.sql
Импорт с помощью psql
# Импорт всей базы
psql -U kollokpoi -h 192.168.0.103 -d mydatabase < mydatabase_backup.sql
# Импорт в новую базу
createdb -U kollokpoi -h 192.168.0.103 newdatabase
psql -U kollokpoi -h 192.168.0.103 -d newdatabase < mydatabase_backup.sql
Копирование данных в/из CSV
-- Экспорт в CSV
COPY users TO '/tmp/users.csv' DELIMITER ',' CSV HEADER;
-- Импорт из CSV
COPY users FROM '/tmp/users.csv' DELIMITER ',' CSV HEADER;
Из командной строки:
# Экспорт в CSV
psql -U kollokpoi -h 192.168.0.103 -d mydatabase -c "COPY users TO STDOUT CSV HEADER" > users.csv
# Импорт из CSV
psql -U kollokpoi -h 192.168.0.103 -d mydatabase -c "COPY users FROM STDIN CSV HEADER" < users.csv
Рекомендуемые официальные туториалы
Для глубокого изучения PostgreSQL:
- PostgreSQL Official Documentation — полная официальная документация
- PostgreSQL Tutorial — неофициальный, но отличный учебник
- Interactive PostgreSQL Tutorial — интерактивный учебник от PostgreSQL
- PostgreSQL Exercises — практические упражнения
- PostgreSQL Wiki — сообщественная вики с советами и best practices
Решение типичных проблем
Ошибка подключения "Connection refused"
-
Проверь, что PostgreSQL запущен:
sudo systemctl status postgresql -
Проверь настройки
listen_addressesвpostgresql.conf:sudo grep listen_addresses /etc/postgresql/*/main/postgresql.conf -
Проверь правила
pg_hba.conf:sudo cat /etc/postgresql/*/main/pg_hba.conf | grep -v '^#' | grep -v '^$'
Ошибка "Role does not exist"
Создай пользователя/роль:
sudo -u postgres createuser --interactive
# или
sudo -u postgres psql -c "CREATE USER kollokpoi WITH PASSWORD 'strong_password';"
Проблемы с правами доступа
-- Дать права пользователю на базу данных
GRANT ALL PRIVILEGES ON DATABASE mydatabase TO kollokpoi;
-- Дать права на все таблицы в схеме public
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO kollokpoi;
-- Дать права на выполнение функций
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO kollokpoi;
Ошибка "Database is being accessed by other users"
Принудительно заверши все подключения:
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE datname = 'mydatabase' AND pid <> pg_backend_pid();
Полезные системные запросы
-- Показать активные подключения
SELECT * FROM pg_stat_activity;
-- Показать размер баз данных
SELECT
datname AS database,
pg_size_pretty(pg_database_size(datname)) AS size
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
-- Показать размер таблиц
SELECT
schemaname AS schema,
tablename AS table,
pg_size_pretty(pg_total_relation_size(schemaname || '.' || tablename)) AS total_size
FROM pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY pg_total_relation_size(schemaname || '.' || tablename) DESC;
-- Проверка производительности запросов
SELECT
query,
calls,
total_time,
mean_time,
rows
FROM pg_stat_statements
ORDER BY total_time DESC
LIMIT 10;
Следующие шаги
После освоения основ PostgreSQL рекомендуется:
- Настроить репликацию (streaming replication) для отказоустойчивости
- Изучить партиционирование таблиц для больших данных
- Настроить мониторинг с помощью pg_stat_statements и pgBadger
- Изучить расширения PostgreSQL:
- PostGIS для геоданных
- pg_cron для выполнения задач по расписанию
- TimescaleDB для временных рядов
- Оптимизировать конфигурацию под нагрузку
- Настроить PgBouncer для пулинга соединений
Для сервера 192.168.0.103 рекомендуется настроить регулярное резервное копирование с помощью pg_dump и мониторинг свободного места.