1. 逻辑备份还原简介

DM数据库的备份还原包括两种类型:物理备份还原和逻辑备份还原。
物理备份还原是对数据库的操作系统物理文件(如数据文件、控制文件和日志文件等)的备份还原。
逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原。

逻辑导出(dexp)和逻辑导入(dimp)是DM数据库的两个命令行工具,分别用来实现对DM数据库的逻辑备份和逻辑还原。
逻辑备份和逻辑还原都是在联机方式下完成,联机方式是指数据库服务器正常运行过程中进行的备份和还原。
逻辑导出和逻辑导入数据库对象分为四种级别:数据库级、用户级、模式级和表级。四种级别独立互斥,不能同时存在。四种级别所提供的功能:
数据库级(FULL):导出或导入整个数据库中的所有对象。
用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象。
模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象。
表级(TABLES):导出或导入一个或多个指定的表或表分区。导出所有数据行、约束、索引等信息。

2. dexp工具使用

dexp工具名称有两种写法dexp和dexpdp。两者语法完全相同。唯一的区别在于,dexp导出的文件必须存放在客户端,dexpdp导出的文件必须存放在服务器端。
该工具在DM安装目录/bin下。启动方法如下(参数之间使用空格间隔):
dexp PARAMETER=<value>{ PARAMETER=<value> }
dexpdp PARAMETER=<value>{ PARAMETER=<value> }

2.1 dexp最常用的参数

2.1.1 USERID

用于指定数据库的连接信息。dexp中唯一的一个必选参数。
{{<username>[/<password>]} | /} [@<connect_identifier>] [<option>] [<os_auth>]
<connect_identifier> ::=<svc_name> | {<host>[:<port>]} | <unixsocket_file>
<option>::= #{<exetend_option>=<value>{,<extend_option>=<value>} } --此行外层{}是为了封装参数之用,书写时需要保留
<os_auth>::= AS {SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO}

{{<username>[/<password>]} | /}:

/表示采用操作系统身份验证方式登录,此时无需指定用户名和密码,即使指定也会被忽略。
密码中含有/,@.:等特殊字符时,需要外加三层双引号("""""")进行转义:
下面使用一个例子进行解析。例如:密码为 aaa/aaa
首先,dexp要求对含有特殊字符的密码内部进行转义(外加一层双引号),写成"aaa/aaa"。
其次,要将转义后的内容作为一个整体传给dexp(外加一层双引号),写成""aaa/aaa""。
最后,整个内容需要作为一个整体传给操作系统(外加一层双引号),因此写成"""aaa/aaa"""。
这里的密码转义规则在linux和windows上是否有区别还待验证

<unixsocket_file>

专门用于在LINUX系统中,当服务器与客户端之间使用UNIXSOCETUNIX-IPC方式通信时,指定客户端连接的UNIXSOCKET路径文件名。必须和inet_type=UNIXSOCKET同时使用。
例如:
./dexp ​​SYSDBA/SYSDBA@/home/test/foo.sock#{inet_type=UNIXSOCKET}​​ file=/home/dexp/dexp_test.dmp log=/home/log/
其中inet_type参数在option扩展选项中。

<option>:

为扩展选项,用法为<exetend_option>=<value>。所有value值不能包含空格,不能包含特殊的符号,如引号等。书写扩展选项时需要用引号#"{ }"进行封装。支持的扩展选项有mpp_type、inet_type、ssl_path、ssl_pwd,解释如下:

达梦数据库逻辑导入导出_转义

<os_auth>:

AS<SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO>:操作系统身份验证。操作系统身份验证的说明可参考《DM8安全管理》2.3.1节。

2.1.2 FILE

FILE用于明确指定导出的文件(可以包含路径),可以包含多个文件,用逗号分隔。如果不选用FILE参数来明确指定导出文件名称,那么默认导出文件名称为dexp.dmp
如果FILE指定的文件包含生成路径,则忽略DIRECTORY中的路径;
如果FILE没有指定路径时,使用DIRECTORY中指定的路径;
如果FILE和DIRECTORY都没有指定路径,则使用系统当前路径。
DIRECTORY:导出文件所在目录
文件也可以在生成过程中自动扩展成多个。
首先,文件名需要包含通配符%U,用于作为自动扩充文件的文件名模板。%U表示为2个字符宽度的数字,由系统自动生成,起始为01。
其次,使用FILESIZE参数来指定文件的大小。
例如,设置FILE=db_str%U.dmp,导出文件名为db_str%U.dmp。同时使用%U对文件进行扩展,使用FIZESIZE=128m指定文件大小上限:
./dexp USERID=SYSDBA/SYSDBA FILE=db_str%U.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp FILESIZE=128ms
当指定了filesize的时候,file/log必须自动扩展,否则报错,如果不指定FILE(或LOG),那么即使设置了FILESIZE也不起作用。
FILE和LOG同时使用%U时,FILESIZE参数只需指定一次

