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

返回本页常规视图.

数据库导出和导入

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

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

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

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

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

创建 SQL 脚本以导出数据

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

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

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

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

其他导出

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

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 - 将数据导出到另一个数据库

导出到 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 配置参数。

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 配置参数。

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
    

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

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

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

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

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

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

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

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

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

5.1 - 识别 Vertica 的公共网络

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

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

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

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

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

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

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

另请参阅

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

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

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

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

另请参阅

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 无需启动故障节点即可成功完成导出或导入。

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。

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 脚本便可转移。

另请参阅

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)

另请参阅

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);

另请参阅

导出表