我的数据库依赖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的暂存过程中,似乎甚至会丢失数据。通常会有一些特殊字符被视为分隔符的问题。
有没有办法避免这种数据丢失?我听说过一些关于二进制转换的事情。我将如何在示例中使用它?
2条答案
按热度按时间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群集。
我想看看:
snz8szmq2#
我们使用
pg_dump
和pg_restore
在greenplum和postgres之间一次传输一个模式的数据,并且没有注意到任何数据丢失。我已经针对特定的表而不是特定的模式调整了命令。这假设表在目标数据库中具有相同的名称。个字符
也可以在Greenplum端使用FOREIGN TABLE来使用postgres_fdw从postgres读取数据。我自己还没有尝试过这种方法。