2.1.3 LOG

LOG用于明确指定导出的日志文件名称(可以包含路径),可以包含多个文件,用逗号分隔。可选参数。如果不选用LOG参数(来明确指定日志文件名称),那么默认导出日志文件名称为dexp.log。
文件也可以在生成过程中自动扩展成多个,规则和FILE的一样。
如果LOG指定的文件包含生成路径,则忽略DIRECTORY中的路径;
如果LOG没有指定路径时,使用DIRECTORY中指定的路径;
如果LOG和DIRECTORY都没有指定路径,则使用系统当前路径。
LOG文件记载了导出对象的统计信息。供用户查看导出内容。
LOG内容具体介绍如下:
1.如果导出级别为TABLES,那么日志信息包含一张或多张表的索引、权限、数据行数。
2.如果导出级别为SCHEMAS,那么日志信息只包含一个或多个模式中的对象统计信息,每个模式下的内容具体有:
导出SEQUENCE、VIEW、COMMENT、PROCEDURE、SYNONYM、DBLINK、TRIGGER、PACKAGE、OBJECT、CLASS_BODY和DOMAIN等对象的个数和名称,以及对象的权限。依次导出表的索引、权限、数据行数。
3.如果导出级别为OWNER,那么日志内容包含一个或多个用户所拥有的所有模式中的对象统计信息,每个模式下的内容和导出级别为SCHEMAS时一样。
4.如果导出级别为FULL,那么日志内容除了包含所有模式中的对象信息,还包括系统包和系统视图
和LOG有关的参数还有:
NOLOGFILE=Y用于设置不使用日志文件。
NOLOG=Y用于设置不在屏幕上显示日志信息。
LOG_WRITE=Y用于设置日志的实时打印(到日志文件)功能。

2.1.4 DIRECTORY

DIRECTORY用于指定导出文件及日志文件生成的路径。可选参数,缺省为导出到dexp所在路径。

2.1.5 四种导出级别

FULL=YOWNER=<用户名>{,<用户名>}SCHEMAS=<模式名>{,<模式名>}TABLES=<表名>{,<表名>}

四个之中选一个,默认为导出模式,但是不知道导出哪个模式。
导出内容中忽略指定的对象:
对象有CONSTRAINTS、INDEXES、ROWS、TRIGGERS和GRANTS。
比如:EXCLUDE=(CONSTRAINTS,INDEXES)
忽略指定的模式:
EXCLUDE=SCHEMAS:SCH1,SCH2
导出指定的对象:
INCLUDE=(CONSTRAINTS,INDEXES)
和TABLES导出有关的参数还有QUERY、EXCLUDE和INCLUDE,都是用来设置过滤条件的:
QUERY="<where_condition>"(where子句)
EXCLUDE=TABLES:table1,table2(忽略指定的表)
INCLUDE=TABLES:table1,table2(导出指定的表)

CONSTRAINTS、GRANTS、INDEXES、TRIGGERS、ROWS、TABLESPACE=Y/N默认导出约束、权限、索引、触发器、数据默认导出的对象定义中不包含表空间

此处,对象(CONSTRAINTS、GRANTS、INDEXES、TRIGGERS、ROWS)分别单独设置,和EXCLUDE/INCLUDE中批量设置功能一样。设置一个即可。如果单独设置和批量设置同时出现时,那么以最后出现的那个为准。

2.1.6 用户名、表名、模式名的书写规则:

