更多达梦数据库相关问题,请前往达梦技术社区 https://eco.dameng.com/ 

通常对于在数据库管理维护层面来说,逻辑备份可以作为数据库物理备份的补充:

数据库DBMS 层面管理来说,一般不用关心表中数据的逻辑表现,即数据的业务值属性。

但是,为配合应用人员需求,通常此类工作较多,一般是为了生产环境和测试环境,压力测试等不同环境进行表级别的数据迁移,以及数据脱敏工作等。

导出方式

dexp 逻辑导出

dexp 工具名称有两种写法 dexp 和 dexpdp。两者语法完全相同。

唯一的区别在于,dexp 导出的文件必须存放在客户端,dexpdp 导出的文件必须存放在服务器端。

dexp 工具需要从命令行启动,进入 dexp 所在安装目录,输入 dexp 和参数后,回车执行。

语法如下: dexp     PARAMETER= { PARAMETER= }

或               dexpdp PARAMETER= { PARAMETER= }

参数说明:

USERID USERID 用于指定数据库的连接信息。必选参数。

FILE 用于明确指定导出的文件(可以包含路径),可以包含多个文件,用逗号分隔。可 选参数,如果不选用 FILE 参数(来明确指定导出文件名称),那么默认导出文件名称为 dexp.dmp。

如果 FILE 指定的文件包含生成路径,则忽略 DIRECTORY 中的路径; 如果 FILE 没有指定路径时,使用 DIRECTORY 中指定的路径; 如果 FILE 和 DIRECTORY 都没有指定路径,则使用系统当前路径。

LOG LOG 用于明确指定导出的日志文件名称(可以包含路径),可以包含多个文件,用逗号分 隔。可选参数。如果不选用 LOG 参数(来明确指定日志文件名称),那么默认导出日志文件 名称为 dexp.log。

NOLOG=Y 用于设置不在屏幕上显示日志信息。

./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y

在使用 dexpdp 和 dimpdp 时,

DIRECTORY 参数支持使用在服务器端通过 CREATE DIRECTORY 定义的目录名。

例如,先在服务器端创建名为GYFDIR的目录,再使用该目录进行导出。

--先连接上远程的数据库服务器 192.168.60

disql SYSDBA/SYSDBA@192.168.1.60

--在远程服务器上创建目录

CREATE OR REPLACE DIRECTORY "GYFDIR" AS 'E:\test\path';

--使用 dexpdp 导出文件

dexpdp USERID=SYSDBA/SYSDBA FILE=dexpDP.dmp LOG=dexpDP.log FULL=Y DIRECTORY=GYFDIR

四种级别的导出方式 针对数据库对象,有 FULL、OWNER、SCHEMAS、TABLES 四种导出方式可供选择。一 次导出只能指定一种方式。可选参数,缺省为 SCHEMAS。

NOLOG 设置屏幕上是否显示日志信息。可选参数。

导入方式:

dimp 逻辑导入

dimp 工具名称有两种写法 dimp 和 dimpdp。两者语法完全相同。唯一的区别在于, dimp 导入的文件必须存放在客户端,dexpdp 导入的文件必须存放在服务器端。

dimp 工具需要从命令行启动。

在 cmd 命令行工具中找到 dimp 所在安装目录 /dmdbms/bin,输入 dimp 和参数后回车。

语法如下:

dimp PARAMETER=value { PARAMETER=value }

dimpdp PARAMETER=value { PARAMETER=value }

参数说明;

3.3.1.1 USERID USERID 用于指定数据库的连接信息,必选参数。用法请参考 dexp 中 USERID。 3.3.1.2 FILE FILE 用于指定明确导入 dexp 导出的文件(可以包含路径)。为必选参数。

如果 FILE 指定的文件包含生成路径,则忽略 DIRECTORY 中的路径; 如果 FILE 没有指定路径时,使用 DIRECTORY 中指定的路径; 如果 FILE 和 DIRECTORY 都没有指定路径,则使用系统当前路径。

针对数据库对象,有 FULL、OWNER、SCHEMAS、TABLES 四种导出方式可供选择。一 次导出只能指定一种方式。可选参数,缺省为 SCHEMAS。

TABLE_EXISTS_ACTION

