合 GreenPlum行存表转列存表
需求背景
生产环境Greenplum机器架构为1Master、1Standby、6Segments,Segment主机磁盘为RAID01,容量5.3TB。随着业务增长,数据量增长较快,Segment主机剩余空间不足。
因此提供以下三种解决方案:
- 清理历史数据,回收部分空间;但由于历史数据需要用于数据分析,因此该方案未采纳。
- 集群扩容,由于硬件资源需要重新采购,耗时较久而未采纳该方式。
- 分析当前数据表基本信息,发现都是HEAP表,建议将大表采用列存,使用压缩特性进行空间节省。
生产Greenplum部署架构
Segment 主机上部署8主8备,整个集群共有:
98个PostgreSQL实例:其中2个用于对外提供服务,96个节点用于实际数据存储。
行存表转列存表步骤
1. 查看当前库是否存在列存表
1 2 3 4 5 6 7 8 9 10 11 | SELECT A.relname, A.reloptions, B.nspname FROM pg_class A INNER JOIN pg_namespace B ON A.relnamespace = B.oid WHERE B.nspname NOT IN ( 'gp_tookit', 'information_schema', 'pg_aoseg', 'pg_bitmapindex', 'pg_catalog', 'pg_toast' ) AND A.reloptions::VARCHAR like '%column%'; |
如果存在列存表,在备份时候,将该部分表排除。
2. 备份出表结构
1 | pg_dump -f db_name_struct.sql -F p -c -E utf8 -s -d dbname -h host -U user -p port |
3. 对表结构进行部分替换,添加列存表参数
1 2 3 4 | cp db_name_struct.sql db_name_struct.sql.bak Vi db_name_struct.sql 执行全局替换: :%s/DISTRIBUTED /with(appendonly=true,orientation=column,compresstype=zlib,compresslevel=5) |
4. 对分区表进行特殊替换
1 2 3 | Vi db_name_struct.sql 执行全局替换: :%s/appenonly=’false’/ appendonly=true,orientation=column,compresstype=zlib,compresslevel=5 |
5. 备份数据库中所有表数据,只进行数据备份