1.对于输入的用户名、模式名和表名,工具都会自动转换为大写。
例如:输入的命令TABLES=t1,那么实际处理的表是T1。
2.对于小写的用户名、模式名和表名,为了不转换为大写,需要转义。
转义步骤如下:
第一步,如果想输入小写的名字不被转成大写,dexp要求将名称使用双引号括起来。例如:名称为tab1,要写成"tab1"。
第二步,另外,操作系统要求将传入的名称使用双引号括起来作为一个整体,同时要求内层的双引号还需要被转义。所以最终写成"\"tab1\""。
例如,表名为小写tabname,语句中应该写为"\"tabname\""。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES="\\"tabname\\""
3.如果含有特殊字符(双引号、单引号、空格、逗号等)的用户名、模式名和表名需要转义。
具体规则如下:
第一步,dexp要求对含有特殊字符的对象名称需要使用双引号括起来,同时特殊字符需要被转义(使用双引号")。例如:表名为''tab1",需写成"tab1"""
第二步,操作系统要求将传入的名称使用双引号括起来作为一个整体,同时要求内层的双引号和特殊字符还需要被转义。所以最终写成:"\\"tab1\"\\"\\""
linux使用\转义,windows使用\和"转义,为了方便,操作系统层面统一使用\转义

2.1.7 其他参数详解

HELP:查看帮助信息
PARFILE用于将常用的参数设置保存到文件中,然后使用参数文件PARFILE进行导出、导入操作。
PARFILE=/mnt/data/dexp/para.txt。
para.txt的内容:每一行直接写para_name=value
FEEDBACK用来指明在导出数据的过程中每间隔多少行打印一次进度信息。可选参数,默认为0。
NOLOGFILE=Y/N(默认为N,即使用日志文件)
一旦设置NOLOGFILE=Y不使用日志文件。此时即使存在LOG参数,LOG参数也为无效。
NOLOG设置屏幕上是否显示日志信息。默认为N,显示。
LOG_WRITE用于日志信息实时写入日志文件。Y:一边将日志内容打印到屏幕上,一边将日志内容写入日志文件。N或缺省参数:日志内容先在屏幕上全部打印完毕再写入日志文件。
FUZZY_MATCH=N/Y用于指定TABLES选项是否支持模糊匹配。可选参数,缺省为N。
PARALLEL用于指定导出的过程中所使用的线程数目(1-100)。可选参数,缺省为单线程。如果CPU核心数为N的话,那一般来说PARALLEL为N或者N+1最合适。
TABLE_PARALLEL用于指定导出每张表所使用的线程数(1-50)。在MPP模式下会转换成单线程。可选参数,缺省为单线程。如果CPU核心数为N的话,那一般来说PARALLEL为N或者N+1最合适。(TABLE_PARALLEL在FAST_LOAD为Y时有效)
TABLE_POOL用于设置导出过程中存储表数据的缓冲区个数(1-20),默认为1。
DESCRIBE='字符串':设置导出数据文件的描述信息,记录在数据文件中。
DROP=Y/N
Y:导出后删除原表,但不级联删除N(默认):导出后出不删除原表
FILENUM用于指定一个模板导出文件的个数。范围为1-99,默认99。
当FILENUM*FILESIZE<要导出的文件实际大小时,空间不足,导出失败。
FILESIZE用于指定单个导出文件(FILE)大小或日志文件(LOG)大小的上限。可以按字节[B]、K[B]、M[B]、G[B]的方式指定大小。可选参数。
使用FILESIZE参数时,FILE(或LOG)必须使用%U对名称进行自动扩展,否则报错。如果不指定FILE(或LOG),那么即使设置了FILESIZE也不起作用。
DUMMY=P/Y/N
P:提供交互界面,默认方式。当导出文件已存在的时候,提供是否覆盖交互界面。
Y:不提供交互界面,所有交互都按YES处理。
N:不提供交互界面,所有交互都按NO处理。
在使用dexpdp的时候,此参数无需设置,不提供交互信息,全部按YES处理。
COMPRESS指定是否压缩导出文件。可选参数。缺省为不压缩。
ENCRYPT=Y
设置导出文件加密。如果设置ENCRYPT=Y,那么默认COMPRESS=Y,先压缩后加密。
ENCRYPT_PASSWORD=<加密密钥>
ENCRYPT_NAME=<加密算法>(缺省为RC4)
加密算法可选项如下图:

达梦数据库逻辑导入导出_转义_02

3. dimp工具使用

导入方式可以和导出方式不一致。
例如:当导出方式不为FULL时,导入时也可以指定为FULL方式,此时的FULL会将导出文件包含的全部内容导入到指定的实例中。
一般情况下,OWNER与SCHEMAS导入导出是相同的。
但是用户可以包含多个模式,在这种情况下SCHEMAS的导入导出是OWNER导入导出的一个子集。
如果数据文件是通过加密后得到的,在数据文件导入到数据库时,需要提供加密密钥和加密算法。同时,在1个小时内只能尝试10次导入解密。

3.1 参数详解:

dimp无tablespace、compress和encrypt参数
dimp的参数除了一下列出的之外,其他的和dexp的一样。
其中userid和file是必选参数

3.1.1 dmfldr相关:

FAST_LOAD用于设置是否使用dmfldr进行数据导入,默认为N。
TABLE_PARALLEL在FAST_LOAD为Y时有效,用于指定导入每张表所使用的线程数。
FLDR_ORDER用于设置使用dmfldr时,是否严格按导出顺序来导入数据,默认Y。
TASK_THEAD_NUMBER用于设置dmfldr处理用户数据的线程数目(1-128)。可选参数,缺省值为CPU个数。但当CPU个数大于8时,默认值都被置为8。
BUFFER_NODE_SIZE用于设置dmfldr指定读取文件缓冲区页大小(1-2048,单位:M)。可选参数,默认为10。值越大,缓冲区的页数越多,每次可以读取的数据就越多,每次发送到服务器的数据也就越多,效率越高。但其大小受dmfldr客户端内存大小限制。
TASK_SEND_NODE_NUMBER用于设置dmfldr发送节点个数(16-65535).在系统内存够的情况下可以适当的设大数值以提升效率。缺省情况下,由程序自动计算。
LOB_NOT_FAST_LOAD=Y用于设置当表中含有大字段时不使用dmfldr,而使用普通的INSERT进行插入,根据COMMIT_ROWS参数决定提交的行数。因为当表中有大字段的时候,dmfldr是一行一行提交表数据。

3.1.2 其他参数

IGNORE指定忽略创建数据库对象(表、类、java类、domain、sequence、comment、view、synonym、trigger、package、dblink、user、存储过程/函数、role对象创建、权限授权语句、索引、约束等)错误。可选参数。缺省为N,不忽略。
IGNORE=Y:忽略导入时所产生的创建数据库对象错误并继续执行。当缺省或IGNORE=N时,不忽略导入时所产生的创建数据库对象错误,遇到错误即停止执行并报错。
TABLE_EXISTS_ACTION用于要导入的表存在时的处理方式。默认为直接报错。
SKIP:跳过此表。
APPEND:直接向现有表中导入数据
TRUNCATE:先删除现有表中的数据,再向表中导入数据
REPLACE:先删除现有表,再导数据
PRIMARY_CONFLICT用于设置主键冲突的处理方式。
IGNORE:不覆盖主键冲突行数据。
OVERWRITE:覆盖主键冲突行数据,删除原表有冲突的行。
OVERWRITE2:覆盖主键冲突行数据,更新原表有冲突的行。
COMMIT_ROWS用于设置批量提交的行数,默认为5000行(1-1000000)。用户可以根据实际情况调整每次提交的行数,以达到性能的最佳点。一般情况下可不设置。
如果导出时包含过程/函数、视图、物化视图、触发器、类和包,那么导入时会执行一个编译语句(alter...compile)。
COMPILE用于设置是否在导入时,对过程或函数执行编译。默认为Y
编译相当于执行重建操作,用于检查过程或函数是否还有效。编译成功,说明对象是有效的;编译失败,说明对象不存在或发生改变,导致重建操作失败。编译失败,导入停止。不编译就不检查有效性,直接导入。
INDEXFILE=<文件>用于将表的索引/约束创建信息写入指定的文件。
例如,设置INDEXFILE=f:\data\dimp.log。
INDEXFIRST用于设置导入时是否先建索引。可选参数。
创建索引的过程是先遍历数据再创建索引树。数据量比较大时,应该选择INDEXFIRST=Y,先创建索引再导入数据,这样就避免创建索引之前遍历大量数据而耗费时间;数据量小时,可任意选择。
TABLE_FIRST用于控制是否强制先导入表对象。可选参数,默认(N)。
N:正常导入。顺序为:1.没有依赖的对象(除了表之外的数据库对象);2.有依赖的class;3.表;4.依赖对象。
Y:强制先导入表。顺序为:1.表;2.没有依赖的对象(除了表之外的数据库对象);3.有依赖的class;4.依赖对象。

REMAP_SCHEMA=<SOURCE_SCHEMA>:<TARGET_SCHEMA>

<SOURCE_SCHEMA>:源模式。如果指定的源模式不存在,则导入到对象原来所在的模式。
<TARGET_SCHEMA>:目标模式。如果目标模式不存在,先创建目标模式,再继续导入。
SHOW/DESCRIBE用于设置是否打印FILE参数指定的.dmp文件的内容列表。