RDSPostgreSQL FAQ

简介: RDSPostgreSQL FAQ


我创建索引的时候为什么有大小写的字段必须用引号引起来吗?

create index i_oms_opool on public.oms_orderpool("OrderId",RecvTime);

 

区分大小写

不加不区分大小写

你的字段以前定义的时候是不是用了大小写并且用了双引号

 

在PostgreSQL 中如何设置与vacuum freeze 操作相关的参数?

 

与vacuum freeze相关的参数主要有三个:

 

1.  vacuum_freeze_min_age

2.  vacuum_freeze_table_age

3.  autovacuum_freeze_max_age


vacuum_freeze_min_age 表示表中每个元组需要freeze的最小年龄。这里值得一提的是每次表被freeze 之后,会更新pg_class 中的relfrozenxid 列为本次freeze的XID。表年龄就是当前的最新的XID 与relfrozenxid的差值,而元组年龄可以理解为每个元组的t_xmin与relfrozenxid的差值。所以,这个参数也可以被简单理解为每个元组两次被freeze之间的XID 差值的一个最小值。增大该参数可以避免一些无用的freeze 操作,减小该参数可以使得在表必须被强制清理之前保留更多的XID 空间。该参数最大值为20亿,最小值为2亿。

 

普通的vacuum 使用visibility map来快速定位哪些数据页需要被扫描,只会扫描那些脏页,其他的数据页即使其中元组对应的xmin非常旧也不会被扫描。而在freeze的过程中,我们是需要对所有可见且未被all-frozen的数据页进行扫描,这个扫描过程PostgreSQL 称为aggressive vacuum。每次vacuum都去扫描每个表所有符合条件的数据页显然是不现实的,所以我们要选择合理的aggressive vacuum周期。PostgreSQL 引入了参数vacuum_freeze_table_age来决定这个周期。

 

vacuum_freeze_table_age 表示表的年龄大于该值时,会进行aggressive vacuum,即扫描表中可见且未被all-frozen的数据页。该参数最大值为20亿,最小值为1.5亿。如果该值为0,则每次扫描表都进行aggressive vacuum。

 

直到这里,我们可以看出:

 

当表的年龄超过vacuum_freeze_table_age则会aggressive vacuum

当元组的年龄超过vacuum_freeze_min_age后可以进行freeze

为了保证整个数据库的最老最新事务差不能超过20亿的原则,两次aggressive vacuum之间的新老事务差不能超过20亿,即两次aggressive vacuum之间表的年龄增长(vacuum_freeze_table_age)不能超过20亿减去vacuum_freeze_min_age(只有元组年龄超过vacuum_freeze_min_age才会被freeze)。但是看上面的参数,很明显不能绝对保证这个约束,为了解决这个问题,PostgreSQL 引入了autovacuum_freeze_max_age 参数。

 

autovacuum_freeze_max_age 表示如果当前最新的XID 减去元组的t_xmin 大于等于autovacuum_freeze_max_age,则元组对应的表会强制进行autovacuum,即使PostgreSQL已经关闭了autovacuum。该参数最小值为2亿,最大值为20亿。

 

也就是说,在经过autovacuum_freeze_max_age-vacuum_freeze_min_age的XID 增长之后,这个表肯定会被强制地进行 一次freeze。因为autovacuum_freeze_max_age最大值为20亿,所以说在两次freeze之间,XID 的增长肯定不会超过20亿,这就保证了上文中整个数据库的最老最新事务差不能超过20亿的原则。

 

值得一提的是,vacuum_freeze_table_age设置的值如果比autovacuum_freeze_max_age要高,则每次vacuum_freeze_table_age生效地时候,autovacuum_freeze_max_age已经生效,起不到过滤减少数据页扫描的作用。所以默认的规则,vacuum_freeze_table_age要设置的比autovacuum_freeze_max_age小。但是也不能太小,太小的话会造成频繁的aggressive vacuum。

 

另外我们通过分析源码可知,vacuum_freeze_table_age在最后应用时,会去取min(vacuum_freeze_table_age,0.95 autovacuum_freeze_max_age)。所以官方文档推荐vacuum_freeze_table_age=0.95 autovacuum_freeze_max_age。

 

freeze 操作会消耗大量的IO,对于不经常更新的表,可以合理地增大autovacuum_freeze_max_age和vacuum_freeze_min_age的差值。

 

但是如果设置autovacuum_freeze_max_age 和vacuum_freeze_table_age过大,因为需要存储更多的事务提交信息,会造成pg_xact 和 pg_commit 目录占用更多的空间。例如,我们把autovacuum_freeze_max_age设置为最大值20亿,pg_xact大约占500MB,pg_commit_ts大约是20GB(一个事务的提交状态占2位)。如果是对存储比较敏感的用户,也要考虑这点影响。

 

而减小vacuum_freeze_min_age则会造成vacuum 做很多无用的工作,因为当数据库freeze 了符合条件的row后,这个row很可能接着会被改变。理想的状态就是,当该行不会被改变,才去freeze 这行。

 

大家有什么好的方法将excel中的数据导入到postgresql吗?

 

提供两种思路:

 

将Excel导出成CSV文件,然后通过COPY导入

