原 将GreenPlum数据库从6升级到7版本(大版本升级)
Tags: 原创GreenPlum升级gpbackupgprestoreS3gpcopy大版本升级
简介
对于GreenPlum来说,若进行小版本升级,则非常方便,例如从6.19到6.28,从7.1到7.3等,只需要停机升级GreenPlum软件即可,
但是对大版本升级,则麻烦一点,生产环境升级,则建议重新搭建一套新的环境,然后进行数据迁移比较稳妥。
从GP6迁移升级到GP7,可选如下的办法:
1、gpbackup和gprestore 速度快,但需要占用额外的存储空间。若使用S3,则可以减少scp传输备份文件的时间。
2、gpcopy 数据经过网络层面直接插入目标库,不落地,对网络要求较高
3、pg_dump和pg_restore 逻辑导出导入,速度慢,占用本地空间,数据量较大时,不推荐
每种方法都有其优缺点,下面对这些方法进行详细分析:
1. 使用 gpbackup 和 gprestore
优点:
- 速度快:
gpbackup
和gprestore
是专为Greenplum优化的备份和恢复工具,能够充分利用Greenplum的并行架构,备份和恢复速度较快。 - 备份和恢复的粒度控制:支持对整个数据库、单个表、schema进行备份和恢复,提供了灵活性。
- 增量备份:AO表支持增量备份,可以减少备份的数据量和时间。
- 可用性:即使在数据库较大或数据量较多的情况下,依然能够提供高效的备份和恢复。
缺点:
- 对GP6和GP7的兼容性限制:
gpbackup
和gprestore
在GP6和GP7之间可能存在某些功能或参数的不兼容,需要仔细检查兼容性问题。 - 备份存储需求:需要额外的存储空间来存放备份文件,尤其是在数据量很大的情况下。
- 操作相对复杂:相较于直接的数据库升级,需要执行多个步骤(备份、传输、恢复等),可能会增加操作的复杂性和风险。
2. 使用 gpcopy
优点:
- 直接数据复制:
gpcopy
可以直接从一个Greenplum集群复制数据到另一个集群,无需先备份再恢复,简化了流程。 - 在线操作:可以在源数据库保持在线的情况下进行数据迁移,减少了停机时间。
- 高效并行复制:支持并行数据复制,可以加速大规模数据集的迁移过程。
- 灵活性:支持选择性地复制数据库中的表和其他对象,提供了更大的迁移灵活性。
缺点:
- 需要两套集群:通常需要一个新的GP7集群作为目标集群,这意味着需要额外的硬件资源。
- 操作复杂度:设置和配置两个集群之间的网络连接、权限和安全设置可能会比较复杂。
- 数据一致性:在源集群保持在线状态时,必须确保在数据复制过程中数据的一致性,可能需要在迁移完成后额外处理增量数据。
3. 使用 pg_dump 和 pg_restore
优点:
- 标准化工具:
pg_dump
和pg_restore
是PostgreSQL的标准备份和恢复工具,与Greenplum兼容性较好,使用广泛且相对稳定。 - 适用性广:不仅可以用于Greenplum,还可以用于其他基于PostgreSQL的数据库系统,因此在多种场景下都可以使用。
- 简单易用:操作相对简单,命令行工具易于掌握,特别适合小规模数据迁移。
缺点:
- 速度较慢:由于
pg_dump
和pg_restore
不支持Greenplum的并行架构,备份和恢复速度可能比其他方法慢,尤其是在处理大规模数据集时。 - 不支持增量备份:只支持全量备份和恢复,对于大数据量的数据库,这可能导致备份和恢复时间过长。
- 需要更多停机时间:通常需要长时间的停机以完成全量备份和恢复,不适合对停机时间敏感的生产环境。
环境准备
利用docker快速初始化GP6、GP7和S3存储。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | -- GP6 docker rm -f gpdb6 docker run -itd --name gpdb6 -h gpdb6270 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/greenplum:6.27.0_v2 \ /usr/sbin/init docker exec -it gpdb6 bash su - gpadmin gpstart -a gpcc start gpcc status gpstate [gpadmin@gpdb6270 soft]$ psql -c "select version()" version ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 9.4.26 (Greenplum Database 6.27.0 build commit:482d4e839d519dcfde9cddf03807787d9d91d015) on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 6.4.0, 64-bit compiled on Apr 4 2024 11:00:20 (1 row) -- GP6 产生数据 createdb sbtest; sysbench /usr/share/sysbench/oltp_common.lua --db-driver=pgsql --pgsql-host=127.0.0.1 --pgsql-port=5432 \ --pgsql-user=gpadmin --pgsql-password=lhr --pgsql-db=sbtest \ --time=300 --table-size=10000 --tables=10 --threads=16 \ --events=999999999 prepare -- GP7 docker rm -f gpdb7 docker run -itd --name gpdb7 -h gpdb7 \ -v /sys/fs/cgroup:/sys/fs/cgroup \ --privileged=true lhrbest/greenplum:7.3.0 \ /usr/sbin/init docker exec -it gpdb7 bash su - gpadmin gpstart -a gpcc start gpcc status gpstate [gpadmin@gpdb7 soft]$ psql -c "select version()" version ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PostgreSQL 12.12 (Greenplum Database 7.3.0 build commit:ebf6c7db0034f8928f20252a306c4ecdb9324d81) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit compiled on Aug 1 2024 08:31:42 Bhuvnesh C. (1 row) -- S3存储 docker rm -f lhrminio docker run -d --name lhrminio -h lhrminio \ -p 9000:9000 -p 9001:9001 -p 922:22 -p 39389:3389 \ -p 29990:9090 -p 29300:3000 \ -v /sys/fs/cgroup:/sys/fs/cgroup --restart=always \ --privileged=true lhrbest/minio:1.0 \ /usr/sbin/init docker exec -it lhrminio bash -- 用户名和密码:minioadmin/minioadmin -- 9000端口指的是minio的WebUI端口,9001是API的端口 -- 默认buket桶为gpbk -- 默认ak和sk都为:12345678 http://192.16.7.162:9000/login |
安装gpbackup软件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | -- GPDB 6 [gpadmin@gpdb6270 soft]$ gppkg -i greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg 20240830:14:24:03:001173 gppkg:gpdb6270:gpadmin-[INFO]:-Starting gppkg with args: -i greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg 20240830:14:24:03:001173 gppkg:gpdb6270:gpadmin-[INFO]:-Installing package greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg 20240830:14:24:03:001173 gppkg:gpdb6270:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-6.27.0/.tmp/gpbackup_tools_RHEL7-1.30.6-1.x86_64.rpm --dbpath /usr/local/greenplum-db-6.27.0/share/packages/database --prefix /usr/local/greenplum-db-6.27.0' 20240830:14:24:06:001173 gppkg:gpdb6270:gpadmin-[INFO]:-Installing greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg locally 20240830:14:24:07:001173 gppkg:gpdb6270:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-6.27.0/.tmp/gpbackup_tools_RHEL7-1.30.6-1.x86_64.rpm --dbpath /usr/local/greenplum-db-6.27.0/share/packages/database --prefix /usr/local/greenplum-db-6.27.0' 20240830:14:24:07:001173 gppkg:gpdb6270:gpadmin-[INFO]:-greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg is already installed. 20240830:14:24:07:001173 gppkg:gpdb6270:gpadmin-[INFO]:-gpbackup 1.30.6 successfully installed 20240830:14:24:07:001173 gppkg:gpdb6270:gpadmin-[INFO]:-greenplum_backup_restore-1.30.6-gp6-rhel7-x86_64.gppkg successfully installed. [gpadmin@gpdb6270 soft]$ -- GPDB 7 [gpadmin@gpdb7 soft]$ gppkg install greenplum_backup_restore-1.30.6-gp7-rhel8-x86_64.gppkg Detecting network topology: [==============================================================] [OK] 2 coordinators and 4 segment instances are detected on 1 unique host. Distributing package: [==============================================================] [OK] Decoding package: [==============================================================] [OK] Verifying package installation:[==============================================================] [OK] Verifying package integrity: [==============================================================] [OK] You are going to install the following packages: Install 'greenplum_backup_restore@1.30.6-gp7' Continue? [y/N] y Allocating disk space: [==============================================================] [OK] Install 'greenplum_backup_rest:[==============================================================] [OK] Result: greenplum_backup_restore has been successfully installed Clean Up: [==============================================================] [OK] [gpadmin@gpdb7 soft]$ |
方式1:GP6备份gpbackup--》GP7还原gprestore
在GP6上进行备份,备份文件放到S3存储中,在GP7上还原
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | cat > /home/gpadmin/s3_config.yaml <<"EOF" executablepath: $GPHOME/bin/gpbackup_s3_plugin options: region: endpoint: http://192.16.7.162:9001 aws_access_key_id: 12345678 aws_secret_access_key: 12345678 bucket: gpbk folder: sbtest EOF gpbackup --dbname sbtest --jobs=16 --plugin-config /home/gpadmin/s3_config.yaml gprestore --plugin-config /home/gpadmin/s3_config.yaml --timestamp=20240903143134 \ --jobs 8 --create-db --redirect-db sbtest4 --on-error-continue |