达梦数据库dimp和dexp工具的使用

本文介绍了达梦数据库的逻辑备份工具dexp和dimp的使用方法,包括不同级别的备份与还原、特殊字符处理及加密操作等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、dexp和dimp工具的介绍

1、达梦数据库的数据备份与还原分为物理备份还原与逻辑备份还原两种,dexp(逻辑导出)和dimp(逻辑导入)是达梦的逻辑备份还原工具,工具存放位置在/dmdbms/bin下。

2、逻辑备份还原均需要在数据库正常运行下方可进行。

3、逻辑导入导出的对象分为四种级别(四种级别互斥),分别为:
(1)数据库级:导入或导出整个数据库中所有对象,对应语法为:
FULL=Y
(2)用户级:导入或导出一个或多个用户所拥有的对象,对应语法为:
OWNER=<用户名> //单用户
OWNER=<用户名1>,<用户名2>… //多用户
(3)模式级:导入或导出一个或多个模式下的所有对象,对应语法为:
SCHEMAS=<模式名> //单模式
SCHEMAS=<模式名1>,<模式名2>… //多模式
(4)表级:导入或导出一个或多个指定的表或表分区,对应语法为:
TABLES=<表名> //单表
TABLES=<表名1>,<表名2>… //多表
TABLES=模式名.表名1,模式名.表名2 //导出指定模式下的表

4、对输入的用户名、模式名、表名,都会被默认转换为大写的字符,如果不想被转换,dexp要求将名称用双引号括起来。如需要对表table1进行导出,转义如下:
(1)”table1” //用双引号
(2)\”table\” //操作系统要求将双引号进行转义
(3)“\”table\”” //加双引号,作为一个整体
对含有特殊字符(如双引号、单引号、空格、逗号等)的表名,对特殊字符需要使用双引号“”来进行转义,如对表名table1”进行转义,操作如下:
(1) table1”
(2) “table1”” //加双引号,不被转为大写(达梦规则)
(3) “table1”””” //对表名的”进行转义(达梦规则)
(4) \”table\”\”\” //对内层的”均进行转义,(OS要求)
(5) “\”table\”\”\”” //加双引号作为整体(OS要求)
规则总结:先对特殊字符进行转义,再到外层加上作为整体的双引号;

5、通过过滤参数(QUERY、EXCLUDE、INCLUDE)进行表级导出
(1)QUERY:指定过滤条件来导出表数据,语法如下:
QUERY=”条件语句”
如,导出表里面score=90的数据,语句如下:
QUERY=”where score=90”
(2)EXCLUDE:批量设置导出时忽略的对象
TABLES=t1,t2 EXCLUDE=/(CONSTRAINTS/) //导出t1,t2时去掉约束
(3)INCLUDE:批量设置导出时包含的对象种类,如
TABLES=t1 INCLUDE=/( CONSTRAINTS,INDEX/) //导出t1时含约束和索引

6、其他参数:
(1)COMPRESS:是否压缩导出文件,COMPRESS=Y/N
(2)ENCRYPT:是否加密导出文件,ENCRYPT=Y,则COMPRESS=Y
(3)ENCRYPT_PASSWORD:设置加密密钥
(4)ENCRYPT_NAME:设置加密算法,缺省为RC4
注:dimp就是dexp的相反过程,在此不赘述;

二、dexp导入操作

在达梦8数据库里面,新建一个模式,并在模式下导入表,进行dexp和dimp的操作。
1、dexp导出操作:

./dexp USERID=SYSDBA/SYSDBA123@192.168.152.132:5236 FILE=db_full.dmp DIRECTORY=/opt/dmdbms/dexp LOG=db_full.log FULL=Y  //库级导出

./dexp USERID=SYSDBA/SYSDBA123@192.168.152.132:5236 FILE=db_schema.dmp DIRECTORY=/opt/dmdbms/dexp LOG=db_schema.log SCHEMAS=db_conf  //模式级导出

./dexp USERID=SYSDBA/SYSDBA123@192.168.152.132:5236 FILE=db_user.dmp DIRECTORY=/opt/dmdbms/dexp LOG=db_user.log OWNER=SYSDBA  //用户级导出

./dexp USERID=SYSDBA/SYSDBA123@192.168.152.132:5236 FILE=db_table.dmp DIRECTORY=/opt/dmdbms/dexp LOG=db_table.log  //表级导出

2、dexp导出操作结果:
在这里插入图片描述

三、dimp导入操作:

基于1、2步导出的数据,进行数据导入操作

./dimp USERID=SYSDBA/SYSDBA123@192.168.152.132:5238 FILE=db_full.dmp DIRECTORY=/opt/dmdbms/dimp LOG=db_full_dimp.log FULL=Y  //导入库

./dimp USERID=SYSDBA/SYSDBA123@192.168.152.132:5238 FILE=db_schema.dmp DIRECTORY=/opt/dmdbms/dimp LOG=db_schema_dimp.log SCHEMAS=DB_CONF  //导入模式