TABLE_EXISTS_ACTION 用于要导入的表已经存在时的处理方式。默认为直接报错。 语法如下: TABLE_EXISTS_ACTION=[SKIP | APPEND | TRUNCATE | REPLACE] SKIP:跳过此表。 APPEND:直接向现有表中导入数据 TRUNCATE:先删除现有表中的数据,再向表中导入数据 REPLACE:先删除现有表,再导数据

示例:

2. dexp 导出 导出数据库的所有对象(FULL=Y),导出文件为 dexp01.dmp,导出日志为 dexp01.log, 导出文件和日志文件都存放在/emc_2/data/dexp 目录中。 ./dexp SYSDBA/SYSDBA@192.168.0.248:5236 FILE=dexp01.dmp LOG=dexp01.log DIRECTORY=/emc_2/data/dexp FULL=Y 3. dimp 导入 导入 SYSDBA、OTHER、PERSON 模式中的数据(SCHEMAS=SYSDBA,OTHER,PERSON),导入 文件就是上一步导出的文件 dexp01.dmp,导入日志 dimp02.log 放入/emc_2/data/dimp 目录中。 ./dimp SYSDBA/SYSDBA@192.168.0.248:8888 FILE=/emc_2/data/dexp/dexp01.dmp LOG=dimp02.log DIRECTORY=/emc_2/data/dimp SCHEMAS=SYSDBA,OTHER,PERSON

快速装载:

dmfldr(DM Fast Loader)是 DM 提供的快速数据装载命令行工具。用户通过使用 dmfldr 工具能够把按照一定格式排序的文本数据以简单、快速、高效的方式载入到 DM 数 据库中,或把 DM 数据库中的数据按照一定格式写入文本文件。

当进行数据载入时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件与数据 文件,将数据打包发送给服务器端的 dmfldr 模块,由服务器完成数据的真正装载工作。 并分析服务器返回的消息,必要时根据用户参数指定生成日志文件与错误数据文件。

当进行数据导出时,dmfldr 客户端接收用户提交的命令与参数,分析控制文件,将用 户要求转换成相应消息发送给服务器端的 dmfldr 模块。服务器解析并打包需要导出的数 据,发送给 dmfldr 客户端,客户端将数据写入指定的数据文件,必要时根据用户参数指 定生成日志文件。

安装好 DM 数据库管理系统后,在安装目录的“bin”子目录下可找到 dmfldr 执行文 件。

dmfldr 指定参数的格式为: dmfldr keyword=value [keyword=value ...]

参数说明:

USERID 和 CONTROL 是启动 dmfldr 必须要指定的参数,且 USERID 必 须是第一个参数,CONTROL 必须是第二个参数。

dmfldr 使用较为灵活,参数较多,用户可以使用“dmfldr help”查看各参数的简 单信息。

LOG 日志文件,字符串类型 (fldr.log)

BADFILE 错误数据记录文件,字符串类型 (fldr.bad)

SET_IDENTITY 是否插入自增列 (FALSE)

CHARACTER_CODE 字符编码,字符串类型 (GBK, GB18030,UTF-8, SINGLE_BYTE, EUC-KR) MODE 装载方式,字符串类型 IN 表示载入,OUT 表示载出, OUTORA 表示载出 ORACLE (IN) CLIENT_LOB 大字段目录是否在本地 (FALSE) LOB_DIRECTORY 大字段数据文件存放目录 LOB_FILE_NAME 大字段数据文件名称,仅导出有效 (dmfldr.lob)

SQL 使用自定义查询语句,仅导出模式有效

MODE dmfldr 的装载模式,字符串类型。默认值为 IN。MODE 的可选项有 IN、OUT 和 OUTORA 三种。 IN 模式指从数据文件中将数据装载入数据库,这种模式下控制文件的格式对应为数据 文件中现有数据的格式;OUT 模式指从数据库中将数据导出到数据文件,这种模式下控制 文件所指定的格式为数据存放在数据文件中的格式。需要说明的是在 OUT 模式下,如果指 定了多个数据文件,则 dmfldr 最终只会将数据写入第一个数据文件。视图对象只支持导 出,不支持导入。 OUT 模式下的控制文件与 IN 模式下的控制文件格式相同,用户可以通过使用同一个文 件进行载入和导出数据。 OUTORA 模式表示导出 ORACLE 表的数据,此模式下暂不支持带有大字段表的导出。 用户也可以通过指定控制文件中的 OPTIONS 选项来设置 MODE 的值,参数值的优先选 择顺序为先 OPTIONS 选项,后参数选项。

