Q1.数据库日志频繁记录“incomplete startup packet”
问题描述
PostgreSQL 10主备同步进程出现故障,观察主库错误日志信息看,有大量的“incomplete startup packet”信息,以及磁盘空间不足的提示。
问题解答
频繁的客户端连接使用了不规范的消息格式导致数据库服务器大量记录“incomplete startup packet”到日志文件,引起磁盘空间写满。
详细分析及建议可以参考:预防客户端bad connection连接
Q2.PITR配置恢复相关的参数是否可以配置在触发文件里?
问题描述
PostgreSQL 12之前的recover.signal或者12开始的standby.signal文件是否可以配置restore_command等相关参数,还是需要同时配置recovery.conf或者postgresql.conf。
问题解答
触发文件不需要配置,一般是一个空文件,如果配置恢复相关的参数,不会起作用,正确的方式是配置在recovery.conf文件(版本<12),或者postgresql.conf(版本>=12)。
Q3.DDL如何防止SQL注入?
问题描述
JDBC可以使用PreparedStatement对DML进行语句预编译来防注入,但DDL是失效的。
问题解答
可以采用动态语句变通实现,使用函数封装:
CREATE OR REPLACE FUNCTION public.f_enum_add_val(enmu_val character varying) RETURNS void LANGUAGE plpgsql AS $function$ begin execute format('alter type currency add value %L ',enmu_val); end; $function$;
复制
Q4.游标可以跨事务使用吗?
问题描述
通常游标只能存在于数据库transaction范围内:因为游标就是单一的SQL语句,SQL语句总是事务的一部分,游标在事务结束后会自动关闭。但有些场景是否可以跨transaction使用游标呢?
问题解答
PostgreSQL 11开始对procedure支持WITH HOLD特性的游标,使用WITH HOLD,可以突破单个transaction这个限制,这个特性比较有用,但我们必须要考虑commit对性能的影响,并且记得close游标,释放资源。
Q5.子事务有什么危害?
问题描述
子事务对应的功能是savepoint,即使不显式使用savepoint,存储过程中的begin… exception块也会隐式的引入子事务,那么子事务有什么危害?
问题解答
子事务的危害:
- 事务ID快速增长,增加事务ID回卷风险
- 逻辑订阅场景下,可能产生大量临时小文件(逻辑复制槽目录过快产生.spill落盘文件)
- 单个会话中子事务数超过64后,进入suboverflow状态,高并发场景下可能导致数据库整体性能大幅下降
建议谨慎使用子事务,特别是在大事务,长事务中。
Q6.repmgr中执行switchover切换报错:无法执行checkpoint。
问答链接参考:
https://www.modb.pro/issue/17000
问题描述
repmgr中执行switchover切换使用–force-rewind时有一个错误提示:
ERROR: unable to execute CHECKPOINT
复制
问题解答
参考repmgr官方文档描述,为了防止切换时未干净关库,使用–force-rewind选项可以在必要时用pg_rewind工具进行主备数据同步,执行checkpoint操作需要repmgr用户具有superuser权限,也可以使用-S/–superuser指定超级用户手工验证确认改问题。