PostgreSQL: PostgreSQL数据库使用踩坑记录

0、数据库依赖可以这样写:

<dependency>       
     <groupId>org.postgresql</groupId>     
     <artifactId>postgresql</artifactId>      
     <version>9.4.1212</version>    
</dependency>

1、数据库的连接信息可以这样写:

String driver = "org.postgresql.Driver";
String url = "jdbc:postgresql://<ip地址>:<端口>/<数据库名>";
String username = <用户名>;
String password = <密码>;

2、如果PostgreSQL数据库下面有默认的模式,那就要在url后面加一句:

currentSchema=<当前使用的模式名>

3、URL的其他参数:

useSSL=false
serverTimezone=Asia/Shanghai

4、在PostgreSQL里面传入时间戳,除非用statement的字符串拼接来传时间戳数字,否则会出各种问题,参数不能为character varying、text等。所以如果要传入时间戳来比较时间的话,最好入参字符串时间,比如用以下的操作:

SELECT TO_TIMESTAMP('2018-10-01', 'YYYY-MM-DD')

5、PostgreSQL没有MySQL的group_concat函数,也没有Oracle的wm_concat函数,但是可以通过这样的方式来实现聚合功能(array_to_string(array_agg(聚合列)),然后后面可以自定义分隔符,下例就是以英文逗号作为分隔符):

SELECT
    group_by_column,
    array_to_string ( array_agg ( aggregate_column ), ',' ) AS aggregate_column_alias
FROM
    data_table
GROUP BY
    group_by_column

6、PostgreSQL里面的时间格式,是这样的(本例是将时间戳按格式转化为字符串):

TO_CHAR(a.create_date, 'YYYY-MM-DD HH24:MI:SS') AS create_date

7、PostgreSQL里面的一些转换:

--字符转数字
SELECT cast('123' as integer)
--数字转字符
SELECT to_char(123, '999')
--如果不知道数字位数的,后面的9模式可以多写点,但是就会导致有空格,需要trim
SELECT trim(to_char(123, '999999'))

8、PostgreSQL中类似Oracle的NVL函数的函数,就是如果为空,就指定一个默认值的一个函数:coalesce

SELECT coalesce(table.data, 0) AS data FROM table

9、PostgreSQL中如果想通过入参时间戳(long型数据)来插入或修改时间,则需要除以1000,再入参to_timestamp()函数。比如要入参当前时间,则:

//Java代码:先获取当前时间的时间戳
long current_time = System.currentTimeMillis();

//转化为字符串
String current_time_str = String.valueOf(current_time);

//得到除以1000后的字符串:得到转化后的13位字符,除以1000,四舍五入
String longStr = new BigDecimal(current_time_str).divide(new BigDecimal("1000"), 0, BigDecimal.ROUND_HALF_UP).toString();

//得到结果
long current_time_parse = Long.parseLong(longStr);
//入参到PostgreSQL数据库
SELECT to_timestamp(current_time_parse)

10、如果想给PostgreSQL的表加自增主键,则需要先创建一个序列,序列名可以是表名加上"_seq",其执行的SQL如下:

CREATE SEQUENCE "空间名"."表名_seq"  
 INCREMENT 1  
 MINVALUE 1  
 MAXVALUE 9223372036854775807  
 START 1  
 CACHE 1;

然后对应数据库的id主键自增字段,默认值需要改成如下:

nextval('表名_seq'::regclass)

11、将long型的字符串或数字转化为事件字符串的方法(假设入参时间戳为:1566975652828)

//long的字符串转时间字符串
TO_CHAR(TO_TIMESTAMP(CAST ('1566975652828' AS int8) / 1000),'YYYY-MM-DD HH24:MI:SS')

//long的数字转时间字符串
TO_CHAR(TO_TIMESTAMP(1566975652828 / 1000),'YYYY-MM-DD HH24:MI:SS')

//二者都可以得到结果:2019-08-28 15:00:52

12、将时间字符串,转化为时间戳或者long值(假设入参时间字符串为:‘2019-08-28 15:00:52’)

//时间字符串转时间戳
TO_TIMESTAMP('2019-08-28 15:00:52', 'YYYY-MM-DD HH24:MI:SS')

13、在PostgreSQL里面是可以生成连续的日期字符串的,示例如下:

//生成2019年5月29日到2019年6月3日的,格式为 "yyyy-MM-dd" 的连续日期字符串
SELECT
	to_char(t.day::date, 'yyyy-MM-dd') AS date 
FROM 
	generate_series(
		timestamp '2019-05-29', 
		timestamp '2019-06-03', 
		interval '1 day'
	) AS t(day)

执行上面的SQL,PostgreSQL就会生成以下的结果集:
date
2019-05-29
2019-05-30
2019-05-31
2019-06-01
2019-06-02
2019-06-03