./dimp USERID=SYSDBA/SYSDBA123@192.168.152.132:5238 FILE=db_user.dmp DIRECTORY=/opt/dmdbms/dimp LOG=db_user_dimp.log OWNER=SYSDBA //导入用户所属数据

./dimp USERID=SYSDBA/SYSDBA123@192.168.152.132:5238 FILE=db_table.dmp DIRECTORY=/opt/dmdbms/dimp LOG=db_table_dimp.log TABLES=DB_CONF.T_ATY_CODE,DB_CONF.T_ATY_DEPT  //导入表

4、dimp导入操作结果
在这里插入图片描述
需要注意的是,对于模式级、用户级、表级的导入,在导入前,需要先创建好同名的模式名,否则导入的过程中会警告出错,而对于数据库级的导入,则没有这个要求。

四、加密导出导入

./dexp USERID=SYSDBA/SYSDBA123@192.168.152.132:5236 FILE=db_full.dmp DIRECTORY=/opt/dmdbms/dexp/encrypt LOG=db_full.log ENCRYPT=Y ENCRYPT_PASSWORD=123qweasd ENCRYPT_NAME=RC4 FULL=Y

./dimp USERID=SYSDBA/SYSDBA123@192.168.152.132:5238 FILE=db_full.dmp DIRECTORY=/opt/dmdbms/dexp/encrypt LOG=db_full_dimp.log ENCRYPT_PASSWORD=123qweasd FULL=Y

可以看出,加密导出的时候,不需要手动去添加COMPRESS=Y这个参数,因为如果ENCRYPT=Y,则默认COMPRESS=Y;
另外,在导入的过程中,只需要添加加密的密码即可,那是因为缺省加解密算法都是RC4,所以在导入的时候不需要再次声明该参数值,如果导出的时候指定了别的加密算法,则导入的时候该参数需要特别指出;

五、在学习中遇见的问题

初始化一个新实例以后,通过命令无法启动,status查看状态,展示如下:
在这里插入图片描述1、尝试的启动方法有以下:
(1) 进入/home/dmdba/dmdbms/bin/service_template,执行:
./DmService start
结果显示启动过程出错。

(2) 将服务注册到/rc.d/init.d里面,执行:
Service DmServiceDMSERVER start
结果显示启动过程仍然报错。
(3) 将服务注册到systemd里面启动,执行:
systemctl start DmServiceDMSERVER start
结果显示启动过程还是报错。
2、分析过程:
(1) 安装完数据库后初始化的第一个实例,启动是正常的,说明数据库安装没有问题。
(2) 整个报错过程,一直提示文件权限不够,检查了对应文件的读写权限,均正常,说明不是文件读写权限的问题。
(3) 最后检查发现,数据库安装的用户是dmdba,安装后初始化的第一个实例也是用dmdba进行的,但是此时在进行初始化操作的用户为root,说明是用户角色权限的问题,因为是使用dmdba进行安装的,所以整个数据库文件属主均为dmdba:dminstall,所以有些文件,对root来说,不具备执行权限,切换到dmdba重新初始化实例后,该问题解决。
因此,如果不是使用root用户安装的数据库,则在初始化实例的时候,就要使用安装用户进行操作(谁安装,谁初始)

