LightDB 数据泵详解

lt_dump/lt_restore 使用说明

lt_dumplt_restore 是 LightDB 官方标准的数据泵工具, lt_dump 用于生成数据库的备份文件,而 lt_restore 用于从备份文件中恢复数据库。 lt_dump 只会备份单个数据库,如果需要备份实例中的所有数据库以及数据库全局对象 (比如角色和表空间) ,则需要使用 lt_dumpall 。以下内容将介绍这三个工具的基本使用方法、参数说明和最佳实践;

lt_dump/lt_dumpall/lt_restore 基本选项

  • -h--host
    指定数据库服务器的主机名,所以 lt_dump 可以将远程数据库服务器的内容备份到本地,lt_restore 可以将本地备份文件恢复到远程数据库服务器;

  • -p--port
    指定数据库服务器的端口号;

  • -d--dbname
    指定要导出的数据库名称;

  • -U--username
    指定连接数据库的用户名;

  • -v--verbose
    开启详细模式,会将备份或恢复过程中的详细信息也显示出来;

    lt_dump: last built-in OID is 65534
    lt_dump: reading extensions
    lt_dump: identifying extension members
    lt_dump: reading schemas
    lt_dump: reading user-defined tables
    lt_dump: reading user-defined functions
    lt_dump: reading user-defined types
    lt_dump: reading procedural languages
    lt_dump: reading user-defined aggregate functions
    lt_dump: reading user-defined operators
    lt_dump: reading user-defined access methods
    lt_dump: reading user-defined operator classes
    lt_dump: reading user-defined operator families
    lt_dump: reading user-defined text search parsers
    lt_dump: reading user-defined text search templates
    lt_dump: reading user-defined text search dictionaries
    lt_dump: reading user-defined text search configurations
    lt_dump: reading user-defined foreign-data wrappers
    lt_dump: reading user-defined foreign servers
    lt_dump: reading default privileges
    ...
    

lt_dump 的使用

lt_dump 支持的备份格式

lt_dump 支持将数据库内容备份为多种格式,通过 -F--format 选项可以指定目标格式,可选的格式包括(但无论导出的格式如何,备份或恢复的内容都是完全相同的):

  1. -Fp / --format=p

    • 这是默认的导出格式,其中 p 表示 plain ,表示导出单个纯文本格式,即将数据库内容以 SQL 文本的形式导出(包括表数据);

    • 通过 -f 选项,可以指定导出的目标文件,如果未指定则默认输出到标准输出 stdout;

    • 这种纯文本的 SQL 文件需要通过 ltsql 命令进行恢复,而不可以是 lt_restore

    • 以如下 SQL 为例:

      create table t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into t1 values(1, 'string1', 200.10);
      insert into t1 values(2, 'string2', 340.56);
      insert into t1 values(3, 'string3', 5.3455);
      

      导出的内容形式如下:

      CREATE TABLE public.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE public.t1 OWNER TO lightdb;
      
      COPY public.t1 (c1, c2, c3) FROM stdin;
      1       string1 200.10
      2       string2 340.56
      3       string3 5.3455
      \.
      
      ALTER TABLE ONLY public.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      
    • 如果同时还指定了 --inserts 选项,则会将表数据以 INSERT 语句的形式导出:

      CREATE TABLE public.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE public.t1 OWNER TO lightdb;
      
      TRUNCATE public.t1;
      INSERT INTO public.t1 VALUES (1, 'string1', 200.10);
      INSERT INTO public.t1 VALUES (2, 'string2', 340.56);
      INSERT INTO public.t1 VALUES (3, 'string3', 5.3455);
      
      ALTER TABLE ONLY public.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      
  2. -Fd / --format=d

    • 其中 d 表示 directory ,表示导出为目录格式,目录中可能包括多个文件,其中 toc.dat 文件记录了数据库对象的定义,blobs.toc 文件记录了大对象的相关信息,其余以 .dat.gz 为后缀的文件分别对应一个表的数据或一个大对象数据;

    • 必须同时指定 -f 选项,以指定导出的目录名称;

    • 这种目录格式需要通过 lt_restore 命令进行恢复;

    • 以如下 SQL 为例:

      create table t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into t1 values(1, 'string1', 200.10);
      insert into t1 values(2, 'string2', 340.56);
      insert into t1 values(3, 'string3', 5.3455);
      
      create table t2 (c1 int, c2 date, primary key(c1));
      insert into t2 values(1, '2014-12-15');
      insert into t2 values(2, '2020-09-15');
      
      do $$
      declare
          lo_oid oid;
          fd integer;
          data text := 'this is a large object data example.';
      begin
          lo_oid := lo_create(0); -- 创建大对象
          fd := lo_open(lo_oid, 131072); -- 打开大对象
          perform lowrite(fd, data::bytea); -- 写入数据
          perform lo_close(fd); -- 关闭大对象
          raise notice 'large object created with oid: %', lo_oid;
      end $$;
      

      导出的目录结构为(示例):

      ./
      ├── 4371.dat.gz
      ├── 4372.dat.gz
      ├── blob_84551.dat.gz
      ├── blobs.toc
      └── toc.dat
      

      导出目录格式是唯一支持并行导出的格式,通过 -j N--jobs=N 即可指定并发数。lt_dump 会打开 N + 1 个数据库连接同时进行导出(虽然不常出现,但还是要确保数据库的 max_connections 配置值充足);

  3. -Ft / --format=t

    • 其中 t 表示 tar ,表示导出为单个 tar 归档格式(不支持压缩);
    • 由于这种导出文件是二进制格式,所以建议总是通过 -f 选项指定导出的目标文件;
    • 这种归档格式需要通过 lt_restore 命令进行恢复;
  4. -Fc / --format=c

    • 其中 c 表示 custom ,表示导出为单个自定义格式(支持压缩);
    • 由于这种导出文件是二进制格式,所以建议总是通过 -f 选项指定导出的目标文件;
    • 这种自定义格式需要通过 lt_restore 命令进行恢复;

