第三周技术博客
一. dexp和dimp的使用
1.简介
逻辑备份还原是对数据库逻辑组件(如表、视图和存储过程等数据库对象)的备份还原。例如使用 dexp 和dimp 进行的备份还原。逻辑导出(dexp)和逻辑导入(dimp)是 DM 数据库的两个命令行工具,分别用来实现对 DM 数据库的逻辑备份和逻辑还原。
逻辑导出和逻辑导入数据库对象分为四种级别:数据库级、用户级、模式级和表级。四种级别独立互斥,不能同时存在。
- 数据库级(FULL):导出或导入整个数据库中的所有对象。
- 用户级(OWNER):导出或导入一个或多个用户所拥有的所有对象。
- 模式级(SCHEMAS):导出或导入一个或多个模式下的所有对象。
- 表级(TABLES):导出或导入一个或多个指定的表或表分区。
2.参数
dexp 工具需要从命令行启动。在 cmd 命令行工具中找到 dexp 所在安装目录/dmdbms/bin,输入 dexp 和参数后回车。语法如下:
dexp PARAMETER= { PARAMETER= } 或 dexpdp PARAMETER= { PARAMETER= }
dimp与dexp类似。
FILE 用于明确指定导出的文件(可以包含路径),可以包含多个文件,用逗号分隔。可选参数,如果不选用 FILE 参数(来明确指定导出文件名称),那么默认导出文件名称为dexp.dmp。
LOG 用于明确指定导出过程产生的日志文件名称(可以包含路径),可以包含多个文件,用逗号分隔。可选参数。如果不选用 LOG 参数(来明确指定日志文件名称),那么默认导出日志文件名称为 dexp.log。
DIRECTORY 用于指定导出文件及日志文件生成的路径。可选参数,缺省为导出到 dexp所在路径。如果 FILE 和 LOG 参数指定的文件包含生成路径,则 FILE 和 LOG 参数中指定的路径将替代 DIRECTORY 所指定的路径;如果 FILE 和 LOG 参数指定的文件未包含路径信息,则文件将被生成到 DIRECTORY 指定的目录下;如果都没有指定路径,程序将根据当前的运行环境来设置相应的导出路径,一般为当前路径。
3.FULL
FULL 方式导出(导入)数据库的所有对象。语法如下:FULL=Y
例 设置 FULL=Y,导出数据库的所有对象,导出数据库文件和日志文件放在路径/mnt/data/dexp 下。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dexp
例 设置 FULL=Y,导入整个数据库,导入的数据库文件在/mnt/data/dexp,即将生成的日志文件放在/mnt/data/dimp。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log FULL=Y DIRECTORY=/mnt/data/dimp
4.OWNER
OWNER 方式导出(导入)一个或多个用户拥有的所有对象。语法如下:OWNER=<用户名>{,<用户名>}
例 设置 OWNER=USER01,导出用户 USER01 所拥有的对象全部导出。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dexp
例 设置 OWNER=USER01,导入用户 USER01 所拥有的全部对象。导入的数据库文件在/mnt/data/dexp,即将生成的日志文件放在/mnt/data/dimp。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log OWNER=USER01 DIRECTORY=/mnt/data/dimp
5.SCHEMAS
SCHEMAS 方式的导出(导入)一个或多个模式下的所有对象。语法如下:SCHEMAS=<模式名>{,<模式名>}
例 设置 SCHEMAS=USER01,导出模式 USER01 模式下的所有对象。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dexp
例 设置 SCHEMAS=USER01,导入模式 USER01 模式下的所有对象。导入的数据库文件在/mnt/data/dexp,即将生成的日志文件放在/mnt/data/dimp。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log SCHEMAS=USER01 DIRECTORY=/mnt/data/dimp
一般情况下,OWNER 与 SCHEMAS 导入导出是相同的。但是用户可以包含多个模式,在这种情况下 SCHEMAS 的导入导出是OWNER导入导出的一个子集。
6.TABLES
TABLES 方式导出和导入一个或多个指定的表或表分区。导出所有数据行、约束、索引等信息。语法如下:TABLES=<表名>{,<表名>}。和 TABLES 导出有关的参数还有 QUERY、EXCLUDE 和 INCLUDE,都是用来设置过滤条件的。
例 设置 TABLES=table1,table2,导出 table1,table2 两张表的所有数据和信息。
./dexp USERID=SYSDBA/SYSDBA FILE=db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dexp
例 设置 TABLES=table1,table2,导入 table1,table2 两张表的所有数据和信息。导入的数据库文件在/mnt/data/dexp,即将生成的日志文件放在/mnt/data/dimp。
./dimp USERID=SYSDBA/SYSDBA FILE=/mnt/data/dexp/db_str.dmp LOG=db_str.log TABLES=table1,table2 DIRECTORY=/mnt/data/dimp
二.disql的使用
1.简介
DIsql 是 DM 数据库的一个命令行客户端工具,用来与 DM 数据库服务器进行交互。DIsql 识别用户输入,将用户输入的 SQL 语句打包发送给 DM 数据库服务器执行,并接收服务器的执行结果,并按用户的要求将执行结果展示给用户。为了更好地与用户交互和展示执行结果,用户也可以在 DIsql 中执行 DIsql 命令,这些命令由 DIsql 工具自身进行处理,不被发送给数据库服务器。
2.启动
WINDOWS 环境下,有两种启动 DIsql 的方式。第一种是启动安装软件后生成的程序菜单,第二种是启动安装目录下自带的 DIsql 工具。从命令行启动 DIsql 并登录到数据库。在命令行工具中找到 DIsql 所在安装目录D:\dmdbms\bin,输入 disql 和登录方式后回车。
在 DIsql 界面中,使用 LOGIN/LOGOUT 命令登录/退出远程数据库。LOGOUT 命令从登录主库注销会话。断开连接而不退出 DIsql。
如果中含有特殊字符,因为特殊字符在操作系统中需要被特殊处理,因此特殊字符书写的时候需要按照要求的格式。
WINDOWS系统
- DIsql 的关键字符,DIsql 的要求对连接串的特殊字符需要使用双引号括起来"aaaa/aaaa",操作系统的要求需要再在最外加双引号和转义"““aaaa/aaaa””“。
例如:用户名为 user01 , 密 码 为 aaaa/aaaa ,那么连接串要写成: disql user01/”““aaaa/aaaa””"。 - 空格,需要使用双引号括起来作为一个整体(这是操作系统的要求)。
例如:用户名为 user01,密码为 aaaa aaaa ,那么连接串要写成:disql user01/“aaaa aaaa”。 - 双引号,DIsql 要求对双引号需要使用双引号括起来,同时双引号需要转义"aaaa"“aaaa”;操作系统要求再对双引号转义和最外层加双引号"““aaaa””““aaaa””“。
例 如 : 用 户 名 为 user01 , 密 码 为 aaaa"aaaa , 那 么 连 接 串 要 写 成 : disql user01/”““aaaa””““aaaa””"。
LINUX系统
bash 的引号设计为:在单引号中,所有的特殊字符都失去其特殊含义;在双引号中,特殊字符包括:美元符(KaTeX parse error: Can't use function '\)' in math mode at position 14: )、反引号(`)、转义符(\̲)̲、感叹号(!)。如果密码中没有…)、反引号(`)、转义符()、感叹号(!)四个特殊字符,那么在特殊字符之前全部加\转义就好了。例如:
‘aaaa\aaaa’ 传给 disql 为 aaaa\aaaa。
“aaaa’aaaa” 传给 disql 为 aaaa’aaaa。
“aaa’$aaaa” 传给 disql 为 aaa’$aaaa。
DIsql 的要求对连接串的特殊字符需要使用双引号括起来。例如:密码为 aaaa\aaaa,使用双引号括起来"aaaa\aaaa",因为此密码中不含有单引号,根据操作系统的要求直接在最外面加单引号。例如:用户名为 user01,密码为aaaa/aaaa,那么连接串要写成:./disql user01/‘“aaaa/aaaa”’。
单引号+操作系统下的特殊字符,根据操作系统的要求,因为单引号只能放在双引号内,同时双引号中还有一些特殊字符不能被识别需要加反斜杠转义。例如: 用户名为user01,密码为 aaa’ a a a a ,使用双引号括起来,同时对 aaaa,使用双引号括起来,同时对 aaaa,使用双引号括起来,同时对加反斜杠转义。那么连接串要写成:./disql user01/“aaa’$aaaa”。
3.使用disql
以一个简单的查询例子来说明如何使用 DIsql。只需要输入一条 SQL 语句,回车即可。DIsql 将 SQL 语句发送给 DM 数据库服务器并显示服务器返回的结果。例:
SQL>select top 5 name,id from sysobjects;
4.退出
使用 EXIT/QUIT 命令,退出 DIsql。语法如下:EXIT|QUIT
三.ORACLE移植到DM
1.概述
ORACLE 到 DM 的移植主要有以下几个方面的工作:
1.分析待移植系统,确定移植对象。
2.通过数据迁移工具 DTS 完成常规数据库对象及数据的迁移。
3.通过人工完成 PL/SQL 的移植,只需要做少量的修改即可。
4.移植完成后对移植的结果进行校验,确保移植的完整性和正确性。
5.对应用系统进行移植、测试和优化。
2.移植过程
1).待移植系统分析
对待移植系统进行分析,确定需要移植的数据库对象,给出移植列表,给用户确认,作为移植的依据,给出 oracle 的统计脚本。
-
统计oracle 数据库基础信息
–统计页大小
select name,value from v$parameter where name =‘db_block_size’;
–查询编码格式
select * from v$nls_parameters a where a.PARAMETER=‘NLS_CHARACTERSET’;
-
统计 oracle 数据中的对象以及表数据量
–根据指定用户统计用户下的各对象类型和数目
select object_type,count(*) from all_objects where
owner=‘OA8000_DM2015’ group by object_type;
2).准备移植环境
- DM选择合适的版本
- 选择合适的初始化参数
- 严禁在生产环境中直接迁移
3).常规对象及数据迁移
序列对象迁移
常规对象指的是序列、表和视图,都可以通过达梦提供的数据迁移工具从ORACLE 完整的迁移到达梦数据库。
序列对象一般不依赖其他模式对象,而被其他如表、过程所依赖,所以一般迁移过程中,最先迁移序列对象。迁移序列方法:
- 使用 DTS 工具迁移序列,此方法适用于批量迁移序列对象。
- 从源 Oracle 中获取序列定义,在目的库手动执行序列创建,此方法适用所需迁移对象较少,或方法一中迁移出错的序列单独处理。
表对象迁移
对于表比较少,数据量不大的系统,可以通过 DTS 采取一次性迁移。对于表比较多,数据量大的系统,建议先迁移小表再进行大表的迁移,迁移时最好不用快速装载功能。
视图对象迁移
使用 DTS 工具迁移视图,此方法适用于批量迁移视图对象。从源 Oracle 中获取视图定义,在目的库手动创建视图,此方法适用于所需
迁移对象较少,或者对方法一中迁移出错的视图单独处理。
可能遇到的问题及注意点:
- 视图查询对象依赖迁移及权限授予。由于视图查询依赖于相关的表或者其他数据库对象,在迁移视图之前需要首先迁移视图所依赖的对象,并授予视图用户相关对象的权限。
- 由于目的端 DM 视具体架构(单库、MPP)的不同存在对物化视图日志表的支持程度的差异,迁移物化视图时,需要视目的端架构,考虑是否变更物化视图刷新方式(增量刷新改为全量刷新)。
3.处理迁移过程中错误
标度大于精度
Oracle 中 numbe(r m,n)允许 n>m,但是在达梦中是不允许的,达梦中 m>=n,达梦中 m 表示精度,n 表示标度。精度是一个无符号整数,定义了总的数字数;标度定义了小数点右边的数字位数。
连接尚未建立或已经关闭
有可能是因为 Oracle 库中存在非法的数据如:-5486-12-31 00:00:00这样的非法的时间,在批量绑定插入的时候 JDBC 未作校验,服务器端检测到就会把这个连接剔除,就会报这个错误。碰到这种问题建议使用最新的 JDBC 驱动,替换掉迁移工具使用的 JDBC 驱动即可。
序列最大值超出达梦范围
〈最大值〉指定序列能生成的最大值,如果忽略 MAXVALUE 子句,则降序 序 列 的 最 大 值 缺 省 为 -1 , 升 序 序 列 的 最 大 值 为 9223372036854775807(0x7FFFFFFFFFFFFFFF )。非循环序列在到达最大值之后,将不能继续生成序列数;但是 oracle 中最大值 28 个 9,迁移到 DM 时报序列最大值超出达梦范围的错误(最新的 dts 版本已经直接将超过 DM 最大值的序列的最大值转换成9223372036854775807)。
字符串截断
一般从 oracle 迁移到 DM 的时候,出现字符串截断的一般都是字段中含有中文,出现这种问题是因为 DM 初始化的时候选择的字符集是 Unicode(即 utf-8),该字符集的国际标准是一个汉字占 3 个字节,而 oracle 中默认情况下一个汉字占2 个字节。解决方法:
- 在初始化的时候,字符集选择 gb18030
- 是选择 VARCHAR 类型以字符为单位
- 不需要重新初始化数据库即可解决,即在选择迁移方式的时候,选择字符长度隐射关系为 2
记录超长
DM 在初始化的时候,选择的页大小影响后面表每行数据的长度,表每行的长度之和(普通数据类型)不能超过一页大小,如果超过 1 页大小即报记录超长的错误。解决方法:
- 找到表中 varchar 类型比较长的(如 varchar2(8000)这种),修改成text 类型;
- 初始化的时候页大小选择 32k。(对于表中 varchar2 类型较长,并且字段较多的情况不太适合,这种情况采用方法 1 解决。)
违反唯一性约束
这种情况是因为表中设置了唯一性约束或者主键约束,但是数据中有重复记录造成的。这种情况有可能是原始库的约束被禁用了,或者数据重复迁移造成的。
解决办法:在确定源数据没有问题的情况下,迁移的时候选择删除后再拷贝。在迁移界面中,先中要迁移的表,然后点击转换,在弹出的窗口中选择删除后拷贝。
违反引用约束
这种问题主要是由外键约束造成的,父表的数据没有迁移,先迁移了子表的数据。解决办法:
迁移的时候先不迁移外键等约束,在选择好要迁移的表时,点击转换,按照下面步骤迁移。
(1)第一次只选择表定义,不选择约束等
(2)第一次迁移完成后(确保没有错误),第二次只选择数据
(3)第三步选择约束、索引
视图迁移过程中顺序问题:无效的用户对象
这个问题一般是因为在迁移视图之前,没有将视图依赖的表迁移过去。解决办法:
严格按照迁移的顺序,先迁移表,然后再迁移视图、存储过程、函数等的顺序迁移即可。
错误码及错误描述信息的对应
达梦社区地址:https://eco.dameng.com