第三周技术博客

第三周技术博客

一. 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值