dmfldr 实战

控制文件 CONTROL 是启动 dmfldr 必须要指定的参数,用于指定数据文件中数据的格 式。在数据载入时,dmfldr 根据控制文件指定的格式来解析数据文件;导出数据时, dmfldr 也会根据控制文件指定的列分隔符、行分隔符等生成数据文件。

关于 APPEND|REPLACE|INSERT 选项,当 dmfldr 处于数据装载模式时, INSERT 表示插入方式,向空表插入新记录(如果不是空表则会报错无效的装载模 式);APPEND 表示追加方式,为缺省方式,在表中追加新记录;REPLACE 表示 替代方式,先清空表再插入新记录

例:一个 dmfldr 控制文件的例子

OPTIONS ( SKIP = 0 ROWS = 50000 DIRECT = TRUE INDEX_OPTION = 2 ) LOAD DATA INFILE '/opt/data/test1.txt' STR X '0A' BADFILE '/opt/data/test1.bad' INTO TABLE test1 FIELDS '|' ( F1, F2 DATE FORMAT 'YYYY-MM-DD', F3 NULL, F4 TERMINATED BY WHITESPACE ENCLOSE BY '(', F5 CONSTANT "test", F6 "trim()" ) LOAD DATA INFILE '/opt/data/test2.txt' STR X '0A' BADFILE '/opt/data/test2.bad' INTO TABLE test2 FIELDS '|' ( C1 TERMINATED BY ' ', C2, C3 DATE FORMAT 'yyyy-mm-dd')

3.2.2 使用 DATA 参数指定数据文件 也可以使用 DATA 参数指定 dmfldr 的数据文件,数据文件路径的优先选择顺序为先 控制文件,后参数选项。如果控制文件中数据文件路径指定为‘*’,在命令行通过 DATA 参数指定数据文件路径,DATA 所指定的文件路径会替换‘*’。

编辑控制文件 test.ctl,存放路径为/opt/data/test.ctl,内容如下: LOAD DATA INFILE * INTO TABLE test FIELDS '|' ( C1 TERMINATED BY ' ', C2, C3 DATE FORMAT 'yyyy-mm-dd' )

使用 dmfldr 进行数据载入 ./dmfldr userid=SYSDBA/SYSDBA@localhost:5236 control=\'/opt/data/test.ctl\' data=\'/opt/data/test.txt \'

dmfldr 使用的数据文件都是文本格式的,其中的列值都是以字符串的方式保存在数据 文件中。要想将这些数据载入数据库表中,需要将字符串转换成数据库表各列对应的数据类 型。dmfldr 支持所有 DM 数据库支持的列定义类型,包括字符串、数值、时间日期、时间 日期间隔、大字段类型等。 若数据文件的编码方式与 DM 数据库服务器的编码方式不一样,dmfldr 还需要进行字 符编码的转换。dmfldr 支持 UTF8、GBK 和 GB18030 编码之间的相互转换

数据类型和编码转换工作由 dmfldr 客户端进行,在这个过程中如果出现错误, dmfldr 会跳过该行继续后面的工作,并记录错误行到 BADFILE 指定的文件。常见的出错 的情况有以下几种:  编码转换失败  目标列为字符串类型时,数据长度大于列定义长度  目标列为数值类型时,数据包含非法字符或者转换后超出该数值的范围  目标列为日期类型时,dmfldr 默认按 yyyy-mm-dd hh:mi:ss 的格式解析,如 果数据不是这样的格式,需要指定对应列的时间日期 fmt 格式而未指定