<think>好的,我现在需要解决用户在使用DIMP工具导入达梦8数据库时遇到的LENGTH_IN_CHAR参数不匹配问题。用户提到本地编码是PG_GBK,而导入文件编码是PG_UTF8,版本号是03134284336-20250117-257733-20132。首先,我得了解LENGTH_IN_CHAR参数的作用以及它如何影响数据导入。 根据达梦数据库的文档,LENGTH_IN_CHAR参数决定了字符类型长度的计算方式。当该参数设置为1时,VARCHAR等字符类型的长度以字符为单位,比如VARCHAR(10)可以存储10个中文字符。而设置为0时,长度以字节为单位,这时候中文字符可能占用多个字节,导致存储空间不足,特别是在不同编码环境下,如GBKUTF-8之间转换时,字符的字节长度不同,容易引发问题。用户的问题可能是在导出导入的数据库之间,这个参数设置不一致,导致字段定义的实际存储空间不足以容纳导入的数据,从而出现长度不匹配的错误。 接下来,我需要查阅用户提供的引用内容,看看是否有相关的解决方案。引用[1]中提到,当遇到字段精度问题时,可以修改字段精度或者调整存储方式。例如,建议将VARCHAR字段的精度扩大4倍,或者修改为VARCHAR(n CHAR)来指定以字符为单位。另外,还可能涉及到聚集索引的问题,但用户当前的问题似乎与编码字段长度相关,所以暂时不需要处理聚集索引的问题。 用户的情况是本地编码为PG_GBK,而导入文件编码为PG_UTF8。UTF-8编码下,一个中文字符通常占用3个字节,而GBK是2个字节。如果导出库的LENGTH_IN_CHAR设置为1,字段定义为VARCHAR(10),那么以字符为单位,可以存储10个字符,即UTF-8下可能占用30字节。而导入库如果LENGTH_IN_CHAR为0,则VARCHAR(10)表示10字节,这时候明显不够,导致数据截断或报错。 解决方法首先需要统一两端的LENGTH_IN_CHAR参数。如果无法修改导入库的参数,可能需要调整表结构。比如,在导入前修改目标表的字段定义,扩大长度或使用CHAR单位。同时,编码转换也是一个关键点,确保数据在导入时正确转换编码格式,避免乱码或长度溢出。 另外,用户提供的引用[2]提到大数据插入时使用@符号处理,这可能与数据导入方式有关,但当前问题更关注参数字段定义。引用[3]中的全库导出参数可能帮助用户检查导出时的设置,确保导出导入的参数一致。 可能的步骤包括: 1. 检查导出导入数据库的LENGTH_IN_CHAR参数设置,确保一致。 2. 如果参数不同,修改导入库的参数,或者在导出时调整参数。 3. 修改目标表的字段定义,扩大长度或使用CHAR单位。 4. 处理编码转换问题,可能需要使用工具转换数据文件编码或在导入时指定正确的编码。 5. 使用DIMP工具时,添加适当的参数,如ENCODING选项,指定文件编码。 需要验证这些步骤的可行性,比如修改LENGTH_IN_CHAR是否需要重启数据库,或者是否支持在线修改。另外,用户可能需要导出表结构脚本,手动调整字段定义后再导入数据,避免结构不匹配。 最后,还要考虑数据导入时的错误处理,比如是否部分数据失败,如何定位具体的错误行,可能需要查看日志文件进行分析。此外,确保在调整参数或结构后,进行充分的测试,避免生产环境出现问题。</think>### 解决达梦8数据库DIMP工具导入时LENGTH_IN_CHAR参数不匹配的步骤 #### 1. **理解参数差异** - **LENGTH_IN_CHAR参数**:控制字符类型(如`VARCHAR`)的长度计算方式。 - `LENGTH_IN_CHAR=1`:长度以字符为单位,例如`VARCHAR(10)`可存储10个汉字(UTF-8下占30字节)[^1]。 - `LENGTH_IN_CHAR=0`:长度以字节为单位,例如`VARCHAR(10)`仅允许存储10字节(可能仅3个汉字)。 - **编码差异**:本地编码`PG_GBK`(单字符2字节)与导入文件编码`PG_UTF8`(单字符3字节)会导致实际存储空间需求不同。 #### 2. **统一参数或调整表结构** - **方案1:修改目标库参数** 1. 在达梦数据库中执行以下命令修改参数: ```sql ALTER SYSTEM SET 'LENGTH_IN_CHAR' = 1; -- 与导出库参数保持一致 ``` 2. **重启数据库生效**,但需注意此操作可能影响现有业务。 - **方案2:手动调整表结构** 1. 导出导入文件的表结构脚本(使用`dimp`工具导出元数据): ```bash ./dimp USERID=SYSDBA/SYSDBA FILE=export.dmp DIRECTORY=/path/to/dir LOG=import.log SCHEMAS=your_schema SQL=Y ``` 2. 修改脚本中的字段定义: - 将`VARCHAR(n)`改为`VARCHAR(n*4)`(扩大精度)。 - 或指定以字符为单位:`VARCHAR(n CHAR)`。 3. 在目标库执行修改后的DDL脚本,再导入数据: ```bash ./dimp USERID=SYSDBA/SYSDBA FILE=export.dmp DIRECTORY=/path/to/dir LOG=import.log DATA_ONLY=Y ``` #### 3. **处理编码转换** - 在导入时指定文件编码,避免数据解析错误: ```bash ./dimp USERID=SYSDBA/SYSDBA FILE=export.dmp DIRECTORY=/path/to/dir LOG=import.log ENCODING='PG_UTF8' ``` - 若数据包含大字段(如`CLOB`),需使用`@'path'`语法处理大对象[^2]。 #### 4. **验证与调试** - **检查导入日志**:通过`LOG=import.log`定位具体报错行。 - **测试环境验证**:先在非生产环境验证参数结构调整的兼容性。 - **错误处理**: - 若报错`-6121:数据精度超出范围`,需进一步扩大字段长度或修改存储方式。 - 若报错与大字段相关,需确认表结构是否包含聚集主键大字段的冲突。 --- ### 最终操作建议 1. **优先调整表结构**:避免修改生产库参数导致服务中断。 2. **编码与参数匹配**:确保导出导入的编码与`LENGTH_IN_CHAR`参数一致。 3. **分阶段导入**:先导入结构(`SQL=Y`),调整后再导入数据(`DATA_ONLY=Y`)[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值