达梦数据库管理系统是达梦公司推出的具有完全自主知识产权的高性能数据库管理系统,简称DM。达梦数据库管理系统的最新版本是8.0版本,简称DM8。
DM8采用全新的体系架构,在保证大型通用的基础上,针对可靠性、高性能、海量数据处理和安全性做了大量的研发和改进工作,极大提升了达梦数据库产品的性能、可靠性、可扩展性,能同时兼顾OLTP和OLAP请求,从根本上提升了DM8产品的品质。
下载地址: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"
下载地址: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
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();
}
}
访问可以出结果
在达梦数据库安装目录的tool下有一个dts.exe,双击打开,然后在左侧空白处右击【新建工程】
展开工程后在迁移目录上右击【新建迁移】
输入迁移名称后【确定】
下一步
选择从mysql迁移到dm,继续下一步
填写mysql的地址和用户密码,选择一个需要备份的数据库
填写当前达梦数据库的连接用户和密码
选择模式,点击下一步
选择需要映射的表,下一步
导入后发现有两个错误,也就是达梦无法识别我们mysql中的自增列,这里后续是手动将自增追加上去的
同时注意,将mysql的字段类型映射进达梦后会发生变化,例如mysql中的Double会被映射成Double,但达梦中的Double是只有精度没有标度的,虽然小数仍然是可写的,但这样就损失了强制小数位的约束,而在达梦中只有Number类型才有精度和标度之分,精度就是总的位数,标度就是小数点后保留的位数。再有,mysql中的bigint有时候会在达梦中变成Decimal,目前尚未清楚原因,只知道达梦中的bigint位数和mysql中的不一致,mysql中的bigint长度为20,但达梦中只有19,Decimal才有20的长度。
达梦本身和oracle近似,对于mysql的迁移不是百分百正确,还需要后期手动进行筛查。
使用该方法的前提是导入导出的达梦数据库版本彼此一致
使用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 打印帮助信息
将模式导出为sql仍然需要借助我们的dts迁移工具,我们在之前的工程上再建一个迁移
下一步跳过,迁移选择dm到sql
选择文件路径,指定编码
接下来选择需要被导出的模式
将所有的表全选后下一步导出
得到sql
达梦数据库支持多用户并发访问、修改数据。在实际工作中,有可能出现多个事务同时访问、修改相同数据的情况。具体表现为,达梦执行对应的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的事务。
{{ cmt.username }}
{{ cmt.content }}
{{ cmt.commentDate | formatDate('YYYY.MM.DD hh:mm') }}