平时做技术实践时,很多问题不是概念不会,而是细节没串起来。拿“PostgreSQL 安装部署及配置采用教程”来说,它看着像小点,放到项目里常会牵出环境、配置、兼容性和维护成本。下面按实际采用顺序,把思路、关键写法和容易踩坑的地方讲清楚,便于大家直接对照操作。
理解这一步时,PostgreSQL 是一个功能强大的开源对象关系型数据库系统,兼容 SQL 标准和扩展,适合各种规模应用。
sudo apt update
sudo apt install postgresql postgresql-contrib
sudo systemctl status postgresql
sudo yum install -y postgresql-server postgresql-contrib
sudo postgresql-setup initdb
sudo systemctl enable postgresql
sudo systemctl start postgresql
postgresql.conf:主设置文件,通常在 /etc/postgresql/<版本>/main/ 或 /var/lib/pgsql/data/pg_hba.conf:客户端连接认证设置文件编辑 postgresql.conf:
listen_addresses = '*'
编辑 pg_hba.conf,添加如下所示一行允许所有 IP 借助密码方式访问:
host all all 0.0.0.0/0 md5
修改后重启服务:
sudo systemctl restart postgresql
在 postgresql.conf 中修改:
port = 5432
sudo -i -u postgres
psql
-- 创建用户
CREATE USER myuser WITH PASSWORD 'mypassword';
-- 创建数据库
CREATE DATABASE mydb OWNER myuser;
-- 授权
GRANT ALL PRIVILEGES ON DATABASE mydb TO myuser;
ALTER USER myuser WITH SUPERUSER;
psql -U myuser -h localhost -d mydb
-- 创建表
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', '[email protected]');
-- 查询数据
SELECT * FROM users;
-- 更新数据
UPDATE users SET name = 'Bob' WHERE id = 1;
-- 删除数据
DELETE FROM users WHERE id = 1;
pg_dump -U myuser -h localhost mydb > mydb_backup.sql
psql -U myuser -h localhost -d mydb < mydb_backup.sql
lc dbnamedtduqdocker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
在 postgresql.conf 中调整:
max_connections = 100 # 最大连接数
shared_buffers = 128MB # 数据库缓存区大小,建议为物理内存的 1/4
work_mem = 4MB # 每个查询操作分配的内存
maintenance_work_mem = 64MB # 维护操作(如 VACUUM)的内存
effective_cache_size = 512MB # 操作系统可用于缓存的内存估算
修改后需重启 PostgreSQL 服务。
logging_collector = on
log_directory = 'pg_log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
log_statement = 'all' # 建议生产环境设置为 'none' 或 'mod'
PostgreSQL 自动进行垃圾回收,但可手动执行:
VACUUM;
VACUUM FULL; -- 更彻底,可能会锁表
索引优化
新建索引可加速查询:
CREATE INDEX idx_users_email ON users(email);
查询优化
采用 EXPLAIN 分析 SQL 性能:
EXPLAIN SELECT * FROM users WHERE email = 'xxx';
分区表
大表可分区提升性能:
CREATE TABLE measurement (
city_id int,
logdate date,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
连接池
建议采用连接池(如 PgBouncer)减少资源消耗。
PostGIS:地理空间数据库扩展
sudo apt install postgis
CREATE EXTENSION postgis;
uuid-ossp:生成 UUID
CREATE EXTENSION "uuid-ossp";
SELECT uuid_generate_v4();
pg_stat_statements:SQL 统计分析
CREATE EXTENSION pg_stat_statements;
SELECT * FROM pg_stat_statements;
密码策略
理解这一步时,强密码,定期更换,禁用默认用户 postgres 的远程访问。
限制访问 IP
编辑 pg_hba.conf,只允许信任 IP 段访问。
SSL 加密
设置 SSL,保护数据传输安全。
ssl = on
ssl_cert_file = 'server.crt'
ssl_key_file = 'server.key'
定期备份
采用 pg_dump 或 pg_basebackup 定期备份,保存到安全位置。
listen_addresses 和 pg_hba.conf 设置。pg_hba.conf 的认证方式(如 md5、scram-sha-256)。pg_log 目录)。VACUUM 和 REINDEX。编辑 postgresql.conf:
wal_level = replica
max_wal_senders = 10
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'
在 pg_hba.conf 添加从库 IP:
host replication all <slave_ip>/32 md5
采用 pg_basebackup:
pg_basebackup -h <master_ip> -D /var/lib/postgresql/data -U replication -P --wal-method=stream
设置 recovery.conf(PostgreSQL 12 及以上为 standby.signal 文件)。
编辑 crontab,比如每天凌晨2点自动备份数据库:
crontab -e
添加如下所示内容:
0 2 * * * pg_dump -U myuser -h localhost mydb > /backup/mydb_$(date +%F).sql
注意:确保
/backup/目录存在且有写权限,myuser用户有备份权限。
保留最近7天备份,其余自动删除:
find /backup/ -name "mydb_*.sql" -mtime +7 -exec rm {} ;理解这一步时,可用“任务计划程序”调用批处理或 PowerShell 脚本实现定时备份。
pg_stat_activity:查看当前连接和执行的SQLpg_stat_database:数据库级统计信息示例:
SELECT * FROM pg_stat_activity;
SELECT datname, numbackends, xact_commit, xact_rollback FROM pg_stat_database;
pg_upgrade详细官方文档:pg_upgrade
pg_dumpall -U postgres > all.sql
# 在新环境还原
psql -U postgres -f all.sql
pg_dump + psql,或 pg_basebackup(物理迁移)INSERT INTO users (name, email)
VALUES
('Tom', '[email protected]'),
('Jerry', '[email protected]'),
('Spike', '[email protected]');
UPDATE users SET status = 'active' WHERE id IN (1,2,3);
d+ users
SELECT pg_size_pretty(pg_total_relation_size('users'));SELECT count(*) FROM pg_stat_activity;
SELECT * FROM pg_locks WHERE NOT granted;
如何重置用户密码?
ALTER USER myuser WITH PASSWORD 'newpassword';
如何查看数据库版本?
SELECT version();
如何导出/导入表结构而不带数据?
pg_dump -U myuser -h localhost -s mydb > mydb_schema.sql
如何只导出/导入部分表?
pg_dump -U myuser -h localhost -t users mydb > users.sql
psql -U myuser -d mydb < users.sql
CREATE TABLE sales (
id serial PRIMARY KEY,
sale_date date NOT NULL,
amount numeric
) PARTITION BY RANGE (sale_date);
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2024-01-01');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2025-01-01');
SELECT
inhrelid::regclass AS child,
inhparent::regclass AS parent
FROM
pg_inherits;
BEGIN;
UPDATE users SET balance = balance - 100 WHERE id = 1;
UPDATE users SET balance = balance + 100 WHERE id = 2;
COMMIT;
用来保证操作的原子性,一致性,隔离性,持久性(ACID)。
READ COMMITTEDREPEATABLE READSERIALIZABLE设置示例:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SELECT ... FOR UPDATELOCK TABLE table_name IN ACCESS EXCLUSIVE MODE;查看锁信息:
SELECT * FROM pg_locks WHERE NOT granted;
自动记录更新日志:
CREATE TABLE users_log (
id serial PRIMARY KEY,
user_id int,
action varchar(20),
log_time timestamp DEFAULT now()
);
CREATE OR REPLACE FUNCTION log_user_update()
RETURNS trigger AS $$
BEGIN
INSERT INTO users_log(user_id, action) VALUES (NEW.id, 'update');
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER user_update_trig
AFTER UPDATE ON users
FOR EACH ROW EXECUTE FUNCTION log_user_update();
CREATE OR REPLACE FUNCTION add_user(name text, email text)
RETURNS void AS $$
BEGIN
INSERT INTO users(name, email) VALUES (name, email);
END;
$$ LANGUAGE plpgsql;
调用:
SELECT add_user('Bob', '[email protected]');CREATE TABLE orders (
id serial PRIMARY KEY,
info jsonb
);
INSERT INTO orders(info) VALUES ('{"customer": "Tom", "items": ["apple", "banana"]}');
SELECT info->>'customer' FROM orders;
CREATE TABLE docs (id serial PRIMARY KEY, content text);
INSERT INTO docs(content) VALUES ('PostgreSQL is a powerful database system.');
SELECT * FROM docs WHERE to_tsvector('english', content) @@ to_tsquery('powerful & database');
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle' AND pid <> pg_backend_pid();
REINDEX TABLE users;
SELECT relname, n_dead_tup
FROM pg_stat_user_tables
WHERE n_dead_tup > 1000;
pg_log 目录)pg_resetwal 修复 WAL 日志损坏见前文说明。
结合项目来看,PostgreSQL 功能强大,适合各种应用场景。掌握安装、设置、性能优化、扩展、集群与高可用、故障处理等技能,能够让你轻松应对生产环境中的各种需求。如果有具体业务场景、报错信息或者深入某一模块的需求,欢迎继续追问!
到此这篇关于PostgreSQL 安装部署及设置采用教程的文章就介绍到这了,更多相关PostgreSQL 安装采用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多兼容脚本之家!