通过Python等语言定义UDF,实现Excel文件的解析,自动创建表并导入数据

参考:https://stackoverflow.com/questions/20039856/import-excel-data-into-postgresql-9-3

 

目前来说,大众市场上用的基本都是MySQL的,那么MySQL如果想要搬迁到PostGresql上去,需要做哪些准备呢?目前有没有比较好用的迁移工具呢?

 

MYSQL迁移到PostgreSQL,可以参考使用阿里云数据库团队的开源项目rds_dbsync,其中MySQL -> PostgreSQL/Greenplum(binlog_minner binlog_loader)实现基于 MySQL binlog 解析的增量数据同步,其github地址为https://github.com/aliyun/rds_dbsync/blob/master/README.md

 

如何从MySQL 迁移数据 到PostgreSQL?

1.  导出mysql表定义(无数据)

2.  --no-data [dbname] >dbdef.sql

3.  使用mysql2postgres把脚本转换为pgsql

4.  上面生成的脚本还不一定很完美,可以尝试导入pgsql,调试错误并手动修改之。我遇到的问题就只有一个,mysql列定义中的zerofill需要手工去掉。一些unsinged定义会生成constraint,如果不需要可以去掉。另外,trigger都有问题,只能后面手工重建

5.  导出mysql数据:

6.  -v -nt --complete-insert=TRUE --compact --no-create-info --skip-quote-names [dbname] >dbdata.sql

老一些版本的pgsql如果不支持批量插入的话还需要加上--extended-insert=FALSE,这个性能损失巨大。

 

转义符

mysql默认字符串里的''是转义符,而pgsql默认不是,修改postgresql.conf:

backslash_quote = on

escape_string_warning = off

standard_conforming_strings = off

数据导入完成后可以改回默认值。


以上内容来自于《云数据库运维实战手册》电子书,可点击https://developer.aliyun.com/topic/download?id=8198下载完整版,助力云运维能力更上一层楼!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
Kubernetes 容器
kubeadm 部署的 k8s 增加 ip 并重新生成证书
kubeadm 部署的 k8s 增加 ip 并重新生成证书
1853 0
|
5月前
|
数据采集 人工智能 运维
提升办公效率 Hermes Agent 功能介绍与搭建教程
Hermes Agent 是 Nous Research 推出的开源 AI 智能体,主打持久记忆与自主进化,内置47+工具,支持 Telegram/Discord/Slack 等平台。具备全域实时检索、三层长效记忆、智能任务自动化、风格化创作及增强语音交互五大能力,45.7MB 轻量,Windows 一键本地部署,新手友好,适用于办公、创作、运维等多场景。(239字)
|
11月前
|
安全 Java Maven
工程搭建
通过阿里云脚手架快速搭建Maven/Gradle工程,支持Spring Boot 2.7.6版本,导入IDEA后添加web依赖,编写接口并启动验证。后续可整合Spring Security实现安全控制,便于快速开发与部署应用。(239字)
工程搭建
|
消息中间件 NoSQL 关系型数据库
体育直播系统积分流水与风控开发:防刷、防伪与限频实现
本案例分享东莞梦幻网络科技体育直播系统的积分流水与风控策略设计,涵盖防刷、防伪、限频三大层面,结合ThinkPHP+MySQL+Redis+WebSocket技术栈,实现积分透明记录、接口限流、设备识别与行为分析,保障积分系统安全与稳定。
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
|
11月前
|
机器学习/深度学习 人工智能 算法
2025年高口碑数字人公司推荐,解锁互动新体验
2025年高口碑AI数字人榜单揭晓!集之互动以0.8秒实时响应、私有化部署和多场景闭环应用领先;Synthesia凭借超写实3D建模与多语言支持,助力全球化内容生产;D-ID创新隐私保护算法,守护敏感行业数据安全。三者分别在交互体验、内容效率与合规安全上表现卓越,满足企业多样化需求,推动数字人从“像真人”迈向“如员工”的实用新时代。
414 0
2025年高口碑数字人公司推荐,解锁互动新体验
|
缓存 网络协议 Linux
Linux系统下 nslookup命令的基本使用
Linux系统下 nslookup命令的基本使用
2441 3
Linux系统下 nslookup命令的基本使用
|
Java 大数据 Maven
jdk17出现错误无法初始化主类 和NoClassDefFoundError:Vector的解决方法
在JDK 17中使用孵化模块Vector时遇到的“无法初始化主类”和“NoClassDefFoundError: Vector”错误的解决方法,通过在Maven项目中配置编译插件、编写测试代码、配置Java运行时环境,并提供了运行项目的示例。
906 9
jdk17出现错误无法初始化主类 和NoClassDefFoundError:Vector的解决方法
|
人工智能 中间件 人机交互
数字人数字服务新技术
数字人技术正重塑人机交互,融合AI、图形学与语音合成,打造具备感知与决策能力的“数字生命体”。从医疗模拟到虚拟偶像,其应用广泛。
|
11月前
|
API Python
腾讯云-联网搜索API-调用Demo
本文介绍了如何使用Python生成腾讯云API的TC3-HMAC-SHA256签名,并通过Authorization请求头调用SearchPro接口实现搜索功能,涵盖签名计算、请求拼接与HTTP调用全过程。
895 0