文档地址
# 达梦技术相关文档
https://eco.dameng.com/document/dm/zh-cn/start/
# DM8 安装手册
https://eco.dameng.com/document/dm/zh-cn/pm/installation-introduction.html
# Centos7安装DM8(本地文档)
https://www.cnblogs.com/rbcd/articles/18563615
忘记管理员密码重置
--达梦数据库启动:
/usr/openv/dmdbms/bin/dmserver /usr/openv/dm7data/DAMENG/dm.ini -noconsole
在文件中/usr/openv/dm7data/DAMENG/dm.ini最后追加配置:ENABLE_LOCAL_OSAUTH=1
--重启
service DmServiceDMSERVER restart
--使用无密码连接
/usr/openv/dmdbms/bin/disql / as sysdba
--修改管理员密码
ALTER USER SYSDBA IDENTIFIED BY "123456";
--还原配置重启
启动命令
# 1.Linux 服务方式
在/etc/rc.d/init.d中有名称为DmService开头的文件,文件全名为DmService+实例名(例:如果实例名为DMSERVER,则相对应的服务文件为DmServiceDMSERVER)。
以实例名为DMSERVER为例,在终端输入./DmServiceDMSERVER start 或者 service DmServiceDMSERVER start 即可启动DM数据库。
# 2.命令行方式
在终端进入DM安装目录下的bin目录,执行./dmserver启动DM数据库,参数选项同Windows DM Service Viewer
# 3.命令启动
nohup dmdba/bin/dmserver dmdba/dmdata/DAMENG/dm.ini -noconsole > /dev/null 2>&1 &
# 4.图形界面查看、启动数据库
/dm8/dmdbms/tool/dmservice.sh
# 5.在修改dm文件dm.ini时,使用dm自带的命令启动
/appdata/dmdba/dmdbms/bin/DmServiceDMSERVER stop
/appdata/dmdba/dmdbms/bin/DmServiceDMSERVER start
数据迁移问题
-- pg->dm
-- 1、报记录超长错误时
需要临时解决:把长字段类型varchar改成text类型
-- 2、报varchar长度超限时,需要增加长度
对于varchar类型,pg和达梦对汉字的占用空间不一样,例如:1个汉字在pg占用1个长度,在达梦需要占用3个长度;
字典表
从数据库维护的角度来说,尤其对于初学者最重要也是最需要熟悉掌握的数据字典和动态视图有3个,
分别是 SYSOBJECTS ,V$DYNAMIC_TABLES,和V$IFUN 。
第一个,SYSOBJECTS,记录系统中所有对象的信息
第二个,V$DYNAMIC_TABLES视图,可以通过查询V$DYNAMIC_TABLES 获得所有的动态性能视图名称。
第三个,V$IFUN ,显示数据库提供的所有函数
常用命令
create table AAA.ABCDE as select * from "AAA"."ABC"; --备份表(包含表结构及数据,不包含主键、索引)
复制表数据
insert into A(id, name) select id,name from B
更新表数据
update A set update_c_name = (select id from B where rel_id=A.rel_id)
where rel_id in(select id from C where id = 1)
SELECT lower(RAWTOHEX(sys_guid())) FROM dual; --利用SQL语句生成UUID
select * from v$instance; --查看数据库实例状态
alter database mount; --从open状态切换到mount状态
alter database suspend; --从open状态切换到suspend状态
alter database open; --从mount状态切换到open状态
select * from v$version; --查询版本号
create user "userName" IDENTIFIED BY "123456"; --创建用户
alter user "userName" IDENTIFIED BY "123456"; --修改用户密码
drop user "userName" cascade; --级联删除用户
--给用户授权
grant dba to userName;
grant soi to userName; #授权具有查询系统表的权限
grant create table to userName;
grant create view to userName;
grant create procedure to userName;
grant create sequence to userName;
grant create trigger to userName;
grant create index to userName;
grant create context index to userName;
grant create package to userName;
--撤回用户权限
revoke dba from userName;
revoke soi from userName;
revoke create table from userName;
revoke create view from userName;
revoke create procedure from userName;
revoke create sequence from userName;
revoke create trigger from userName;
revoke create index from userName;
revoke create context index from userName;
revoke create package from userName;
连表更新语法
UPDATE dept_info d
SET url_type = url_type + 1
FROM user_info o
JOIN sys_info p ON o.sid = p.id
WHERE d = o.user_id
AND p.category = 'VIP'
UPDATE t_user
SET age = (SELECT AVG(age) FROM t_user WHERE id IN (1, 2, 3))
WHERE id = 4;
UPDATE dept_info u
SET u.url_type = u.url_type + 1
FROM user_info o
WHERE u.id = o.id and u.id=1
数据库给其他用户授权(V8第版本)
#dm8低版本给用户授权的2种方式
#方式1:把单个对象(表、视图、存储过程)授权给用户
grant <特权> on [<对象类型>] <对象> to <用户或角色>{,<用户或角色>}
#示例
grant select,insert,delete,update on dbName.objectName to userName;
grant all privileges on dbName.objectName to userName;
revoke all privileges on dbName.objectName from userName;
#方式2:把角色授权给用户(角色也需要单个对象授权给角色)
create role <roleName>;
drop role <roleName>;
grant select on dbName.objectName to <roleName>;
grant <角色名>{, <角色名>} to <用户或角色>{,<用户或角色>}
revoke <角色名>{,<角色名>} from <角色名或用户名>
内置函数的应用
TO_CHAR(SYSDATE(), 'YYYY-MM-DD HH24:MI:SS') --日期转换字符串
TO_DATE('2024-11-15 16:33:47','YYYY-MM-DD HH24:MI:SS') --字符串转日期
--达梦时间戳转日期时间
select from_unixtime(1681871428), from_unixtime(1681871428,'YYYY-MM-DD'), from_unixtime(1681871428,'YYYY-MM-DD HH24:MI:SS') from dual;
-- 2023-04-19 10:30:28,2023-04-19,2023-04-19 10:30:28
--达梦日期时间转时间戳
select unix_timestamp(SYSDATE) from dual;
--行转列函数1,oracle的函数,默认使用逗号分割,不可更改分隔符,不能排序(高版本会废弃本函数)
wm_concat(user_name)
--行转列函数2,oracle的函数,可以指定分隔符,必须指定排序列(优先使用,效率高些)
listagg(to_char(user_id), '-') within group (order by user_id)
--列传行,达梦未提供,单可以自己创建,如在下面创建的列转行函数regexp_split_to_table
达梦sql查询
--达梦树数据列表查询
--高版本支持添加RECURSIVE,低版本不支持
WITH cte(id,pid,dept_name) AS(
-- 基础情况:选择顶级商品(一级目录)
SELECT id, pid, dept_name FROM meta_dept_info WHERE pid IS NULL AND is_delete='0'
UNION ALL
-- 递归部分:选择每个商品的直接子商品
SELECT t1.id, t1.pid, t1.dept_name FROM meta_dept_info t1
JOIN cte t2 ON t1.pid = t2.id -- 关联到父商品
)
SELECT * FROM cte;
函数的创建
--创建函数语法:
create [or replace] function funName([p1,p2...pn])
return datatype
is|as
--声明变量
begin
--程序块
end
--函数的调式(打印信息)
1、开启打印:DBMS_OUTPUT.ENABLE();
2、添加打印语句:DBMS_OUTPUT.PUT_LINE('abc');
--示例1,条件查询一条数据
CREATE OR REPLACE FUNCTION fun_name_1(p1 varchar)
RETURN varchar
AS TypeName varchar;
BEGIN
select dict_name into TypeName from tableName where name=p1;
return TypeName;
END;
--示例2,创建炸裂函数,即行转列函数,如字符串a,b,c,c会变成4列记录
create or replace TYPE type_name_record IS RECORD(name varchar);
create or replace TYPE type_name_table IS table of type_name_record;
CREATE OR REPLACE FUNCTION regexp_split_to_table(strIn varchar, delim varchar)
RETURN type_name_table
AS v_tab type_name_table; new_delim varchar;
BEGIN
new_delim = concat('[^',delim,']+');
SELECT regexp_substr(strIn, new_delim, 1, level) as name bulk collect into v_tab FROM dual
CONNECT BY regexp_substr(strIn, new_delim, 1, level) IS NOT NULL;
return v_tab;
END;
--示例3,本函数应用到了列转行,行转列函数
CREATE OR REPLACE FUNCTION fun_name_3(userId varchar)
RETURN varchar
AS UserName varchar;
BEGIN
select listagg(to_char(g.user_name), ',') within group (order by g.user_id) INTO UserName
from (SELECT p.user_name,p.user_id from tableName p
where p.user_id in (select * from table(regexp_split_to_table(USERID,','))))g;
return UserName;
END;
--示例4,函数的含义:给定字符串('a,b,c,d'),以逗号分隔后,取第几个
CREATE OR REPLACE FUNCTION split_part(strIn varchar, delim varchar, indexOf int)
RETURN varchar
AS strOut,new_delim varchar;startNo int;
BEGIN
startNo = indexOf - 1;
new_delim = concat('[^',delim,']+');
SELECT regexp_substr(strIn, new_delim, 1, level) into strOut FROM dual
CONNECT BY regexp_substr(strIn, new_delim, 1, level) IS NOT NULL
limit 1 offset startNo;
return IFNULL(strOut,'');
END;
--调用会返回c
select split_part('a,b,c,d',',',3);
达梦的一些初始化参数设置
declare
v_mem_mb int;
v_cpus int;
mem_per int:=100;
begin
SELECT TOP 1 N_CPU,TOTAL_PHY_SIZE/1024/1024 INTO v_cpus,v_mem_mb FROM V$SYSTEMINFO;
print v_cpus;
print v_mem_mb;
--修改线程数
SP_SET_PARA_VALUE(2,'WORKER_THREADS',v_cpus);
SP_SET_PARA_VALUE(2,'TASK_THREADS',v_cpus/2);
SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',v_cpus/2);
v_mem_mb := v_mem_mb * (mem_per/150.0);
--修改内存
SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY', 90);
SP_SET_PARA_VALUE(2,'MEMORY_POOL', cast(v_mem_mb * 0.015 as int));
SP_SET_PARA_VALUE(2,'BUFFER', cast(v_mem_mb * 0.5 as int));
SP_SET_PARA_VALUE(2,'MAX_BUFFER', cast(v_mem_mb * 0.5 as int));
SP_SET_PARA_VALUE(2,'BUFFER_POOLS', 11);--7,11,19,37,67,101 (4G-128G)
SP_SET_PARA_VALUE(2,'RECYCLE', cast(v_mem_mb * 0.032 as int));
SP_SET_PARA_VALUE(2,'RECYCLE_POOLS', 3);
SP_SET_PARA_VALUE(2,'HJ_BUF_GLOBAL_SIZE', cast(v_mem_mb * 0.0625 as int));
SP_SET_PARA_VALUE(2,'HJ_BUF_SIZE', cast(v_mem_mb * 0.004 as int));
SP_SET_PARA_VALUE(2,'HAGR_BUF_GLOBAL_SIZE',cast(v_mem_mb * 0.05 as int));
SP_SET_PARA_VALUE(2,'HAGR_BUF_SIZE', cast(v_mem_mb * 0.004 as int));
SP_SET_PARA_VALUE(2,'SESS_POOL_SIZE', cast(v_mem_mb * 0.004 as int));
SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE', cast(v_mem_mb * 0.016 as int));
SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE', 10);
SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', 50);
SP_SET_PARA_VALUE(2,'USE_PLN_POOL', 1);
SP_SET_PARA_VALUE(2,'ENABLE_MONITOR', 1);
SP_SET_PARA_VALUE(2,'SVR_LOG', 0);
SP_SET_PARA_VALUE(2,'TEMP_SIZE', 1024);
SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT', 102400);
SP_SET_PARA_VALUE(2,'MAX_SESSIONS', 1500);
SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000);
SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER', 0);
SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0);
SP_SET_PARA_VALUE(2,'OLAP_FLAG',2);
SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1);
SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1);
SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0);
SP_SET_PARA_VALUE(2,'TOP_DIS_HASH_FLAG',0);
SP_SET_PARA_VALUE(2,'TOP_ORDER_OPT_FLAG',1);
SP_SET_PARA_VALUE(2,'COMPATIBLE_MODE', 0);
end;
maven引用
<dependency>
<groupId>com.dm</groupId>
<artifactId>dmjdbc7</artifactId>
<version>1.7.0</version>
</dependency>