达梦数据库使用笔记

b.xie

发布于 2022.07.25 16:16 阅读 3814 评论 0

一:达梦数据库安装

达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统的最新版本是8.0版本,简称DM8

DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTPOLAP请求,从根本上提升了DM8产品的品质。

 

1.1 Windows安装达梦

下载地址:https://www.dameng.com/list_103.html

 

 

下载完是iso文件,解压到本地,会有一个安装的说明pdf,跟着走第一步启动setup.exe

 

 

接下来下一步,再接下来也是同意下一步,只要是纯下一步的操作这里就不做说明了

 

 

这里是填写正版激活的key,没有就是试用一年,因此下一步

 

 

默认全选

 

 

安装路径自己更改一下

 

 

安装

 

 

安装后点击完成,开始初始化

 

 

 

开始创建实例

 

 

 

默认高性能,一般用途

 

 

接下来一直到口令管理全是默认下一步,到这里来自定义密码

 

 

实例库点不点都可以

 

 

摘要没什么好设置的,直接完成

 

 

 

连接工具,找安装目录下的tool路径找manager.exe管理工具

 

 

打开后点击左侧输入设置的密码

 

 

查询的话,找到当前登录用户下的表,随便找一个表,右键生成SQL脚本选择Select To到当前SQL编辑器,就会出现对应的语句。

 

 

创建用户

create user dm identified by "dameng123"

 

 

1.2 Docker安装达梦

下载地址:https://www.dameng.com/list_103.html

下载tar包镜像,大小在2G以上,内存最小1G

 

 

下载完成后上传到服务器,使用如下命令导入镜像

docker import dm8_docker.tar dm8:v01

 

启动容器

docker run -itd -p 5236:5236 --name dm8_01 dm8:v01 /bin/bash /startDm.sh

 

通过日志来查看启动情况

docker logs -f  dm8_01

 

 

启动停止一系列命令

docker start  dm8_01 
docker stop  dm8_01
docker restart  dm8_01

 

 

DM数据库连接工具(该工具内嵌在DM数据库中,也就是本地要安装一下DM)进行连接测试,该数据库默认的用户名和密码都是SYSDBA

 

 

 

 

 

二:SpringBoot整合达梦

 

pom

        <!--dm驱动-->
        <dependency>
            <groupId>com.dameng</groupId>
            <artifactId>Dm8JdbcDriver18</artifactId>
            <version>8.1.1.49</version>
        </dependency>

 

yaml

spring:
  datasource:
    driver-class-name: dm.jdbc.driver.DmDriver
    url: jdbc:dm://127.0.0.1:5236/DM
    username: dm
    password: dameng123

 

三层架构跟之前一样,xml中的查询语句也跟mysql差不多,但如果配置文件的url中没有追加模式,则当前用户跟当前模式不一致,则达梦操作的时候需要带上模式名,也就是"DM"."user",如果连接用户跟模式一致则无需

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.springboot.myweb.mapper.DmUserMapper">

    <insert id="insert">
        insert into "DM"."dm_user"("user_username", "user_password")
        VALUES('shark','123123')
    </insert>


    <update id="update">
        update "DM"."dm_user"
        set "user_username" = 'jjk', "user_password" = '123123' where "user_id" = '1'
    </update>


    <delete id="delete">
        delete from "DM"."dm_user" where "user_id" = '4'
    </delete>


    <select id="select" resultType="com.springboot.myweb.pojo.DmUser">
        select "user_id","user_username","user_password" from "DM"."dm_user"
    </select>

</mapper>

 

整一个接口

import com.springboot.myweb.pojo.DmUser;
import com.springboot.myweb.service.DmUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class DmController {

    @Autowired
    private DmUserService dmUserService;
   
    @GetMapping("/dm/select")
    public List<DmUser> select() {
        return dmUserService.select();
    }
   
}

 

访问可以出结果

 

 

 

三:数据迁移

3.1 mysql数据库中的内容迁移到达梦

在达梦数据库安装目录的tool下有一个dts.exe,双击打开,然后在左侧空白处右击【新建工程】

 

 

 

展开工程后在迁移目录上右击【新建迁移】

 

输入迁移名称后【确定】

 

 

下一步

 

 

选择从mysql迁移到dm,继续下一步

 

 

填写mysql的地址和用户密码,选择一个需要备份的数据库

 

 

填写当前达梦数据库的连接用户和密码

 

 

选择模式,点击下一步

 

 

选择需要映射的表,下一步

 

 

 

导入后发现有两个错误,也就是达梦无法识别我们mysql中的自增列,这里后续是手动将自增追加上去的

 

 

同时注意,将mysql的字段类型映射进达梦后会发生变化,例如mysql中的Double会被映射成Double,但达梦中的Double是只有精度没有标度的,虽然小数仍然是可写的,但这样就损失了强制小数位的约束,而在达梦中只有Number类型才有精度和标度之分,精度就是总的位数,标度就是小数点后保留的位数。再有,mysql中的bigint有时候会在达梦中变成Decimal,目前尚未清楚原因,只知道达梦中的bigint位数和mysql中的不一致,mysql中的bigint长度为20,但达梦中只有19Decimal才有20的长度。

 

达梦本身和oracle近似,对于mysql的迁移不是百分百正确,还需要后期手动进行筛查。

 

 

3.2 将达梦的模式导出并导入

3.2.1 dmp格式

使用该方法的前提是导入导出的达梦数据库版本彼此一致