7 自增列装载 自增列是比较特殊的列,为了保证数据库中自增列列值的正确性,用户在进行数据载入 时需要特别注意。 当 DIRECT 参数为 FALSE 时,dmfldr 将把从数据文件中读取的自增列值作为目标值 插入数据库表中,用户应当保证每一行的自增列的值符合自增列的规则,否则将造成数据混 乱。 当 DIRECT 参数为 TRUE 时,dmfldr 提供了 SET_IDENTITY 参数(默认为 FALSE) 对数据载入时自增列的处理进行设置:  如果指定 SET_IDENTITY 选项值为 TRUE,则 dmfldr 将把从数据文件中读取的 自增列值作为目标值插入数据库表中,用户应当保证每一行的自增列的值符合自增 列的规则,否则将造成数据混乱;  如果 SET_IDENTITY 选项值设置为 FALSE,则 dmfldr 将忽略数据文件中对应 自增列的值,服务器将根据自增列定义和表中已有数据自动生成自增列的值插入每 一行的对应列。

几个常见的问题:

1、字符乱码:

2、特表的表字段,自增字段,默认值,当前时间字段。

3、LOB大字段

3.14 主备切换时的数据继续载入

 目前不支持分区表装载

目前仅支持单机的主备,不支持 MPP 主备。

但是,若在 MPP 主备环境中使用 MPP_CLIENT=FALSE,等同于单机,也是支持的。

性能:

3.16 提升 dmfldr 性能 用户在使用 dmfldr 时根据系统和数据的具体情况对一些参数进行调整,可以获得更 好的性能,这些参数包括:  BUFFER_NODE_SIZE BUFFER_NODE_SIZE 设置读取文件缓冲区页大小,值越大,缓冲区的页越大,每次读 取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受 dmfldr 客 户端内存大小限制。  READ_ROWS 在某些情况下,BUFFER_NODE_SIZE 读入的数据行数很大,而后续操作处理不了这么 大的行数,此时可以用 READ_ROWS 来限制处理的行数。dmfldr 取 READ_ROWS 和 BUFFER_NODE_SIZE 中较小的值作为一次处理的行数。  SEND_NODE_NUMBER 指定 dmfldr 在数据载入时发送节点的个数,默认由系统计算一个初始值。若在数据 载入时发现发送节点不够用,系统会动态增加分配。在系统内存足够的情况下,可以适当设 大 SEND_NODE_NUMBER 值,提升 dmfldr 载入性能。  TASK_THREAD_NUMBER 指定 dmfldr 在数据载入时处理用户数据的线程数目。默认情况下,dmfldr 将该参 数值设为系统 CPU 的个数,但当 CPU 个数大于 8 时,默认值都被置为 8。在 dmfldr 客户 端所在机器 CPU 大于 8 环境中,提高 TASK_THREAD_NUMBER 值可以提升 dmfldr 装载 性能。

INDEX_OPTION 索引的设置选项,默认为 1。INDEX_OPTION 的可选项有 1、2 和 3。 1 代表服务器装载数据时先不刷新二级索引,而是将新数据按照索引预先排序,在装载 完成后,再将排好序的数据插入索引。如果在数据载入前,目标表中已有较多数据,建议 INDEX_OPTION 置为 1。 2 代表服务器在快速装载过程中不刷新二级索引数据,只在装载完成时重建所有二级索 引。如果在数据载入前,目标表中没有数据或数据量较小,建议 INDEX_OPTION 置为 2。 3 代表服务器使用追加模式来进行二级索引的插入, 在数据装载的过程中, 同时进行 二级索引的插入, 当原有数据量远大于插入数据量时, 建议 INDEX_OPTION 置为 3。

3.17dmfldr 使用限制 dmfldr 的使用存在以下一些限制:  不支持向临时表、外部表装载数据  不支持向系统表装载数据  不支持向带有位图索引的表装载数据  不支持向带有函数索引的表装载数据  不支持向带有全文索引的表装载数据  不支持向带有全局索引的表装载数据  不支持向 DCP 代理装载数据  dmfldr 装载时,对约束进行检查,对各种约束的处理机制如下表所示

表 3.1 dmfldr 的约束检查机制 约束 数据不满足时 数据插入与否 约束是否有效 非空约束(NOT NULL) 报错 不插入 有效 聚集索引(CLUSTER PRIMARY KEY) 报错 不插入 有效 唯一约束(UNIQUE, PRIMARY KEY) 报错 插入 失效 引用约束(FOREIGN KEY) 不报错 插入 有效 CHECK 约束(CHECK) 不报错 插入 有效