使用 vsql 复制数据

可以使用 vsql 在两个 Vertica 数据库之间复制数据。此技术类似于使用 vsql 导出数据中介绍的技术,但您应将一个 vsql 命令的输出传送到另一个 vsql 命令(从 STDIN 运行 COPY 语句)的输入,而不能让 vsql 将数据保存到文件以用于导出。此技术也适用于从输入流接受数据的其他数据库或应用程序。

使用 vsql 进行复制的最简单方法是登录到目标数据库的一个节点,然后发出用于连接到源 Vertica 数据库的 vsql 命令以转储所需数据。例如,以下命令可将节点 testdb01 上的 vmart 数据库中的 store.store_sales_fact 表复制到您已登录到的节点上的 vmart 数据库:

vsql -U username -w passwd -h testdb01 -d vmart -At -c "SELECT * from store.store_sales_fact"  \
| vsql -U username -w passwd -d vmart -c "COPY store.store_sales_fact FROM STDIN DELIMITER '|';"

如果使用的是 Bash shell,您可以对特殊分隔符进行转义。例如,DELIMITER E'\t' 可指定制表符。Bash 以外的其他 shell 可能具有其他字符串字面量语法。

监控进度(可选)

在 Vertica 数据库之间复制大量数据时,您可能希望使用某种方法来监控进度。监控复制操作的进度的方法之一是使用诸如 Pipe Viewer 等实用程序,此类实用程序直接将其输入传送到其输出并同时显示其传递的数据的数量和速度。如果提供所需处理的字节或行的总数,Pipe Viewer 甚至还能显示一个进度栏。可以通过运行将执行 SELECT COUNT 查询的单独的 vsql 命令来获取要处理的行数。

以下命令演示了如何使用 Pipe Viewer 监控前一个示例中所示的复制操作的进度。由于需要获取将复制的行数(可以在 Bash 反引号中使用单独的 vsql 命令来完成此操作,此 vsql 命令会执行字符串的内容并将命令的输出插入到命令行中),该命令变得复杂化。此 vsql 命令仅计算 in the store.store_sales_fact 表中的行数。

vsql -U username -w passwd -h testdb01 -d vmart -At -c "SELECT * from store.store_sales_fact"  \
| pv -lpetr -s `vsql -U username -w passwd -h testdb01 -d vmart -At -c "SELECT COUNT (*) FROM store.store_sales_fact;"` \
| vsql -U username -w passwd -d vmart -c "COPY store.store_sales_fact FROM STDIN DELIMITER '|';"

运行以上命令时,将显示一个如下所示的进度栏:

0:00:39 [12.6M/s] [=============================>                             ] 50% ETA 00:00:40