RDSPostgreSQL FAQ

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 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下载完整版,助力云运维能力更上一层楼!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 SQL 关系型数据库
|
NoSQL 数据库 Redis
|
NoSQL MongoDB 数据库
|
Oracle MySQL 关系型数据库
|
Oracle 关系型数据库 MySQL
|
数据安全/隐私保护 Perl
|
Java 分布式数据库 Hbase
|
分布式计算 Hadoop 资源调度