RDSPostgreSQL FAQ

本文涉及的产品
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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 列为本次freezeXID。表年龄就是当前的最新的XID relfrozenxid的差值,而元组年龄可以理解为每个元组的t_xminrelfrozenxid的差值。所以,这个参数也可以被简单理解为每个元组两次被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_ageXID 增长之后,这个表肯定会被强制地进行 一次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_agevacuum_freeze_min_age的差值。

 

但是如果设置autovacuum_freeze_max_age vacuum_freeze_table_age过大,因为需要存储更多的事务提交信息,会造成pg_xact pg_commit 目录占用更多的空间。例如,我们把autovacuum_freeze_max_age设置为最大值20亿,pg_xact大约占500MBpg_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/Greenplumbinlog_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下载完整版,助力云运维能力更上一层楼!

相关实践学习
自建数据库迁移到云数据库
本场景将引导您将网站的自建数据库平滑迁移至云数据库RDS。通过使用RDS,您可以获得稳定、可靠和安全的企业级数据库服务,可以更加专注于发展核心业务,无需过多担心数据库的管理和维护。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
SQL 运维 关系型数据库
如何对比MySQL主备数据的一致性?
如何在数据库世界中处理大批量数据变更操作,而不影响业务运行。NineData的OnlineDML解决方案通过无锁方式实现数据变更,确保在线业务的顺畅运行。只需两步操作即可开启OnlineDML功能,让NineData自动处理大型DML操作,分批执行并根据数据库压力进行智能调整,简化操作流程并提供直观操作界面。
701 2
如何对比MySQL主备数据的一致性?
|
关系型数据库 数据库 PostgreSQL
在 Postgres 中使用 Alter Table
【8月更文挑战第11天】
988 0
在 Postgres 中使用 Alter Table
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之如何获取 Oracle 自增 ID
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
存储 自然语言处理 关系型数据库
如何使用AnalyticDB PostgreSQL 版实现“一站式全文检索”业务
本文从阿里云用户使用云原生数据仓库AnalyticDB PostgreSQL版(以下简称ADB PG)的实际体验出发,介绍ADB PG如何实现“一站式全文检索”业务,并详细阐述ADB PG使用的优势技术,最后提供对应业务案例分析。
如何使用AnalyticDB PostgreSQL 版实现“一站式全文检索”业务
|
运维 负载均衡 Serverless
深度 | 从0到3.0,揭秘阿里云洛神云网络的进化之路
深度 | 从0到3.0,揭秘阿里云洛神云网络的进化之路
1629 0
|
存储 运维 容灾
为什么游戏行业喜欢用PolarDB
PolarDB 在游戏行业的最佳实践
22324 4
为什么游戏行业喜欢用PolarDB
|
存储 SQL 缓存
前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布
本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云资深技术专家 魏闯先关于“AnalyticDB PostgreSQL年度新版本发布”的分享。
744 0
前沿分享|阿里云资深技术专家 魏闯先:AnalyticDB PostgreSQL年度新版本发布
|
存储 SQL 分布式计算
全网首发|阿里资深技术专家数仓调优经验分享(上)
本篇文章总结了AnalyticDB表的设计的最佳经验、数据写入的最佳经验、高效查询的最佳实践,以及一些常见的问题。
494 0
全网首发|阿里资深技术专家数仓调优经验分享(上)
|
SQL 监控 Cloud Native
前沿分享|阿里云数据库解决方案架构师 王宏宇:云原生数据仓库AnalyticDB在零售行业的深度应用和业务价值
本篇内容为2021云栖大会-云原生数据仓库AnalyticDB技术与实践峰会分论坛中,阿里云数据库解决方案架构师 王宏宇关于“云原生数据仓库AnalyticDB在零售行业的深度应用和业务价值”的分享。
694 0
前沿分享|阿里云数据库解决方案架构师 王宏宇:云原生数据仓库AnalyticDB在零售行业的深度应用和业务价值