这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

数据导出

您可能出于以下原因从 Vertica 导出数据:

  • 改为使用外部表中的数据;请参阅使用外部数据

  • 与生态系统中的其他客户或消费者共享数据。

  • 将数据复制到另一个 Vertica 群集。

Vertica 提供了两种导出数据的方法。使用数据导出器,您可以将 SELECT 查询的结果导出到 Parquet、ORC 或分隔格式的文件。您可以在导出中使用分区,这可以在读取外部表中的数据时减小输出文件大小并提高性能。有关详细信息,请参阅文件导出

Vertica 还提供了一种在 Vertica 群集之间直接移动数据的方法,而无需从一个群集导出并加载到另一个群集。您可以执行用来从另一个数据库导入或导出到另一个数据库的操作;除了数据传输方向不同,这两个操作是等价的。有关详细信息,请参阅数据库导出和导入

1 - 文件导出

您可能希望从 Vertica 导出表或其他查询结果,以便与其他应用程序共享,或将较低优先级的数据从 ROS 移动到成本较低的存储。Vertica 支持针对不同文件格式的多种 EXPORT TO 语句:EXPORT TO PARQUETEXPORT TO ORCEXPORT TO JSONEXPORT TO DELIMITED

您可以将数据导出到 HDFS、S3、Google Cloud Storage (GCS)、Azure Blob Storage 或 Linux 文件系统。您可以导出 ROS 数据或可通过外部表读取的数据。导出 ROS 数据后,可以删除受影响的 ROS 分区以回收存储空间。

一定要避免同时导出到同一个输出目标。这样做在任何文件系统上都是错误的,并且会产生不正确的结果。

导出数据后,可以定义外部表以在 Vertica 中读取该数据。Parquet 和 ORC 是 Vertica 可以在查询优化中利用的列式格式,因此请考虑将其中一种格式用于外部表。请参阅使用外部数据

1.1 - 语法

使用 EXPORT 语句可导出由 SELECT 语句指定的数据,如以下示例所示:

=> EXPORT TO PARQUET(directory='webhdfs:///data/sales_data')
   AS SELECT * FROM public.sales;
 Rows Exported
---------------
         14336
(1 row)

directory 实参会指定写入文件的位置且为必需实参。您必须具有写入输出目录的权限。该目录不得已存在。您可以导出到 HDFS、S3、GCS、Azure 或 Linux 文件系统。有关特定于对象存储的其他注意事项,请参阅导出到对象存储。如果导出到本地 Linux 文件系统(不是共享的 NFS 挂载),则必须执行一些额外步骤;请参阅导出到 Linux 文件系统

可以使用 EXPORT 语句在 Vertica 中的多个表之间写入查询并导出结果。通过这种方法,可以利用 Vertica 中强大、快速的查询执行,同时将结果提供给其他客户端:

=> EXPORT TO ORC(directory='webhdfs:///data/sales_by_region')
   AS SELECT sale.price, sale.date, store.region
   FROM public.sales sale
   JOIN public.vendor store ON sale.distribID = store.ID;
 Rows Exported
---------------
         23301
(1 row)

数据类型

所有导出程序都可以导出标量类型和基元数组。JSON 导出程序还支持任意组合的 ARRAYROW 类型:

=> SELECT * FROM restaurants;
       name        | cuisine |       location_city        |                                     menu
