天天看点

greenplum 4.1 版本及老版本如何使用读写外部表+管道实现gptransfer同步功能

参考gptrasfer的介绍

1.在源数据库中创建一个可写外部表

2.在目标数据库中创建一个可读外部表

3.在源集群中的Segment主机上创建命名管道和gpfdist进程

4.在源数据库中执行一个SELECT INTO语句以插入源数据到可写外部表中

5.在目标数据库中执行一个SELECT INTO语句把数据从可读外部表插入到目标表中

6.可以选择通过在源和目标中比较行计数或者行的MD5哈希来验证数据

7.清除外部表、命名管道和gpfdist进程

刚好有一个4.1版本的库需要做同步,datax对于PB级的数据量同步有点力不从心,测试了一下按照gptrasfer的流程写一个脚本实现

1.gpfdist部署 (可以放在目标库上,设置同一个目录,读写外部表用2个不同端口,不然直接卡死)

nohup gpfdist -d /tmp -p 8000 -m 1048579 &
nohup gpfdist -d /tmp -p 8001 -m 1048579 &
           

2.源库 ip1

CREATE WRITABLE  EXTERNAL TABLE ex_test  (LIKE test)      
  LOCATION ('gpfdist://filehost:8000/test.out')
  FORMAT 'TEXT' (NULL AS '') DISTRIBUTED RANDOMLY;
           

3.目标库 ip2

--按源库的test结构建表

CREATE  TABLE test(...);

CREATE   EXTERNAL TABLE ex_test  (LIKE test) 
  LOCATION ('gpfdist://filehost:8001/test.out')
  FORMAT 'TEXT' (NULL AS '') ;
           

4.gpfdist服务端操作

vi /tmp/gptransfer.sh
#!/bin/bash
mknod /tmp/test.out p
psql -h ip1 -d postgres -U xxx -c 'insert into ext_test select * from test;'&
psql -h ip2 -d postgres -U xxx -c 'insert into test select * from ext_test;'
rm -rf /tmp/test.out
           

chmod +x gptrasfer.sh

./gptrasfer.sh

--参考文档

https://wenku.baidu.com/view/a9ef17d1ce2f0066f53322f3.html

使用GPLOAD实现无落地文件的高速加载oracle数据