postgresql 使用Greenplum在数据库之间拷贝数据而不丢失数据的最佳方法

r6vfmomb  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(192)

我的数据库依赖Greenplum拷贝功能将数据从源数据库拷贝到目标数据库。
目前,我有一个进程,它使用以下copy语句从PostgreSQL源代码复制数据:

psql -d ${SRC_DB} -Atc """ COPY ( select * from ${table_name} ) TO STDOUT DELIMITER E'\37' NULL E'' QUOTE E'\36' CSV """  > /base_dir/${SRC_TABLE_NAME}.csv

字符串
这个函数所做的是在本地复制所有数据,以便以后复制到目标数据库。
然后,此函数使用以下函数将数据复制到目标数据库中:

psql -d ${TRGT_DB} -Atc "\copy ${TRGT_TBL} from /base_dir/${SRC_TABLE_NAME}.csv DELIMITER E'\37' NULL E'' QUOTE E'\36' CSV LOG ERRORS SEGMENT REJECT LIMIT 100 PERCENT"


我注意到,对于超过一百万条记录的非常大的表,在加载过程中目标表中的数据会丢失。在将数据移动到CSV的暂存过程中,似乎甚至会丢失数据。通常会有一些特殊字符被视为分隔符的问题。
有没有办法避免这种数据丢失?我听说过一些关于二进制转换的事情。我将如何在示例中使用它?

yrefmtwq

yrefmtwq1#

COPY功能在Greenplum中效率不高,因为它会将所有数据从数据段中提取出来,并通过协调器节点,从而造成瓶颈。
gpbackup/gprestore使用COPY,但更具体地说是ON SEGMENT选项,它将复制到存储数据的实际段/从存储数据的实际段复制。
https://docs.vmware.com/en/VMware-Greenplum/6/greenplum-database/ref_guide-sql_commands-COPY.html
有多种方法可以将数据从源群集拷贝到目标Greenplum群集。
我想看看:

  • gpcopy
  • gpbackup/gprestore(您可以手动将备份文件从源复制到目标,也可以备份到共享存储,如S3兼容的文件系统或NFS。
snz8szmq

snz8szmq2#

我们使用pg_dumppg_restore在greenplum和postgres之间一次传输一个模式的数据,并且没有注意到任何数据丢失。我已经针对特定的表而不是特定的模式调整了命令。这假设表在目标数据库中具有相同的名称。

pg_dump --host=$(SOURCE_IP) --dbname=$(SOURCE_DATABASE_NAME) --username=$(SOURCE_USER) --no-password --table=$(SOURCE_TABLE) --file=\\tmp\\$(SOURCE_TABLE)_data.dmp --format=d --jobs=4 --quote-all-identifiers --compress=9 --no-privileges --no-owner --blobs --data-only

个字符
也可以在Greenplum端使用FOREIGN TABLE来使用postgres_fdw从postgres读取数据。我自己还没有尝试过这种方法。

相关问题