四种格式的比较:

格式支持并行备份支持并行恢复支持部分恢复
plain
dir
tar
custom

lt_dump 指定备份内容

  • 过滤系统内建对象:
    LightDB 数据库内置了大量系统扩展以及系统数据库对象,比如 myfce、orafce、lt_hint_plan、lt_catalog 等。对于使用 LightDB 的业务系统而言,只需要对其自定义创建的数据库对象和数据进行备份恢复即可。通过 --lt-exclude-lightdb-objects 选项即可过滤 LightDB 内置的系统对象;

  • 导出系统表数据:
    LightDB 存在部分系统表支持用户修改,这些表用于存放用户的配置(如自定义的定时任务,自定义的 hint 规则等),这些表包括 cron.job、hint_plan.hints、zhparser.zhprs_custom_word 等。如果需要单独导出这部分的配置,可以通过单独指定 --lt-dump-lightdb-tables 选项实现;

  • --section= 选项用于指定导出的数据的特定部分,而不是整个数据库:

    • 有 3 可选的值:

      1. pre-data:包括表结构、函数、索引、视图、包、序列等基础定义;
      2. data:表数据;
      3. post-data:用于导出需要在数据加载之后应用的数据库对象和定义,包括触发器、索引、同义词、约束等;
    • 使用这个选项可以更灵活地控制备份和恢复过程,特别是在需要部分恢复或进行复杂的数据迁移时;

    • 以如下 SQL 为例:

      create table t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into t1 values(1, 'string1', 200.10);
      insert into t1 values(2, 'string2', 340.56);
      insert into t1 values(3, 'string3', 5.3455);
      
      create schema s;
      
      create table s.t1 (c1 int CONSTRAINT con1 CHECK (c1 > 0), c2 date not null, primary key(c1));
      insert into s.t1 values(1, '2014-12-15');
      insert into s.t1 values(2, '2020-09-15');
      
      create type s.tp as (a int);
      
      create view v as select c1 from t1;
      
      1. 指定 pre-data,导出内容形式如下:

        CREATE SCHEMA s;
        
        ALTER SCHEMA s OWNER TO lightdb;
        
        CREATE TYPE s.tp AS (
            a integer
        );
        
        ALTER TYPE s.tp OWNER TO lightdb;
        
        CREATE TABLE public.t1 (
            c1 integer NOT NULL,
            c2 text,
            c3 numeric
        );
        
        ALTER TABLE public.t1 OWNER TO lightdb;
        
        CREATE VIEW public.v AS
            SELECT t1.c1
              FROM public.t1;
        
        ALTER TABLE public.v OWNER TO lightdb;
        
        CREATE TABLE s.t1 (
            c1 integer NOT NULL,
            c2 date NOT NULL,
            CONSTRAINT con1 CHECK ((c1 > 0))
        );
        
        ALTER TABLE s.t1 OWNER TO lightdb;
        
      2. 指定 data,导出内容形式如下:

        COPY public.t1 (c1, c2, c3) FROM stdin;
        1       string1 200.10
        2       string2 340.56
        3       string3 5.3455
        \.
        
        COPY s.t1 (c1, c2) FROM stdin;
        1       2014-12-15
        2       2020-09-15
        \.
        
      3. 指定 post-data,导出内容形式如下:

        ALTER TABLE ONLY public.t1
            ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
        
        ALTER TABLE ONLY s.t1
            ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
        
    • -a-s 选项:

      • -a--data-only 表示只导出数据,不导出定义(相当于 --section 的 data 部分);
      • -s--schema-only 表示只导出定义,不导出数据(相当于 --section 的 pre-data + post-data 部分);
  • -c--clean 选项:

    • 用于在生成数据库对象的 DDL 之前,额外生成对应的 DROP 语句;

    • 该选项只对 plain 格式的导出文件有效,其他格式总是会导出对应的 DRP 语句(其目的是为了在 lt_restore 恢复时通过相同选项进行控制);

    • 以如下 SQL 为例:

      CREATE SCHEMA s;
      
      create table s.t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into s.t1 values(1, 'string1', 200.10);
      insert into s.t1 values(2, 'string2', 340.56);
      insert into s.t1 values(3, 'string3', 5.3455);
      
      create table s.t2 (c1 int, c2 text);
      create table s.t3 (c1 int, c2 text);
      create table s.t4 (c1 int, c2 text);
      create type s.tp as (a int);
      create view s.v as select c1 from s.t1;
      

      指定该选项后导出的内容形式如下:

      ALTER TABLE ONLY s.t1 DROP CONSTRAINT t1_pkey;
      DROP VIEW s.v;
      DROP TABLE s.t4 CASCADE;
      DROP TABLE s.t3 CASCADE;
      DROP TABLE s.t2 CASCADE;
      DROP TABLE s.t1 CASCADE;
      DROP TYPE s.tp;
      DROP SCHEMA s;
      
      CREATE SCHEMA s;
      ALTER SCHEMA s OWNER TO lightdb;
      
      CREATE TYPE s.tp AS (
          a integer
      );
      ...
      

      如果这些被 DROP 的对象不存在,则恢复时会提示错误,为此可以额外指定 --if-exists 选项(该选项必须配合 -c 一起使用),此时相关的 DROP 语句变成:

      ALTER TABLE IF EXISTS ONLY s.t1 DROP CONSTRAINT IF EXISTS t1_pkey;
      DROP VIEW IF EXISTS s.v;
      DROP TABLE IF EXISTS s.t4 CASCADE;
      DROP TABLE IF EXISTS s.t3 CASCADE;
      DROP TABLE IF EXISTS s.t2 CASCADE;
      DROP TABLE IF EXISTS s.t1 CASCADE;
      DROP TYPE IF EXISTS s.tp;
      DROP SCHEMA IF EXISTS s;
      

      如果某个 schema 下存在大量数据库对象,则也会生成大量 DROP 语句,执行耗时,为此可以额外指定 -K 选项(该选项必须配合 -c 一起使用),此时相关的 DROP 语句变成:

      DROP SCHEMA IF EXISTS s CASCADE;
      
  • -C--create 选项

    • 用于额外生成对应的 CREATE DATABASE 语句;

    • 该选项只对 plain 格式的导出文件有效,其他格式总是会导出对应的 CREATE DATABASE 语句(其目的是为了在 lt_restore 恢复时通过相同选项进行控制);

    • 以 test 数据库为例:

      create database test;
      

      指定该选项后导出的内容形式如下(所以在使用 ltsql 进行恢复时,不需要特别指定需要恢复的目标数据库,因为 \connect test 语句会自动切换到目标数据库):

      CREATE DATABASE test WITH TEMPLATE = template_pg ENCODING = 'UTF8' LOCALE = 'en_US.UTF-8' lightdb_syntax_compatible_type = off lightdb_mysql_lower_case_table_names = 1 lightdb_ascii_zero_store_value = 0;
      
      ALTER DATABASE test OWNER TO lightdb;
      
      \connect test
      
      ...
      

      如果额外指定 -c--if-exists 选项,则会在上述 SQL 之前额外导出如下内容:

      DROP DATABASE IF EXISTS test;
      
  • -n / -N / -t / -T 选项:

    • lt_dump 在进行备份时,可以只导出指定的表或 schema,也可以过滤指定的表或 schema;

    • -n--schema 表示只导出指定 schema 以及其中定义的其他对象。 -N--exclude-schema 则表示过滤;

    • 同理, -t--table 表示只导出指定表, -T--exclude-table 表示只过滤指定表;

    • 特别注意:并且当 -t 被指定时, -n-N 会被忽略;

    • 这 4 个选项都支持多次指定,并且都支持正则表达式(正则的详细规则,参考链接 https://www.light-pg.com/docs/lightdb-cn/current/app-psql.html#APP-PSQL-PATTERNS );

    • 以如下 SQL 为例:

      CREATE SCHEMA s1;
      CREATE SCHEMA s2;
      CREATE SCHEMA s3;
      
      create table s2.t1 (c1 int, c2 text, c3 number, primary key(c1));
      
      create table s1.t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into s1.t1 values(1, 'string1', 200.10);
      insert into s1.t1 values(2, 'string2', 340.56);
      insert into s1.t1 values(3, 'string3', 5.3455);
      
      create table s1.t2 (c1 int, c2 text);
      create table s1.ta (c1 int, c2 text);
      create table s1.tb (c1 int, c2 text);
      create type s1.tp as (a int);
      create view s1.v as select c1 from s1.t1;
      

      指定 -n s2 导出的内容形式如下(只导出了 s2 以及其中内容):

      CREATE SCHEMA s2;
      
      ALTER SCHEMA s2 OWNER TO lightdb;
      
      CREATE TABLE s2.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE s2.t1 OWNER TO lightdb;
      
      COPY s2.t1 (c1, c2, c3) FROM stdin;
      \.
      
      ALTER TABLE ONLY s2.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      
      

      指定 -N s1 -N s2 导出的内容形式如下(过滤了 s1 和 s2 的内容):

      CREATE SCHEMA s3;
      
      ALTER SCHEMA s3 OWNER TO lightdb;
      

      指定 -s -t s1.* 导出的内容形式如下(只导出了 s1 下的表):

      CREATE TABLE s1.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE s1.t1 OWNER TO lightdb;
      
      CREATE TABLE s1.t2 (
          c1 integer,
          c2 text
      );
      
      ALTER TABLE s1.t2 OWNER TO lightdb;
      
      CREATE TABLE s1.ta (
          c1 integer,
          c2 text
      );
      
      ALTER TABLE s1.ta OWNER TO lightdb;
      
      CREATE TABLE s1.tb (
          c1 integer,
          c2 text
      );
      
      ALTER TABLE s1.tb OWNER TO lightdb;
      
      CREATE VIEW s1.v AS
       SELECT t1.c1
         FROM s1.t1;
      
      
      ALTER TABLE s1.v OWNER TO lightdb;
      
      ALTER TABLE ONLY s1.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      

      指定 -s -t s1.t[0-9] 导出的内容形式如下(只导出了 s1 下的表,表名以 t 开头以数字结尾):

      CREATE TABLE s1.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE s1.t1 OWNER TO lightdb;
      
      CREATE TABLE s1.t2 (
          c1 integer,
          c2 text
      );
      
      ALTER TABLE s1.t2 OWNER TO lightdb;
      
      ALTER TABLE ONLY s1.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      

      指定 -s -N s1 -t s1.t[0-9] 导出的内容同上,因为 -N 会被忽略掉;

  • --quote-all-identifiers 选项:

    • 使用双引号将数据库对象名称包含起来(适应用在数据库对象名中存在特殊字符的场景);

    • 以如下 SQL 为例:

      CREATE SCHEMA s;
      
      create table s.t1 (c1 int, c2 text, c3 number, primary key(c1));
      
      insert into s.t1 values(1, 'string1', 200.10);
      insert into s.t1 values(2, 'string2', 340.56);
      insert into s.t1 values(3, 'string3', 5.3455);
      
      create view s.v as select c1 from s.t1;
      

      指定该选项后导出的内容形式如下:

      CREATE SCHEMA "s";
      
      ALTER SCHEMA "s" OWNER TO "lightdb";
      
      CREATE TABLE "s"."t1" (
          "c1" integer NOT NULL,
          "c2" "text",
          "c3" numeric
      );
      
      ALTER TABLE "s"."t1" OWNER TO "lightdb";
      
      CREATE VIEW "s"."v" AS
       SELECT "t1"."c1"
         FROM "s"."t1";
      
      ALTER TABLE "s"."v" OWNER TO "lightdb";
      
      COPY "s"."t1" ("c1", "c2", "c3") FROM stdin;
      1   string1 200.10
      2   string2 340.56
      3   string3 5.3455
      \.
      
      ALTER TABLE ONLY "s"."t1"
          ADD CONSTRAINT "t1_pkey" PRIMARY KEY ("c1");
      
  • -O 选项:

    • 用于不导出 ALTER OWNER 语句;

    • 该选项只对 plain 格式的导出文件有效,其他格式总是会导出对应的 ALTER OWNER 语句(其目的是为了在 lt_restore 恢复时通过相同选项进行控制);

    • 以如下 SQL 为例:

      CREATE SCHEMA s;
      
      create table s.t1 (c1 int, c2 text, c3 number, primary key(c1));
      
      insert into s.t1 values(1, 'string1', 200.10);
      insert into s.t1 values(2, 'string2', 340.56);
      insert into s.t1 values(3, 'string3', 5.3455);
      
      create view s.v as select c1 from s.t1;
      

      未指定该选项时导出的内容形式如下:

      CREATE SCHEMA s;
      
      ALTER SCHEMA s OWNER TO lightdb;
      
      CREATE TABLE s.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      ALTER TABLE s.t1 OWNER TO lightdb;
      
      CREATE VIEW s.v AS
       SELECT t1.c1
         FROM s.t1;
      
      ALTER TABLE s.v OWNER TO lightdb;
      
      COPY s.t1 (c1, c2, c3) FROM stdin;
      1   string1 200.10
      2   string2 340.56
      3   string3 5.3455
      \.
      
      ALTER TABLE ONLY s.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      

      指定该选项后导出的内容形式如下(不再有 ALTER … OWNER TO … 语句):

      CREATE SCHEMA s;
      
      CREATE TABLE s.t1 (
          c1 integer NOT NULL,
          c2 text,
          c3 numeric
      );
      
      CREATE VIEW s.v AS
       SELECT t1.c1
         FROM s.t1;
      
      COPY s.t1 (c1, c2, c3) FROM stdin;
      1   string1 200.10
      2   string2 340.56
      3   string3 5.3455
      \.
      
      ALTER TABLE ONLY s.t1
          ADD CONSTRAINT t1_pkey PRIMARY KEY (c1);
      

lt_restore 的使用

lt_restore 基本选项

  • -l--list
    展示备份文件中的内容,比如:

    ;
    ; Archive created at 2024-05-30 13:45:00 CST
    ;     dbname: test
    ;     TOC Entries: 12
    ;     Compression: 0
    ;     Dump Version: 1.14-0
    ;     Format: TAR
    ;     Integer: 4 bytes
    ;     Offset: 8 bytes
    ;     Dumped from database version: 13.8
    ;     Dumped by lt_dump version: 13.8
    ;
    ;
    ; Selected TOC Entries:
    ;
    258; 1259 84538 TABLE public t1 lightdb
    259; 1259 84546 TABLE public t2 lightdb
    4373; 2613 84551 BLOB - 84551 lightdb
    4371; 0 84538 TABLE DATA public t1 lightdb
    4372; 0 84546 TABLE DATA public t2 lightdb
    4374; 0 0 BLOBS - BLOBS
    4234; 2606 84545 CONSTRAINT public t1 t1_pkey lightdb
    4236; 2606 84550 CONSTRAINT public t2 t2_pkey lightdb
    
  • -e--exit-on-error

    • 默认情况下, lt_restore 在恢复时,如果遇到错误(比如 DDL 错误、对象已存在、依赖缺失等)会累计错误信息,并继续执行,在执行结束时提示错误数量,比如:

      lt_restore: warning: errors ignored on restore: 7
      
    • 指定该选项则会在遇到错误时立刻停止恢复,并退出;

  • -j--jobs

    • 该选项的含义和 lt_dump 的相同,但支持对目录格式和自定义格式进行并行恢复;

lt_restore 指定恢复内容

  • lt_dump 一样, lt_restore 也可以通过选项来指定恢复的内容,相关选项和含义和 lt_dump 完全相同。比如:

    • --section
    • -a--data-only
    • -s--schema-only
    • -n--schema
    • -N--exclude-schema
    • -t--table
    • -c-K-C--if-exists
  • 但有如下几点需要特别注意:

    • -c-K-C--if-exists 选项对 lt_dump 而言,只有在导出 plain 格式时有效,其余格式总是会生成这些选项额外指定的导出内容(比如 DROP、CREATE DATABASE 等)。而 lt_restore 进行恢复时默认不会执行这些 SQL,此时就需要额外指定这些选项来进行控制;
    • lt_restore 提供的 -T 选项和 lt_dump 提供的含义不一致;
  • 相比 lt_dumplt_restore 指定恢复内容时,可以控制的更加精细:

    • -P--function

      • 表示只恢复指定的函数,而不恢复其他数据库对象;
      • 可以使用多个 -P 选项来指定多个函数;
    • -I--index

      • 表示只恢复指定的索引,而不恢复其他数据库对象;
      • 可以使用多个 -I 选项来指定多个索引;
    • -T--trigger

      • 表示只恢复指定的触发器,而不恢复其他数据库对象;
      • 可以使用多个 -I 选项来指定多个触发器;
  • --table_exists_action

    • 在恢复表数据时,用于控制数据的恢复机制;

    • 有 4 可选的值:

      1. skip :如果表存在,则跳过;
      2. append :向表中追加数据;
      3. truncate :先 truncate 表,然后再 insert 数据;
      4. replace :先 drop 表,然后创建表,最后 insert 数据(表的 OID 会发生变化);
    • 示例,假设备份文件备份的是如下 SQL 内容:

      create table t1 (c1 int, c2 text, c3 number, primary key(c1));
      insert into t1 values(1, 'string1', 200.10);
      insert into t1 values(2, 'string2', 340.56);
      insert into t1 values(3, 'string3', 5.3455);
      

      而恢复的目标库中已经存在表 t1,且数据为:

       c1 |   c2    |   c3
      ----+---------+---------
        4 | string1 | 1200.10
        5 | string2 | 1340.56
        6 | string3 | 15.3455
      

      指定 skip 的效果如下:

       c1 |   c2    |   c3
      ----+---------+---------
        4 | string1 | 1200.10
        5 | string2 | 1340.56
        6 | string3 | 15.3455
      

      指定 append 的效果如下:

       c1 |   c2    |   c3
      ----+---------+---------
        4 | string1 | 1200.10
        5 | string2 | 1340.56
        6 | string3 | 15.3455
        1 | string1 |  200.10
        2 | string2 |  340.56
        3 | string3 |  5.3455
      

      指定 truncate 的效果如下:

       c1 |   c2    |   c3
      ----+---------+--------
        1 | string1 | 200.10
        2 | string2 | 340.56
        3 | string3 | 5.3455
      

      指定 replace 的效果如下:

       c1 |   c2    |   c3
      ----+---------+--------
        1 | string1 | 200.10
        2 | string2 | 340.56
        3 | string3 | 5.3455
      

lt_dumpall 的使用

  • lt_dump 只会备份单个数据库,而 lt_dumpall 会备份实例中的所有数据库以及数据库全局对象。 lt_dumpall 是通过调用 lt_dump 来实现各个数据库的备份。但值得注意的是: lt_dumpall 没有提供类似 lt_dump-F 选项,它只能生成 plain 格式的纯文本 SQL 脚本(只能通过 ltsql 来进行恢复);

  • 除了导出各个数据库的对象, lt_dumpall 还会导出全局数据库对象(包括表空间和用户),通过指定 -g--globals-only 选项,可以实现只导出表空间和用户,当然也可以单独导出表空间和用户:

    1. 指定 -t--tablespaces-only 则只导出表空间定义;
    2. 指定 -r--roles-only 则只导出表用户定义;

备份和恢复示例

导出数据库全局对象:

lt_dumpall -h 10.20.30.40 -p 5432 --globals-only -f globals.sql

导出整个数据库(不包括系统内建对象):

lt_dump -h 10.20.30.40 -p 5432 -d test --lt-exclude-lightdb-objects -j8 -Fd -f test_dump_dir

导出整个数据库的定义(不包括系统内建对象):

lt_dump -h 10.20.30.40 -p 5432 -d test --lt-exclude-lightdb-objects -s -Fp -f test_dump_dir.sql

导出整个数据库的数据(不包括系统内建对象):

lt_dump -h 10.20.30.40 -p 5432 -d test --lt-exclude-lightdb-objects -a -j8 -Fd -f test_dump_data_dir

恢复数据库全局对象,错误信息重定向到错误日志中:

ltsql -h 10.20.30.40 -p 5432 -f globals.sql 2>err.log

恢复整个数据库,错误信息重定向到错误日志中:

lt_restore -h 10.20.30.40 -p 5432 -d test -j8 test_dump_dir 2>err.log

dbms_datapump 使用说明

dbms_datapump 是 LightDB orafce 扩展提供的包(LightDB 24.1 开始支持),其目的是兼容 oracle 的 dbms_datapump 。所以只有 Oracle 兼容模式的数据库才能使用该包。在 LightDB 中, dbms_datapump 是通过 lt_dumplt_restore 来实现的。

dbms_datapump 提供的接口

open

  • 原型:

    function open(operation in varchar2,
                  job_mode in varchar2,
                  remote_link in varchar2 default null,
                  job_name in varchar2 default null,
                  version in varchar2 default 'compatible')
    return numeric;
    
    • operation 支持 exportimport
    • job_mode 支持 shcematable
    • 未使用参数:remote_link、version;
  • 功能描述:
    定义一个新任务,返回句柄;

add_file

  • 原型:

    procedure add_file(handle in numeric,
                       filename in varchar2,
                       directory in varchar2,
                       filesize in varchar2 default null,
                       filetype in numeric default 0,
                       reusefile in numeric default null);
    
    • 未使用参数:filesize、reusefile;
  • 功能描述:添加备份文件或日志文件;

attach

  • 原型:

    function attach(job_name in varchar2 default null,
                    job_owner in varchar2 default null)
    return numeric;
    
  • 功能描述:获取任务句柄;

metadata_filter

  • 原型:

    procedure metadata_filter(handle in numeric,
                              name in varchar2,
                              value in varchar2,
                              object_path in varchar2 default null);
    
    procedure metadata_filter(handle in numeric,
                              name in varchar2,
                              value in clob,
                              object_path in varchar2 default null);
    
    • name 支持 schema_exprname_expr
    • value 支持 innot inlikenot like 表达式;
    • 未使用参数:object_path;
  • 功能描述:添加过滤条件;

set_parameter

  • 原型:

    procedure set_parameter(handle in numeric,
                            name in varchar2,
                            value in varchar2);
    
    procedure set_parameter(handle in numeric,
                            name in varchar2,
                            value in numeric);
    
  • 功能描述:指定任务的配置;

set_parallel

  • 原型:

    procedure set_parallel(handle in numeric, degree in numeric);
    
  • 功能描述:指定任务并行数量;

start_job

  • 原型:

    procedure start_job(handle in numeric,
                        skip_current in numeric default 0,
                        abort_step in numeric default 0,
                        cluster_ok in numeric default 1,
                        service_name in varchar2 default null);
    
    • 未使用参数:skip_current、abort_step、cluster_ok、service_name;
  • 功能描述:启动数据泵任务;

stop_job

  • 原型:

    procedure stop_job(handle in numeric,
                       immediate in numeric default 0,
                       keep_master in numeric default null,
                       delay in numeric default 60);
    
    • 未使用参数:immediate、keep_master、delay;
  • 功能描述:结束数据泵任务;

wait_for_job

  • 原型:

    procedure wait_for_job(handle in numeric,
                           job_state out varchar2);
    
  • 功能描述:
    等待数据泵任务(功能暂未实现);

dbms_datapump 示例

  • 以如下 SQL 为例:

    create table t1 (c1 int, c2 text, c3 number, primary key(c1));
    insert into t1 values(1, 'string1', 200.10);
    insert into t1 values(2, 'string2', 340.56);
    insert into t1 values(3, 'string3', 5.3455);
    
    create table t2 (c1 int CONSTRAINT con1 CHECK (c1 > 0), c2 date not null, primary key(c1));
    insert into t2 values(1, '2014-12-15');
    insert into t2 values(2, '2020-09-15');
    
    create directory dpdir as '/tmp/dumpdir';
    
  • 导出示例:

    declare
        hdl number; -- 任务句柄
    begin
        -- 创建一个新的 data pump 导出任务
        hdl := dbms_datapump.open(operation => 'export', job_mode => 'table', job_name => 'my_dump_job');
    
        -- 添加备份文件
        dbms_datapump.add_file(handle => hdl,
                               filename => 'my_pump.dmp',
                               directory => 'dpdir',
                               filetype => dbms_datapump.ku$_file_type_dump_file);
    
        -- 添加日志文件
        dbms_datapump.add_file(handle => hdl,
                               filename => 'my_pump.log',
                               directory => 'dpdir',
                               filetype => dbms_datapump.ku$_file_type_log_file);
    
        -- 导出指定的表
        dbms_datapump.metadata_filter(handle => hdl,
                                      name => 'NAME_EXPR',
                                      value => 'LIKE ''t%''');
    
        -- 并行导出
        dbms_datapump.set_parallel(handle => hdl, degree => 2);
        dbms_datapump.start_job(handle => hdl);
        dbms_datapump.stop_job(handle => hdl);
    end;
    /
    

    执行提示如下内容,则表示导出成功:

    NOTICE:  export cmd:lt_dump -v --lt-exclude-lightdb-objects -d odb -p 8000 -U lightdb -j 2 -t '*.(t*)' -F d -f /home/arch/test/datadump/my_pump.dmp > /home/arch/test/datadump/my_pump.log 2>&1 & echo $!
    DO
    
  • 导入示例:

    declare
        hdl number; -- 任务句柄
    begin
        -- 创建一个新的 data pump 导入任务
        hdl := dbms_datapump.open(operation => 'import', job_mode => 'table', job_name => 'my_restore_job');
    
        -- 添加备份文件
        dbms_datapump.add_file(handle => hdl,
                               filename => 'my_pump.dmp',
                               directory => 'dpdir',
                               filetype => dbms_datapump.ku$_file_type_dump_file);
    
        -- 添加日志文件
        dbms_datapump.add_file(handle => hdl,
                               filename => 'my_pump.log',
                               directory => 'dpdir',
                               filetype => dbms_datapump.ku$_file_type_log_file);
    
        -- 导入指定的表
        dbms_datapump.metadata_filter(handle => hdl,
                                      name => 'NAME_EXPR',
                                      value => 'LIKE ''t%''');
    
        -- 并行导入
        dbms_datapump.set_parallel(handle => hdl, degree => 2);
        dbms_datapump.start_job(handle => hdl);
        dbms_datapump.stop_job(handle => hdl);
    end;
    /
    

    执行提示如下内容,则表示导入成功:

    NOTICE:  import cmd:lt_restore -v -d odb -p 8000 -U lightdb -j 2 -F d /home/arch/test/datadump/my_pump.dmp > /home/arch/test/datadump/my_pump.log 2>&1 & echo $!
    
    DO
    

    查询恢复结果如下:

    lightdb@test=# select * from t1;
     c1 |   c2    |   c3
    ----+---------+--------
      1 | string1 |  200.1
      2 | string2 | 340.56
      3 | string3 | 5.3455
    (3 rows)
    
    lightdb@test=# select * from t2;
     c1 |         c2
    ----+---------------------
      1 | 2014-12-15 00:00:00
      2 | 2020-09-15 00:00:00
    (2 rows)
    

impdp 使用说明

  • impdp 是 LightDB 提供的工具(LightDB 24.1 开始支持),其目标是兼容 oracle 的 impdp 。在 LightDB 中, impdp 是通过 lt_restore 来实现的。

  • impdp 使用示例:

    impdp %s/%s@%s directory = %s dumpfile=total.dump table_exists_action=replace remap_schema=%s:%s transform=oid:n logfile = import_objecttype.log %s 2>&1
    
    • %s/%s@%s 表示用户名/密码@连接信息, @连接信息 可以不指定,比如:
      user/pwd@10.20.30.193:1521/dbname;

    • table_exists_action 可以是 skip、append、truncate、replace,其含义等价于 lt_restore--table_exists_action 选项;

    • remap_schema

      • impdp 支持在导入时,映射 schema,比如 s1:s2 将 schema s1 以及其中的内容导入到 schema s2 中;
      • 但不支持级联,比如 s1:s2,s2:s3
      • 如果源 schema 不存在会提示错误;
    • directory 指定的目录是通过 CREATE DIRECTORY 创建的;

    • transform :暂时未实现;

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值