<think>嗯,用户需要PostgreSQL集群部署的教程或最佳实践,我需要结合站内引用给出清晰的步骤。用户明确引用了几个关键信息点:主从复制配置(引用1)、配置文件修改位置(引用2)、Patroni高可用方案示例(引用3)、PostgreSQL的核心优势(引用4)以及主节点重启和slave数据同步命令(引用5)。用户是数据库运维或开发人员,实际需求可能是搭建生产环境的高可用集群。深层需求可能包括:避免配置、确保故障切换可靠性、性能优化。引用3提到的Patroni方案值得重点展开,因为这是当前主流的生产级方案。先从基础知识切入,确保用户理解主从复制的必要性——引用4提到的高可用性和海量数据支撑能力。部署步骤分为传统手动方式和自动化工具两类:1.传统方式重点参考引用1和5的主从配置,强调postgresql.conf的wal_level/hot_standby等参数设置,以及pg_basebackup同步数据的命令细节2.自动化方案重点用引用3的Patroni示例,说明如何通过systemd管理集群状态需要提醒配置文件路径差异(引用2提到/usr/pgsql-*/bin目录结构),避免版本兼容问题。操作风险方面,引用5的rm-rf命令危险,必须加注"确保数据备份"的警告。最后主动延伸高可用测试方法(主节点故障模拟)和性能优化建议,覆盖用户可能的后续问题。</think> 以下是基于引用内容整理的PostgreSQL集群部署核心步骤及最佳实践,涵盖主从复制与高可用部署方案: ### 一、基础主从复制集群部署 #### 1. 主节点配置 ```bash # 修改postgresql.conf [^1][^2] wal_level = replica max_wal_senders = 10 hot_standby = on # 创建复制用户 CREATE USER rep REPLICATION LOGIN ENCRYPTED PASSWORD '密码'; ``` ```bash # 修改pg_hba.conf [^1] host replication rep slave_ip/32 md5 ``` ```bash # 重启主节点 [^5] sudo systemctl restart postgresql-14 ``` #### 2. 从节点配置 ```bash # 同步数据(在主节点操作)[^5] rm -rf /home/postgres/data/ # 注意:确保目录为空 pg_basebackup -h master_ip -p 5432 -U rep -Fp -Xs -Pv -R -D /home/postgres/data/ ``` ```bash # 自动生成standby.signal文件[^1] # 检查postgresql.auto.conf包含: primary_conninfo = 'host=master_ip port=5432 user=rep password=xxx' ``` ### 二、高可用方案(基于Patroni) #### 1. 核心组件部署 ```yaml # /etc/patroni.yml 示例 [^3] scope: pg_cluster name: node1 restapi: listen: 0.0.0.0:8008 etcd: hosts: [etcd_node1:2379, etcd_node2:2379] bootstrap: dcs: ttl: 30 retry_timeout: 10 postgresql: use_pg_rewind: true parameters: max_connections: 100 postgresql: listen: 0.0.0.0:5432 data_dir: /var/lib/pgsql/13/data ``` #### 2. 服务管理 ```bash # 启动Patroni集群 [^3] systemctl enable patroni systemctl start patroni # 查看节点状态 patronictl -c /etc/patroni.yml list ``` ### 三、最佳实践建议 1. **性能优化** ```bash # postgresql.conf 关键参数 [^4] shared_buffers = 25% RAM # 建议系统内存的25% maintenance_work_mem = 1GB # 大表维护时提升VACUUM效率 max_parallel_workers = 8 # 利用多核CPU处理查询 ``` 2. **高可用保障** - 使用**etcd/ZooKeeper**管理集群状态(引用3) - 配置**pg_rewind**支持节点重新加入(避免全量同步) - 启用**同步提交**保证数据一致性: ```sql ALTER SYSTEM SET synchronous_commit = remote_write; ``` 3. **灾难恢复** ```bash # 持续归档配置 wal_level = replica archive_mode = on archive_command = 'scp %p backup_server:/pg_wal/%f' ``` ### 四、集群验证方法 ```sql -- 主节点检查复制状态 SELECT client_addr, state, sync_state FROM pg_stat_replication; -- 从节点验证只读状态 SELECT pg_is_in_recovery(); ``` > **重要提示**: > - 主备节点需保持**时间同步**(NTP服务) > - 生产环境建议使用**VIP**或**HAProxy**实现连接池负载均衡 > - 测试环境可用pgpool-II实现自动故障转移 --- ### 相关延伸问题 1. PostgreSQL流复制延迟如何监控与优化? 2. Patroni集群如何实现滚动升级? 3. 集群环境下如何安全地进行大版本升级? 4. PostgreSQL读写分离如何结合中间件实现? [^1]: PostgreSQL主从复制基础配置 [^2]: 关键配置文件路径说明 [^3]: Patroni高可用集群部署示例 [^4]: PostgreSQL集群性能优势解析 [^5]: 节点数据同步操作命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值