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

返回本页常规视图.

使用 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。

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 - 导出表

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)

另请参阅

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

另请参阅

导出表