lt_dump/lt_restore 使用说明
lt_dump 和 lt_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
选项可以指定目标格式,可选的格式包括(但无论导出的格式如何,备份或恢复的内容都是完全相同的):
-
-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);
-
-
-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 配置值充足);
-
-
-Ft
/--format=t
:- 其中
t
表示tar
,表示导出为单个 tar 归档格式(不支持压缩); - 由于这种导出文件是二进制格式,所以建议总是通过
-f
选项指定导出的目标文件; - 这种归档格式需要通过 lt_restore 命令进行恢复;
- 其中
-
-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 可选的值:
- pre-data:包括表结构、函数、索引、视图、包、序列等基础定义;
- data:表数据;
- 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;
-
指定 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;
-
指定 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 \.
-
指定 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_dump , lt_restore 指定恢复内容时,可以控制的更加精细:
-
-P
或--function
:- 表示只恢复指定的函数,而不恢复其他数据库对象;
- 可以使用多个 -P 选项来指定多个函数;
-
-I
或--index
:- 表示只恢复指定的索引,而不恢复其他数据库对象;
- 可以使用多个 -I 选项来指定多个索引;
-
-T
或--trigger
:- 表示只恢复指定的触发器,而不恢复其他数据库对象;
- 可以使用多个 -I 选项来指定多个触发器;
-
-
--table_exists_action
:-
在恢复表数据时,用于控制数据的恢复机制;
-
有 4 可选的值:
skip
:如果表存在,则跳过;append
:向表中追加数据;truncate
:先 truncate 表,然后再 insert 数据;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
选项,可以实现只导出表空间和用户,当然也可以单独导出表空间和用户:- 指定
-t
或--tablespaces-only
则只导出表空间定义; - 指定
-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_dump 和 lt_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 支持
export
和import
; - job_mode 支持
shcema
和table
; - 未使用参数:remote_link、version;
- operation 支持
-
功能描述:
定义一个新任务,返回句柄;
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_expr
、name_expr
; - value 支持
in
、not in
、like
、not like
表达式; - 未使用参数:object_path;
- name 支持
-
功能描述:添加过滤条件;
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 不存在会提示错误;
- impdp 支持在导入时,映射 schema,比如
-
directory
指定的目录是通过CREATE DIRECTORY
创建的; -
transform
:暂时未实现;
-