-------------------+---------+----------------------------+------------------------------------------------------------------------------
 Bob's pizzeria    | Italian | ["Cambridge","Pittsburgh"] | [{"item":"cheese pizza","price":null},{"item":"spinach pizza","price":10.5}]
 Bakersfield Tacos | Mexican | ["Pittsburgh"]             | [{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]
(2 rows)

=> EXPORT TO JSON (directory='/output/json') AS SELECT * FROM restaurants;
 Rows Exported
---------------
             2
(1 row)

=> \! cat /output/json/*.json
{"name":"Bob's pizzeria","cuisine":"Italian","location_city":["Cambridge","Pittsburgh"],"menu":[{"item":"cheese pizza","price":null},{"item":"spinach pizza","price":10.5}]}
{"name":"Bakersfield Tacos","cuisine":"Mexican","location_city":["Pittsburgh"],"menu":[{"item":"veggie taco","price":9.95},{"item":"steak taco","price":10.95}]}

查询

EXPORT 语句会重写您指定的查询,因为导出是由用户定义的转换函数 (UDTF) 完成的。由于进行了该重写,系统对您提供的查询会有一些限制。

查询只能包含一个外部 SELECT 语句。例如,您不能使用 UNION:

=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
   OVER(PARTITION BY hash)
   AS
   SELECT 1 as account_id, '{}' as json, 0 hash
   UNION ALL
   SELECT 2 as account_id, '{}' as json, 1 hash;
ERROR 8975:  Only a single outer SELECT statement is supported
HINT:  Please use a subquery for multiple outer SELECT statements

而需要重写查询以使用子查询:

=> EXPORT TO PARQUET(directory = '/mnt/shared_nfs/accounts/rm')
   OVER(PARTITION BY hash)
   AS
   SELECT
    account_id,
    json
   FROM
   (
     SELECT 1 as account_id, '{}' as json, 0 hash
     UNION ALL
     SELECT 2 as account_id, '{}' as json, 1 hash
   ) a;
 Rows Exported
---------------
             2
(1 row)

要使用 UNION、INTERSECT 和 EXCEPT 等复合语句,请将其重写为子查询。

导出数据时,可以使用 OVER() 子句对数据进行分区和排序,如对数据进行分区和排序中所述。分区和排序可以提高查询性能。如果对数据进行分区,则不能在 SELECT 语句中指定架构名称和表名称。在这种情况下,请仅指定列名称。

所有导出程序都有一个必需的 directory 参数。所有导出程序都允许您指定压缩类型,并且每个导出程序都有特定于格式的参数。请参阅各个参考页面上的参数描述:EXPORT TO PARQUETEXPORT TO ORCEXPORT TO JSONEXPORT TO DELIMITED

1.2 - 对数据进行分区和排序

导出时,您可以在 SELECT 语句中使用可选的 OVER 子句来指定如何对导出的数据进行分区和/或排序。当 Vertica 查询包含输出数据的外部表时,进行分区可减小输出数据文件的大小并提高性能。(请参阅分区文件路径。)如果未指定如何对数据进行分区,Vertica 会优化导出以实现最大并行度。

要指定分区列,请在 OVER 子句中使用 PARTITION BY,如以下示例所示:

=> EXPORT TO PARQUET(directory = 'webhdfs:///data/export')
  OVER(PARTITION BY date) AS SELECT transactionID, price FROM public.sales;
 Rows Exported
---------------
         28337
(1 row)

您既可以按某个列进行分区,也可以将该列包含在 SELECT 子句中。包含该列即可对其进行排序。Vertica 在查询执行期间仍会利用分区。

您可以对分区内的值进行排序以进一步提高性能。根据表列在查询谓词中出现的可能性对其进行排序;应先对在比较或范围谓词中最常出现的列进行排序。可以在 OVER 子句中使用 ORDER BY 对每个分区内的值进行排序:

=> EXPORT TO PARQUET(directory = 'webhdfs:///data/export')
  OVER(PARTITION BY date ORDER BY price) AS SELECT date, price FROM public.sales;
 Rows Exported
---------------
         28337
(1 row)

即使未进行分区,也可以使用 ORDER BY。按排序顺序存储数据可以提高数据访问速度和谓词评估性能。

OVER 子句中的目标必须为列引用,不能为表达式。有关 OVER 的详细信息,请参阅 SQL 分析

如果要将数据导出到本地文件系统,您可能需要强制要求一个节点写入所有文件。为此,请使用 OVER 空子句。

1.3 - 导出到对象存储

对象存储文件系统(S3、Google Cloud Storage 和 Azure Blob Storage)与影响数据导出的其他文件系统存在一些差异。您必须为身份验证和区域设置一些额外的配置参数,对输出也有一些限制。

在以下参考页面中,对 URI 格式和配置参数进行了描述:

配置参数影响对相应对象存储的所有访问,包括读取和写入。您可以通过在导出数据之前在会话级别进行设置来限制设置的效果,而不是全局设置它们。

输出限制

对象存储文件系统不支持就地重命名文件;它们将重命名实施为副本,然后删除。在其他文件系统上,EXPORT TO PARQUET 通过将输出写入临时目录并在完成时重命名来支持原子性。这种方法对于对象存储是不切实际的,因此 EXPORT TO PARQUET 直接写入目标路径。因此,可以在导出完成之前开始读取导出的数据,这可能会导致错误。请小心等待导出完成,然后再使用数据。

Vertica 不支持同时导出到对象存储中的同一路径。结果未进行定义。

S3 将存储桶限制为 5TB。您可能需要拆分非常大的导出内容。

1.4 - 导出到 Linux 文件系统

如果您导出到 Linux 文件系统上的 NFS 挂载位置,则导出器的行为方式与任何其他共享位置相同:所有导出的文件都写入同一个目标。

如果您导出到本地 Linux 文件系统,则每个 Vertica 节点都会将其部分导出内容写入其本地文件系统。要定义一个外部表来读取导出的数据,您必须指定每个节点和路径,如下例所示:

=> CREATE EXTERNAL TABLE sales (...)
   AS COPY FROM '/data/sales/*.parquet' ON node01,
                '/data/sales/*.parquet' ON node02,
                '/data/sales/*.parquet' ON node03 PARQUET;

每个节点上的路径与您在导出语句中指定的路径相同。

如果省略 ON 子句而只指定路径,则 COPY 仅加载它在启动程序节点上找到的数据。

1.5 - 监控导出

您可以查看有关导出的信息,包括行组数、文件大小和文件名。

导出语句为 UDx。UDX_EVENTS 系统表会记录在 UDx 执行期间记录的事件,包括时间戳、节点名称和会话 ID。此表包含一列 (RAW),其中含有单个 UDx 记录的任何其他数据的 VMap。导出语句会在此表中记录有关已导出文件的详细信息。虽然可以直接使用此表并实体化 VMap 列中的值,但您可能更愿意定义用于简化访问的视图。

以下语句定义的视图将仅显示 EXPORT TO PARQUET 中的事件,从而实体化 VMap 值。

=> CREATE VIEW parquet_export_events AS
   SELECT
    report_time,
    node_name,
    session_id,
    user_id,
    user_name,
    transaction_id,
    statement_id,
    request_id,
    udx_name,
    file,
    created,
    closed,
    rows,
    row_groups,
    size_mb
   FROM
    v_monitor.udx_events
   WHERE
    udx_name ilike 'ParquetExport%';

导出程序将报告以下特定于 UDx 的列:

以下示例显示了单次导出的结果。

=> SELECT file,rows,row_groups,size_mb FROM PARQUET_EXPORT_EVENTS;
                                  file                                 | rows  | row_groups | size_mb
-----------------------------------------------------------------------+-------+------------+----------
 /data/outgZxN3irt/450c4213-v_vmart_node0001-139770732459776-0.parquet | 29696 | 1          | 0.667203
 /data/outgZxN3irt/9df1c797-v_vmart_node0001-139770860660480-0.parquet | 29364 | 1          | 0.660922
(2 rows)

在此表中,输出目录名称 (/data/out) 后面附加了生成的字符串 (gZxN3irt)。要多次导出到 HDFS 或本地文件系统(包括 NFS),EXPORT TO PARQUET 会先将数据写入临时目录,然后在操作结束时对其重命名。系统会在导出期间记录事件,因此显示临时名称。某些输出目标(例如 AWS S3)不支持重命名操作,因此在这些情况下,此表不会显示生成的名称。

2 - 数据库导出和导入

Vertica 可以在 Vertica 数据库之间轻松地导入和导出数据。导入和导出数据对常见任务而言非常有用,如在开发或测试数据库与生产数据库之间或者在具有不同用途但需定期共享数据的数据库之间来回移动数据。

在数据库之间直接移动数据

要在数据库之间移动数据,首先使用 CONNECT TO VERTICA 建立连接,然后使用以下语句之一移动数据:

这些语句是对称的;从群集 A 复制到群集 B 与从群集 B 导出到群集 A 相同。不同之处仅在于由哪个群集驱动操作。

要为连接配置 TLS 设置,请参阅配置群集之间的连接安全

创建 SQL 脚本以导出数据

有三个函数可以返回 SQL 脚本,您可利用该脚本导出要在其他位置重新创建的数据库对象:

虽然复制和导出数据与备份和还原数据库相似,但您应将其用于不同目的,如下所述:

以下部分解释如何在 Vertica 数据库之间导入和导出数据。

安全性和身份验证 中所述,对 Vertica 数据库执行导入/导出时,您只能连接到使用受信任(仅限用户名)或基于密码的身份验证的数据库。不支持 SSL 身份验证。

其他导出

此部分介绍如何将数据导出到另一个 Vertica 数据库。有关将数据导出到文件、然后可以在外部表或 COPY 语句中使用的信息,请参阅文件导出

2.1 - 配置群集之间的连接安全

在群集之间复制数据时,Vertica 可以加密数据和计划元数据。

如果您配置节点间加密,则数据会进行加密(请参阅节点间 TLS)。

对于元数据,默认情况下,Vertica 首先尝试 TLS,然后回退到明文。您可以将 Vertica 配置为需要 TLS 并在无法建立连接时失败。您还可以让 Vertica 在连接之前验证证书和主机名。

在群集之间启用 TLS

要在群集之间使用 TLS,首先必须在节点之间配置 TLS:

  1. 设置 EncryptSpreadComms 参数。

  2. 配置 data_channel TLS CONFIGURATION。

  3. 设置 ImportExportTLSMode 参数。

要在连接到另一个群集时指定严格性级别,请设置 ImportExportTLSMode 配置参数。此参数适用于导入和导出数据。可能的值为:

  • PREFER:尝试 TLS,但如果 TLS 失败,则回退到明文。

  • REQUIRE:如果服务器不支持 TLS,则使用 TLS 并失败。

  • VERIFY_CA:需要 TLS(与 REQUIRE 一样),并使用“服务器”TLS CONFIGURATION 的 CA 证书(在本例中为“ca_cert”和“ica_cert”)指定的 CA 来验证其他服务器的证书:

    => SELECT name, certificate, ca_certificates, mode FROM tls_configurations WHERE name = 'server';
      name  |   certificate    |   ca_certificates   |   mode
    --------+------------------+---------------------+-----------
     server | server_cert      | ca_cert,ica_cert    | VERIFY_CA
    (1 row)
    
  • VERIFY_FULL:需要 TLS 并验证证书(与 VERIFY_CA 一样),并验证服务器证书的主机名。

  • REQUIRE_FORCEVERIFY_CA_FORCEVERIFY_FULL_FORCE:分别与 REQUIREVERIFY_CAVERIFY_FULL 行为相同,并且不能被 CONNECT TO VERTICA 覆盖。

ImportExportTLSMode 是一个全局参数,适用于您使用 CONNECT TO VERTICA 建立的所有导入和导出连接。您可以为单个连接覆盖该参数。

有关这些和其他配置参数的详细信息,请参阅安全性参数

2.2 - 将数据导出到另一个数据库

导出到 VERTICA 将表数据从一个 Vertica 数据库导出到另一个。需要满足以下要求:

  • 您已经使用 CONNECT TO VERTICA 打开了与目标数据库的连接。

  • 源数据库最多只能低于目标数据库一个主要版本。

  • 目标数据库中的表必须存在。

  • 源表列和目标表列必须具有相同或兼容的数据类型。

每个 EXPORT TO VERTICA 语句一次仅从一个表导出数据。您可以将相同的数据库连接用于多个导出操作。

导出过程

导出过程分为三步:

  1. 使用 CONNECT TO VERTICA 连接到目标数据库。

    例如:

    => CONNECT TO VERTICA testdb USER dbadmin PASSWORD '' ON 'VertTest01', 5433;
    CONNECT
    
  2. 使用 EXPORT TO VERTICA 导出所需数据。例如,以下语句将 customer_dimension 中的所有表数据导出到目标数据库 testdb 中的同名表中:

    
    => EXPORT TO VERTICA testdb.customer_dimension FROM customer_dimension;
    Rows Exported
    ---------------
             23416
    (1 row)
    
  3. DISCONNECT 当所有导出和导入操作完成后与目标数据库断开连接:

    => DISCONNECT testdb;
    DISCONNECT
    

源列和目标列之间的映射

如果像前面的示例一样将所有表数据从一个数据库导出到另一个数据库,则 EXPORT TO VERTICA 可以省略指定列列表。仅当两个表中的列定义都符合以下条件时,这才有可能:

  • 列数相同

  • 列名相同

  • 列序列相同

  • 列数据类型匹配或兼容

如果其中任何一个条件不成立,则 EXPORT TO VERTICA 语句必须包含列列表,这些列列表将源列和目标列显式映射到彼此,如下所示:

  • 包含相同数量的列。

  • 按相同顺序列出源列和目标列。

  • 将具有相同(或兼容)数据类型的列配对。

例如:

=> EXPORT TO VERTICA testdb.people (name, gender, age)
   FROM customer_dimension (customer_name, customer_gender, customer_age);

导出表数据的子集

通常,您可以通过两种方式导出表数据的子集:

  • 导出特定源表列的数据。

  • 导出源表上查询(包括历史查询)的结果集。

在这两种情况下,EXPORT TO VERTICA 语句通常必须为源表和目标表指定列列表。

以下示例将源表中的三列数据导出到目标表中的三列。因此,EXPORT TO VERTICA 语句为每个表指定一个列列表。每个列表中的列顺序决定了 Vertica 如何将目标列映射到源列。在本例中,目标列 namegenderage 分别映射到源列 customer_namecustomer_gendercustomer_age

=> EXPORT TO VERTICA testdb.people (name, gender, age) FROM customer_dimension
(customer_name, customer_gender, customer_age);
Rows Exported
---------------
         23416
(1 row)

下一个示例查询源表 customer_dimension,将结果集导出到目标数据库 testdb 中的表 ma_customers

=> EXPORT TO VERTICA testdb.ma_customers(customer_key, customer_name, annual_income)
   AS SELECT customer_key, customer_name, annual_income FROM customer_dimension WHERE customer_state = 'MA';
Rows Exported
---------------
          3429
(1 row)

导出标识列

您可以导出包含标识值和自动增量值的表(或列),但目标表的序列值不会自动递增。您必须使用 ALTER SEQUENCE 进行更新。

可按如下方式导出标识值和自动增量列:

  • 如果源和目标表都具有标识列并且配置参数 CopyFromVerticaWithIdentity 设置为 true (1),则无需列出它们。

  • 如果源表有标识列,而目标表没有,则必须显式列出源列和目标列。

默认情况下,EXPORT TO VERTICA 导出所有标识列。要全局禁用此行为,请设置 CopyFromVerticaWithIdentity 配置参数。

2.3 - 从另一个 Vertica 数据库复制数据

COPY FROM VERTICA 将表数据从一个 Vertica 数据库导入到另一个。需要满足以下要求:

  • 您已经使用 CONNECT TO VERTICA 打开了与目标数据库的连接。

  • 源数据库最多只能低于目标数据库一个主要版本。

  • 目标数据库中的表必须存在。

  • 源表列和目标表列必须具有相同或兼容的数据类型。

导入过程

导入过程分为三步:

  1. 使用 CONNECT TO VERTICA 连接到源数据库。例如:

    => CONNECT TO VERTICA vmart USER dbadmin PASSWORD '' ON 'VertTest01',5433;
    CONNECT
    
  2. 使用 COPY FROM VERTICA 导入所需数据。例如,下面的语句将 customer_dimension 中的所有表数据导入到同名表中:

    
    => COPY customer_dimension FROM  VERTICA vmart.customer_dimension;
     Rows Loaded
    -------------
          500000
    (1 row)
    => DISCONNECT vmart;
    DISCONNECT
    
  3. DISCONNECT 当所有导入和导出操作完成后与源数据库断开连接:

    => DISCONNECT vmart;
    DISCONNECT
    

导入标识列

可按如下方式导入标识(和自动增量)列:

  • 如果源和目标表都具有标识列并且配置参数 CopyFromVerticaWithIdentity 设置为 true (1),则无需列出它们。

  • 如果源表有标识列,而目标表没有,则必须显式列出源列和目标列。

导入列后,标识列值不会自动增加。请使用 ALTER SEQUENCE 进行更新。

此语句的默认行为是通过直接在源表中指定标识(和自动增量)列来导入它们。要全局禁用此行为,请设置 CopyFromVerticaWithIdentity 配置参数。

2.4 - 更改节点导出地址

您可以更改 Vertica 群集的导出地址。您可能需要这样做才能在不同网络子网中的群集之间导出数据。

  1. 创建用于在 Vertica 群集之间导入和导出数据的子网。CREATE SUBNET 语句标识驻留在同一子网上的公共网络 IP 地址。

    => CREATE SUBNET kv_subnet with '10.10.10.0';
    
  2. 更改数据库以指定用于导入/导出的公共网络的子网名称。

    => ALTER DATABASE DEFAULT EXPORT ON kv_subnet;
    
  3. 创建用于在各个节点与其他 Vertica 群集之间导入和导出数据的网络接口。CREATE NETWORK INTERFACE 语句标识驻留在多个子网上的公共网络 IP 地址。

    => CREATE NETWORK INTERFACE kv_node1 on v_VMartDB_node0001 with '10.10.10.1';
    => CREATE NETWORK INTERFACE kv_node2 on v_VMartDB_node0002 with '10.10.10.2';
    => CREATE NETWORK INTERFACE kv_node3 on v_VMartDB_node0003 with '10.10.10.3';
    => CREATE NETWORK INTERFACE kv_node4 on v_VMartDB_node0004 with '10.10.10.4';
    

    对于使用 Amazon Web Services (AWS) 或使用网络地址转换 (NAT) 的用户,请参考用于 Amazon Web Services 的 Vertica

  4. 更改节点设置以更改导出地址。与 EXPORT ON 子句一起使用时,ALTER NODE 指定用于导入和导出的各个节点上公共网络的网络接口。

    => ALTER NODE v_VMartDB_node0001 export on kv_node1;
    => ALTER NODE v_VMartDB_node0002 export on kv_node2;
    => ALTER NODE v_VMartDB_node0003 export on kv_node3;
    => ALTER NODE v_VMartDB_node0004 export on kv_node4;
    
  5. 验证 Vertica 群集的不同网络子网上的节点地址和导出地址是否不同。

    => SELECT node_name, node_address, export_address FROM nodes;
         node_name     | node_address    | export_address
    -------------------+-----------------+----------------
    v_VMartDB_node0001 | 192.168.100.101 | 10.10.10.1
    v_VMartDB_node0002 | 192.168.100.102 | 10.10.10.2
    v_VMartDB_node0003 | 192.168.100.103 | 10.10.10.3
    v_VMartDB_node0004 | 192.168.100.104 | 10.10.10.4
    

创建网络接口和更改节点设置以更改导出地址优先于创建子网和更改用于导入/导出的数据库。

2.5 - 使用公共和专用 IP 网络

在许多配置中,Vertica 群集主机使用两个网络 IP 地址,如下所示:

  • 一个专用地址,用于在群集主机之间进行通信。

  • 一个公共 IP 地址,用于就客户端连接进行通信。

默认情况下,在 Vertica 数据库之间执行导入和导出操作时使用专用网络。

要将公共网络地址用于复制和导出活动以及移动大量数据,请将系统配置为使用公共网络以支持 Vertica 群集之间的导入和导出操作:

Vertica 在传输期间对数据加密(如果您已配置证书)。Vertica 还尝试对计划元数据加密,但默认情况下,如果需要,会回退到明文。您也可以将 Vertica 配置为要求对元数据加密;请参阅配置群集之间的连接安全

在某些情况下,公共和专用地址均超出单个局域网 (LAN) 的需求容量。如果遇到这种情况,请将 Vertica 群集配置为使用两个 LAN:一个用于公共网络流量,一个用于专用网络流量。

2.5.1 - 识别 Vertica 的公共网络

为了能够在公共网络中导入或导出,Vertica 需要知道用于导入/导出活动的公共网络上节点或群集的 IP 地址。可按下列任一方式配置公共网络:

  • 公共网络 IP 地址位于同一子网上(创建一个子网)

  • 公共网络 IP 地址位于多个子网上(创建网络接口)

要识别位于同一子网上的公共网络 IP 地址:

  • 使用 CREATE SUBNET 语句为子网提供一个名称并识别子网路由前缀。

要识别位于多个子网上的公共网络 IP 地址:

识别用于导入/导出的子网或网络接口后,必须识别用于导入/导出的数据库或节点

另请参阅

2.5.2 - 识别用于导入/导出的数据库或节点

在 Vertica 识别到公共网络后,您可以配置数据库及其节点以将其用于导入和导出操作:

  • 使用 ALTER DATABASE 在公共网络上为数据库指定子网。执行此操作后,数据库中的所有节点都将自动使用子网上的网络接口执行导入/导出操作。

  • 在每个数据库节点上,使用 ALTER NODE 指定公共网络的网络接口。

另请参阅

2.6 - 处理复制/导出期间的节点故障

当从 Vertica 导出 (EXPORT TO VERTICA) 或导入 (COPY FROM VERTICA) 任务正在进行时,如果非启动程序节点发生故障,Vertica 则不会自动完成任务。非启动程序节点是指导出或导入语句中非源节点或目标节点的任何节点。要完成任务,您必须再次运行该语句。

您解决了导入或导出期间非启动程序节点发生故障的问题,如下所示:

  1. 您可以使用 EXPORT TO VERTICACOPY FROM VERTICA 语句从一个群集导出或导入到另一个群集。

    在导出或导入期间,目标或源群集上的非启动节点出现故障。Vertica 发出一条错误消息,以指示可能出现的以下一种节点故障:

    • ERROR 4534: Receive on v_tpchdb1_node0002: Message receipt from v_tpchdb2_node0005 failed

    • WARNING 4539: Received no response from v_tpchdb1_node0004 in abandon plan

    • ERROR 3322: [tpchdb2] Execution canceled by operator

  2. 通过再次运行该语句来完成导入或导出。Vertica 无需启动故障节点即可成功完成导出或导入。

2.7 - 使用 EXPORT 函数

Vertica 提供多个 EXPORT_ 函数,您可以使用这些函数重新创建数据库或在目标数据库中重新创建特定架构和表。例如,您可以使用 EXPORT_ 函数将在开发或测试环境中创建的部分或全部设计和对象传输到生产数据库。

EXPORT_ 函数创建一些 SQL 脚本,您可以运行这些脚本以创建导出的数据库设计或对象。对于导出语句 COPY FROM VERTICA(提取数据)和 导出到 VERTICA(推送数据),这些函数可用于不同目的。这些语句通过网络连接直接在源数据库与目标数据库之间传输数据。它们是动态操作,不会生成 SQL 脚本。

EXPORT_ 函数在下表中列出。根据要导出的内容,您可以使用一个或多个函数。EXPORT_CATALOG 创建的 SQL 脚本最全面,而 EXPORT_TABLES 和 EXPORT_OBJECTS 是该函数的子集,用于缩小导出范围。

脚本创建的设计和对象定义取决于您指定的 EXPORT_ 函数范围。以下部分举例说明每个函数的命令和输出及其支持范围。

保存导出函数的脚本

此部分中的所有示例均使用标准 Vertica VMART 数据库生成,并具有一些额外测试对象和表。为函数创建的所有 SQL 脚本创建一个输出目录:

/home/dbadmin/xtest

如果您指定目标实参作为空字符串 (''),该函数会将导出结果写入至 STDOUT。

2.7.1 - 导出编录

Vertica 函数 EXPORT_CATALOG 生成用于将数据库设计复制到另一个群集的 SQL 脚本。此脚本会复制源数据库的物理架构设计。您可以按如下方式调用此函数:

EXPORT_CATALOG ( ['[destination]' [, '[scope]']] )

SQL 脚本符合以下要求:

  • 仅包括用户有权访问的对象。

  • 根据对象依赖关系对 CREATE 语句进行排序,以便可以按正确的顺序重新创建它们。例如,如果表在非 PUBLIC 架构中,则所需的 CREATE SCHEMA 语句位于 CREATE TABLE 语句之前。同样,表的 CREATE ACCESS POLICY 语句跟在表的 CREATE TABLE 语句之后。

  • 如果可能,使用其 KSAFE 子句(如果有)创建投影,否则使用其 OFFSET 子句。

设置导出范围

如果您不指定范围,EXPORT_CATALOG 将导出所有对象。您可以将导出操作的范围设置为以下级别之一:

导出表对象

使用 TABLES 范围生成一个脚本,该脚本重新创建所有表及其依赖的对象(架构、序列、约束和访问策略):

=> SELECT EXPORT_CATALOG (
     '/home/dbadmin/xtest/sql_cat_tables.sql',
     'TABLES');
           EXPORT_CATALOG
-------------------------------------
 Catalog data exported successfully
(1 row)

SQL 脚本可以包含以下语句:

  • CREATE SCHEMA

  • CREATE TABLE

  • ALTER TABLE(约束)

  • CREATE SEQUENCE

  • CREATE ACCESS POLICY

  • 创建过程(存储过程)

导出所有编录对象

使用 DESIGN 范围可按依赖关系顺序导出源数据库的所有设计元素。此范围导出所有编录对象,包括架构、表、约束、投影、视图和访问策略。

=> SELECT EXPORT_CATALOG(
     '/home/dbadmin/xtest/sql_cat_design.sql',
     'DESIGN' );
           EXPORT_CATALOG
-------------------------------------
 Catalog data exported successfully
(1 row)

SQL 脚本包含重新创建数据库所需的语句:

  • CREATE SCHEMA

  • CREATE TABLE

  • ALTER TABLE(约束)

  • CREATE VIEW

  • CREATE SEQUENCE

  • CREATE ACCESS

  • CREATE PROJECTION(使用 ORDER BY 和 SEGMENTED BY)

投影注意事项

如果要导出的投影是在未使用 ORDER BY 子句的情况下创建的,SQL 脚本会反映投影的默认行为。Vertica 使用基于投影定义中的 SELECT 列的排序顺序隐式创建投影。

只要所有投影都是使用 UNSEGMENTED ALL NODES 或 SEGMENTED ALL NODES 生成的,EXPORT_CATALOG 脚本便可转移。

另请参阅

2.7.2 - 导出表

Vertica 函数 EXPORT_TABLES 为当前数据库中的表和相关对象导出 DDL。生成的 SQL 包含您有权访问的所有非虚拟表对象。您可以使用此 SQL 在不同的群集中重新创建表和相关的非虚拟对象。

按如下方式执行 EXPORT_TABLES:

EXPORT_TABLES( ['[destination]' [, '[scope]']] )

SQL 脚本符合以下要求:

  • 仅包括用户有权访问的对象。

  • 根据对象依赖关系对 CREATE 语句进行排序,以便可以按正确的顺序重新创建它们。例如,如果一个表引用了一个命名序列,则 CREATE SEQUENCE 语句在 CREATE TABLE 语句之前。同样,表的 CREATE ACCESS POLICY 语句跟在表的 CREATE TABLE 语句之后。

设置导出范围

EXPORT_TABLES scope 实参指定导出操作的范围:

导出所有表对象

如果将范围参数设置为空字符串 (''),EXPORT_TABLES 将导出所有表及其相关对象。例如,以下对 EXPORT_TABLES 的调用将 VMart 数据库中的所有表对象导出到指定的输出文件。

 => SELECT EXPORT_TABLES(
      '/home/dbadmin/xtest/sql_tables_empty.sql', '');
            EXPORT_TABLES
-------------------------------------
 Catalog data exported successfully
(1 row)

导出的 SQL 包含以下类型的语句,具体取决于重新创建表和任何相对对象(例如架构、序列和访问策略)时的需求:

  • CREATE SCHEMA

  • CREATE TABLE

  • CREATE SEQUENCE

  • CREATE ACCESS POLICY

  • ALTER TABLE(用于添加外键约束)

导出单个表对象

EXPORT_TABLES 可以指定表和表相关对象(例如要导出的序列或架构)的逗号分隔列表。生成的 SQL 脚本包含指定对象及其依赖对象的 CREATE 语句:

  • CREATE SCHEMA

  • CREATE TABLE

  • CREATE SEQUENCE

  • CREATE ACCESS POLICY

  • ALTER TABLE(用于添加外键)

例如,以下对 EXPORT_TABLES 的调用会导出两个 VMart 表: store.store_sales_factstore.store_dimension

=> SELECT export_tables('','store.store_sales_fact, store.store_dimension');
                              export_tables
-------------------------------------------------------------------------

CREATE TABLE store.store_dimension
(
    store_key int NOT NULL,
    store_name varchar(64),
    store_number int,
    store_address varchar(256),
    store_city varchar(64),
    store_state char(2),
    store_region varchar(64),
    floor_plan_type varchar(32),
    photo_processing_type varchar(32),
    financial_service_type varchar(32),
    selling_square_footage int,
    total_square_footage int,
    first_open_date date,
    last_remodel_date date,
    number_of_employees int,
    annual_shrinkage int,
    foot_traffic int,
    monthly_rent_cost int,
    CONSTRAINT C_PRIMARY PRIMARY KEY (store_key) DISABLED
);

CREATE TABLE store.store_sales_fact
(
    date_key int NOT NULL,
    product_key int NOT NULL,
    product_version int NOT NULL,
    store_key int NOT NULL,
    promotion_key int NOT NULL,
    customer_key int NOT NULL,
    employee_key int NOT NULL,
    pos_transaction_number int NOT NULL,
    sales_quantity int,
    sales_dollar_amount int,
    cost_dollar_amount int,
    gross_profit_dollar_amount int,
    transaction_type varchar(16),
    transaction_time time,
    tender_type varchar(8)
);

ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_date FOREIGN KEY (date_key) references public.date_dimension (date_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_product FOREIGN KEY (product_key, product_version) references public.product_dimension (product_key, product_version);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_store FOREIGN KEY (store_key) references store.store_dimension (store_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_promotion FOREIGN KEY (promotion_key) references public.promotion_dimension (promotion_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_customer FOREIGN KEY (customer_key) references public.customer_dimension (customer_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_employee FOREIGN KEY (employee_key) references public.employee_dimension (employee_key);

以下对 EXPORT_TABLES 的调用指定要导出 VMart 架构 store 中的所有表:

=> select export_tables('','store');
                          export_tables
-----------------------------------------------------------------
CREATE SCHEMA store;

CREATE TABLE store.store_dimension
(
 ...
);

CREATE TABLE store.store_sales_fact
(
 ...
);

CREATE TABLE store.store_orders_fact
(
  ...
);

ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_date FOREIGN KEY (date_key) references public.date_dimension (date_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_product FOREIGN KEY (product_key, product_version) references public.product_dimension (product_key, product_version);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_store FOREIGN KEY (store_key) references store.store_dimension (store_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_promotion FOREIGN KEY (promotion_key) references public.promotion_dimension (promotion_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_customer FOREIGN KEY (customer_key) references public.customer_dimension (customer_key);
ALTER TABLE store.store_sales_fact ADD CONSTRAINT fk_store_sales_employee FOREIGN KEY (employee_key) references public.employee_dimension (employee_key);
ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_product FOREIGN KEY (product_key, product_version) references public.product_dimension (product_key, product_version);
ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_store FOREIGN KEY (store_key) references store.store_dimension (store_key);
ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_vendor FOREIGN KEY (vendor_key) references public.vendor_dimension (vendor_key);
ALTER TABLE store.store_orders_fact ADD CONSTRAINT fk_store_orders_employee FOREIGN KEY (employee_key) references public.employee_dimension (employee_key);

(1 row)

另请参阅

2.7.3 - 导出对象

Vertica 函数 EXPORT_OBJECTS 生成一个 SQL 脚本,您可以使用该脚本在另一个群集上重新创建非虚拟编录对象,如下所示:

EXPORT_OBJECTS( ['[destination]' [, '[scope]'] [, 'mark-ksafe']] )

SQL 脚本符合以下要求:

  • 仅包括用户有权访问的对象。

  • 根据对象依赖关系对 CREATE 语句进行排序,以便可以按正确的顺序重新创建它们。例如,如果表在非 PUBLIC 架构中,则所需的 CREATE SCHEMA 语句位于 CREATE TABLE 语句之前。同样,表的 CREATE ACCESS POLICY 语句跟在表的 CREATE TABLE 语句之后。

  • 如果可能,使用其 KSAFE 子句(如果有)创建投影,否则使用其 OFFSET 子句。

设置导出范围

EXPORT_OBJECTS scope 实参指定导出操作的范围:

导出所有对象

如果将范围参数设置为空字符串 (''),Vertica 会按依赖关系顺序从源数据库中导出所有非虚拟对象。在另一个群集中运行生成的 SQL 脚本,可创建所有引用对象及其依赖对象。

默认情况下,函数的 KSAFE 实参设置为 true。在本例中,生成的脚本调用 MARK_DESIGN_KSAFE,它复制了原始数据库的 K-safety。

=> SELECT EXPORT_OBJECTS(
     '/home/dbadmin/xtest/sql_objects_all.sql',
     '',
     'true');
           EXPORT_OBJECTS
-------------------------------------
 Catalog data exported successfully
(1 row)

SQL 脚本中包含以下类型的语句:

  • CREATE SCHEMA

  • CREATE TABLE

  • ALTER TABLE(约束)

  • CREATE PROJECTION

  • CREATE VIEW

  • CREATE SEQUENCE

  • CREATE ACCESS POLICY

  • 创建过程(存储过程)

以下输出包含输出 SQL 文件的开头和结尾,包括 MARK_DESIGN_KSAFE 语句:

CREATE SCHEMA store;
CREATE SCHEMA online_sales;
CREATE SEQUENCE public.my_seq ;
CREATE TABLE public.customer_dimension
(
    customer_key int NOT NULL,
    customer_type varchar(16),
    customer_name varchar(256),
    customer_gender varchar(8),
    title varchar(8),
    household_id int,
...

);
...
SELECT MARK_DESIGN_KSAFE(1);

导出单个对象

您可以指定一个或多个对象作为函数范围,其中多个对象是在逗号分隔的列表中指定的。任何非 PUBLIC 架构中的对象名称都必须包含它们各自的架构。要导出的对象可以包含架构、表、视图和序列。因此,SQL 脚本包含以下语句,具体取决于列出的对象及其依赖关系:

  • CREATE SCHEMA

  • CREATE TABLE

  • ALTER TABLE(用于添加约束)

  • CREATE VIEW

  • CREATE SEQUENCE

  • CREATE ACCESS POLICY

如果列出的对象有重叠的范围(例如列表包含一个表和它的一个投影),则 EXPORT_OBJECTS 只导出一次投影:


=> select export_objects ('','customer_dimension, customer_dimension_super');

                              export_objects
--------------------------------------------------------------------------
CREATE TABLE public.customer_dimension
(
    customer_key int NOT NULL,
    customer_type varchar(16),
    customer_name varchar(256),
    ...
    CONSTRAINT C_PRIMARY PRIMARY KEY (customer_key) DISABLED
);

CREATE ACCESS POLICY ON public.customer_dimension FOR COLUMN customer_address CASE WHEN enabled_role('administrator') THEN customer_address ELSE '**************' END ENABLE;

CREATE PROJECTION public.customer_dimension_super /*+basename(customer_dimension),createtype(L)*/
(
 customer_key,
 customer_type,
 customer_name,
  ...
)
AS
 SELECT customer_dimension.customer_key,
        customer_dimension.customer_type,
        customer_dimension.customer_name,
        ...
 FROM public.customer_dimension
 ORDER BY customer_dimension.customer_key
SEGMENTED BY hash(customer_dimension.customer_key) ALL NODES OFFSET 0;

SELECT MARK_DESIGN_KSAFE(0);

另请参阅

导出表