部署 PostgreSQL 安装配置 MeteorCat 2023-09-28 2025-12-21
以下简称 PgSQL
PGSql原生支持 NoSQL 的特性, 不过却是关系型数据库; 其JSON的性能不输给 MongoDB, 算是现在值得在生产环境之中投入使用的数据库.
安装配置
这里可以参考官方文档配置: 官方文档
直接选择对应系统配置源:
这里直接配置 Debian11 的源( postgresql-12, 默认很多发行版已经内置, 所以大部分情况不需要执行这些操作):
1 2 3 4 5 sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
此时源配置已经完成, 就可以准备安装服务:
1 2 3 4 5 6 sudo apt-get updatesudo apt-get -y install postgresql postgresql-client
服务会自动配置到系统之中, 直接采用系统去调取服务:
1 2 3 4 sudo systemctl status postgresql.service sudo systemctl start postgresql.service sudo netstat -tulpn|grep -E 'postgresql|5432' sudo systemctl enable postgresql.service
注意默认监听端口为 5432
账号配置
这里一般配置文件设置, 配置文件放置于 /etc/postgresql/14/main/postgresql.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 data_directory = '/var/lib/postgresql/14/main' hba_file = '/etc/postgresql/14/main/pg_hba.conf' listen_addresses = '*' port = 5432
这里基本上只需要最基础的这三个配置, 首先是创建对外账号处理( 修改配置之后重启服务 ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 CREATE ROLE manager WITH LOGIN SUPERUSER CREATEDB CREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD 'qwerty123456' ; COMMENT ON ROLE manager IS '自定义对外数据库管理账号' ;DROP ROLE manager;CREATE ROLE api WITH LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD 'qwerty123456' ; COMMENT ON ROLE api IS '仅用于操作 sdk 数据库的低权限账号' ;GRANT CONNECT ON DATABASE sdk TO api;\c sdk GRANT USAGE ON SCHEMA public TO sdk;GRANT SELECT , INSERT , UPDATE , DELETE ON ALL TABLES IN SCHEMA public TO sdk;ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT , INSERT , UPDATE , DELETE ON TABLES TO sdk;
之后测试下登录:
1 2 3 psql --host=127.0.0.1 --username=manager --dbname=postgres
这里需要手动写入 Host 表来开放访问( Host 文件: /etc/postgresql/14/main/pg_hba.conf ):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 # 访问HOST 访问数据库 访问用户 访问地址 加密方式 # TYPE DATABASE USER ADDRESS METHOD # 这里不需修改其他, 追加创建的用户即可, 加密方式最低采用md5 host all manager 0.0.0.0/0 md5 # TYPE - host: 表示通过 TCP/IP 网络连接(区别于本地 unix socket 的 local 类型) # DATABASE - all: 允许该用户访问所有数据库, 如果想指定多个数据库以逗号分割(db1,db2,db3) # 可以 '@文件名' 加载, 例如 /etc/postgresql/14/main/db_list.conf 添加文件, 每一行写一个数据库名称 # 然后追加 @/etc/postgresql/14/main/db_list.conf 来指定读取文件加载数据库 # USER - manager: 匹配要授权的数据库角色 # ADDRESS - 0.0.0.0/0: 允许所有 IP 地址的客户端连接(生产环境需谨慎,建议限定具体 IP / 网段), 支持网段配置 # /32 = 子网掩码 255.255.255.255 → 单个 IP - 常用 # /24 = 子网掩码 255.255.255.0 → 256 个 IP - 常用 # /16 = 子网掩码 255.255.0.0 → 65536 个 IP # 这里提供几个常用的网段地址: # 127.0.0.1/32 - 仅允许本地主机连接 # 192.168.1.0/24 - 允许 192.168.1.1 ~ 192.168.1.255 网段的客户端连接 # 10.0.0.0/8 - 允许所有 10.x.x.x 网段的客户端连接 # 172.16.0.0/12 - 允许 172.16.0.1 ~ 172.31.255.255 网段的客户端连接 # 192.168.0.0/16 - 允许所有 192.168.x.x 网段的客户端连接 # 10.1.2.3/32 仅允许 单个 IP 10.1.2.3 连接 # METHOD - md5: 加密方案, 采用 md5 加密兼容性比较好, 但是官方比较推荐的 scram-sha-256 方式, 可以按需来选择
配置好之后重启服务即可, 这样就能直接访问了.
常用语句
实际上 PSQL 和其他 MySQL/MariaDB 语法类型, 所以学习起来也很容易:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 \l SELECT datnameFROM pg_database;CREATE DATABASE sdk WITH ENCODING = 'UTF8' ; \c sdk CREATE TABLE sdk_user_info( id BIGSERIAL NOT NULL PRIMARY KEY , username VARCHAR (64 ) NOT NULL , email VARCHAR (255 ) NOT NULL DEFAULT '' ); COMMENT ON COLUMN sdk_user_info.id IS '用户唯一标识,自增主键' ;COMMENT ON COLUMN sdk_user_info.username IS '用户登录名' ;COMMENT ON COLUMN sdk_user_info.email IS '邮箱地址' ;COMMENT ON TABLE sdk_user_info IS '测试用户表' ;\d+ sdk_user_info INSERT INTO sdk_user_info(username, email)VALUES ('meteorcat' , '[email protected] ' );SELECT *FROM sdk_user_info;SELECT username, emailFROM sdk_user_infoWHERE id > 1 ;SELECT *FROM sdk_user_infoORDER BY id DESC LIMIT 10 OFFSET 0 ;SELECT DISTINCT usernameFROM sdk_user_info;SELECT COUNT(*) AS user_countFROM sdk_user_info;UPDATE sdk_user_infoSET email = '[email protected] ' WHERE id = 1 ;DELETE FROM sdk_user_infoWHERE id = 100 ;
PostgreSQL 的增删改查(CRUD)语法和 MySQL 大部分一致, 所以很好直接切换过来.
导出备份
PostgreSQL 官方提供的 pg_dump(单库/表导出) 和 pg_dumpall(全实例导出) 是首选工具, 支持自定义导出格式、压缩及增量逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 # 全量导出, 基础命令(明文 SQL 格式,便于直接恢复) # 导出 PostgreSQL 实例下所有数据库(含系统库 postgres、template0 等), 及角色和表空间等全局对象 pg_dumpall -U manager -h 127.0.0.1 -p 5432 > /backup/pgsql_full_$(date +%Y%m%d).sql # -U: 指定导出账号(需有 SELECT ANY TABLE 权限) # -h/-p: 数据库地址和端口(远程导出需配置 pg_hba.conf 允许访问) # 指定数据库导出, 导出为可直接执行的 SQL 脚本(推荐日常备份, 假设数据库为 app_db) pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -F p -f /backup/pgsql_appdb_$(date +%Y%m%d).sql # -F p: 明文 SQL 格式(可直接用 psql 恢复,可读性强) # -F c: 自定义二进制格式(压缩率更高, 支持按表 /schema 恢复,适合大库) # 仅导出 app_db 数据库结构(无数据,适合新建环境) pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -F p -s -f /backup/pgsql_appdb_schema_$(date +%Y%m%d).sql # 指定数据库单表导出, 含结构+数据(假设是 app_db 数据库下的 user_info 表) pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -t public.user_info -f /backup/pgsql_userinfo_$(date +%Y%m%d).sql # -s(--schema-only):仅导出结构(表、索引、函数等) # -a(--data-only): 仅导出数据(INSERT 语句) # 仅导出 user_info 表数据(无结构,适合数据补录) pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -t public.user_info -a -f /backup/pgsql_userinfo_data_$(date +%Y%m%d).sql # 指定数据库多表导出, 用 -t 多次指定 pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -t public.user_info -t public.order_detail -f /backup/pgsql_user_order_$(date +%Y%m%d).sql # 指定数据库单表的查询数据导出成 CSV, 便于直接 Excel 打开(假设是 app_db 数据库下的 order_detail 表之中创建时间大于 2025-01-01 00:00:00 的数据) psql -U manager -h 127.0.0.1 -p 5432 -d app_db -c "COPY (SELECT * FROM public.order_detail WHERE create_time >= '2025-01-01 00:00:00') TO '/backup/pgsql_order_202501.csv' WITH (FORMAT csv, HEADER, DELIMITER ',');" # 导出为 SQL 脚本数据(含插入语句) pg_dump -U manager -h 127.0.0.1 -p 5432 -d app_db -t public.order_detail --where "create_time >= '2025-01-01 00:00:00'" -f /backup/pgsql_order_202501.sql
这些命令直接运行定时脚本即可, 需要注意的是必须构建个本地免密登陆的 PSQL 账号来方便直接导出(绝对不要对公网暴露).
不过 PSQL 有系统机制来采用免密登陆操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 # 在执行备份脚本的用户(如 root 或专用备份用户 backup)家目录下创建文件 # 注意该系统用户需要指定不允许登陆: sudo useradd -m -s /sbin/nologin backup sudo -i -u backup # 切换到专门备份用户 vim ~/.pgpass # 生成|编辑免密配置文件 # 写入内容 echo "127.0.0.1:5432:*:manager:你的密码" > ~/.pgpass # * 表示匹配所有数据库,也可指定具体库(如 app_db) # 设置权限 chmod 600 ~/.pgpass # 验证免密登录(无密码提示即成功) psql -U manager -h 127.0.0.1 -d postgres -c "SELECT version();" # 再次账户指定定时脚本来导出 crontab -e # 启动编辑定时脚本