使用select id_code;查看版本号

 

 

在指定模式上右击导出

 

填写信息后导出即可

 

 

导入的话直接模式上右键导入

如果是linux下命令行导入,找到bin下的dimp工具,执行如下命令。(ps:如果服务器上的达梦数据库版本和当前不一致,则使用dimp命令会报错)

dimp 达梦用户名/达梦密码@127.0.0.1:5236 file="/data/test.dmp" 

具体命令可以使用-help查看

[root@ncc-61-19 bin]# ./dimp help
dimp V7.6.1.52-Build(2020.03.17-119193)ENT
格式: ./dimp KEYWORD=value 或 KEYWORD=(value1,value2,...,vlaueN)

例程: ./dimp SYSDBA/SYSDBA IGNORE=Y ROWS=Y FULL=Y

USERID 必须是命令行中的第一个参数

关键字                 说明(默认值)
--------------------------------------------------------------------------------
USERID                 用户名/口令 格式:USER/PWD*MPP_TYPE@SERVER:PORT#SSLPATH@SSLPWD
FILE                   导入文件名称 (dexp.dmp)
DIRECTORY              导入文件所在目录
FULL                   整库导入 (N)
OWNER                  以用户方式导入 格式 (user1,user2,...)
SCHEMAS                以模式方式导入 格式 (schema1,schema2,...)
TABLES                 以表名方式导入 格式(table1,table2,...)
PARALLEL               用于指定导入的过程中所使用的线程数目
TABLE_PARALLEL         用于指定导入的过程中每个表所使用的子线程数目,在FAST_LOAD为Y时有效
IGNORE                 忽略创建错误 (N)
TABLE_EXISTS_ACTION    需要的导入表在目标库中存在时采取的操作[SKIP | APPEND | TRUNCATE | REPLACE]
FAST_LOAD              是否使用dmfldr来导数据(N)
FLDR_ORDER             使用dmfldr是否需要严格按顺序来导数据(Y)
COMMIT_ROWS            批量提交的行数(5000)
EXCLUDE                忽略指定的对象 格式
                           格式 EXCLUDE=(CONSTRAINTS,INDEXES,ROWS,TRIGGERS,GRANTS)
GRANTS                 导入权限 (Y)
CONSTRAINTS            导入约束 (Y)
INDEXES                导入索引 (Y)
TRIGGERS               导入触发器 (Y)
ROWS                   导入数据行 (Y)
LOG                    指定日志文件
NOLOGFILE              不使用日志文件(N)
NOLOG                  屏幕上不显示日志信息(N)
LOG_WRITE              日志信息实时写入文件(N): 是(Y),否(N)
DUMMY                  交互信息处理(P): 打印(P), 所有交互都按YES处理(Y),NO(N)
PARFILE                参数文件名
FEEDBACK               每 x 行显示进度 (0)
COMPILE                编译过程, 程序包和函数... (Y)
INDEXFILE              将表的索引/约束信息写入指定的文件
INDEXFIRST             导入时先建索引(N)
REMAP_SCHEMA           格式(SOURCE_SCHEMA:TARGET_SCHEMA)
                       将SOURCE_SCHEMA中的数据导入到TARGET_SCHEMA中
ENCRYPT_PASSWORD       数据的加密密钥
ENCRYPT_NAME           加密算法的名称
SHOW/DESCRIBE          打印出指定文件的信息(N)
LOCAL                  MPP模式下登录使用MPP_LOCAL方式(N)
TASK_THREAD_NUMBER     用于设置dmfldr处理用户数据的线程数目
BUFFER_NODE_SIZE       用于设置dmfldr读入文件缓冲区大小
TASK_SEND_NODE_NUMBER  用于设置dmfldr发送节点个数[16,65535]
LOB_NOT_FAST_LOAD      如果一个表含有大字段,那么不使用dmfldr,因为dmfldr是一行一行提交的
PRIMARY_CONFLICT       主键冲突的处理方式[IGNORE|OVERWRITE],默认报错
TABLE_FIRST            是否先导入表(N):是(Y),否(N)
HELP                   打印帮助信息

 

 

 

3.2.2 sql格式

将模式导出为sql仍然需要借助我们的dts迁移工具,我们在之前的工程上再建一个迁移

 

 

下一步跳过,迁移选择dmsql

 

选择文件路径,指定编码

接下来选择需要被导出的模式

 

 

将所有的表全选后下一步导出

 

 

 

得到sql

 

 

 

3.3 迁移中可能遇到的问题

达梦数据库支持多用户并发访问、修改数据。在实际工作中,有可能出现多个事务同时访问、修改相同数据的情况。具体表现为,达梦执行对应的sql后直接卡死不动,退出重进后执行语句仍然卡住不动,此时有可能出现了任务阻塞的问题,需要具体分析。

 

首先使用select * from V$LOCK 查看,如果有事务阻塞了,则block一栏会显示1,我这里没有则全部显示0

 

 

如果有事务阻塞了,则需要记住该条数据的TRX_ID,这就是事务id。同时还可以使用select * from V$TRXWAIT查看具体是谁阻塞了谁。(图片源于网络)可以看到ID2323的事务阻塞了,而且是被2319事务阻塞了。

 

 

接着使用select sess_id from V$SESSIONS where trx_id=[阻塞的事务id];查看其session_id

 

 

最后使用SP_CLOSE_SESSION(对应的sess_id);来完成锁的释放,最后记得检查一边是否还存在block的事务。