1.jdbc连接DM报错SSL环境错误

修改dm.ini的ENABLE_ENCRYPT=0 重启服务生效

2.DM数据库运维常用sql

查询数据库版本

select * from v$version;

查询服务器信息

select * from v$SYSTEMINFO;

查询会话连接数

select * from v$sessions;

select count(*),state from v$sessions group by state;

select count(*),clnt_ip from v$sessions group by clnt_ip;

查看数据库服务器配置参数

select * from v$dm_ini;

3.DM7安装注意事项
为了您的数据安全,安装设置密码时建议将密码设置为大于6位数,当前版本可能会因此导致不能创建数据库,后期版本会给予更友好的提示。

4.DM7是如何实现分页的?
DM7支持top、limit和rownum三种分页方式

5.DM7后台服务说明
DMservice服务是数据库核心服务
DMAMON服务是审计服务,用来做审计。
DMJMON服务是代理服务,用来做作业调度。
DMWMON服务是数据守护服务,用来做主备。

6.DM7 JDBC编程注意事项
// 定义DM JDBC 驱动串
String jdbcString = "dm.jdbc.driver.DmDriver";
// 定义DM URL 连接串
String urlString = "jdbc:dm://localhost:5236";

7.命令行工具disql使用说明:
--查看帮助:
disql help

--登录
disql SYSDBA/SYSDBA

--注意事项:dm7密码是大小写敏感的

8.如何修改表名

alter table WE_EFFORT ALTER SCOPE_ENUM_ID1 rename to SCOPE_ENUM_ID;

9.达梦数据库支持JPA中实体类保存和更新操作吗?
怎么调用persist方法就会报出下面的异常
Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1

解决办法:修改dm.ini配置文件,将BATCH_PARAM_OPT 参数改为0,重启即可

10.如何查询当前用户下所有的表名?
select NAME from sysobjects where "SUBTYPE"='UTAB' AND SCHID=(SELECT ID FROM sysobjects WHERE NAME=USER AND TYPE='SCH');

11.有开源的客户端工具可以连DM么?

基于JDBC的工具就可以,比如:SQuirrel SQL、DbVisualizer
12.java.sql.SQLException: 语句句柄个数超上限(1024)或系统内存不足 错误如何处理?

原因:不申请新的session,不停地申请语句句柄,超过了每个session可用语句句柄数的上限

解决办法:
治本:修改应用程序,每个语句句柄用完后,将句柄关闭
指标:修改dm.ini参数,提高session可用语句句柄的上限
max_session_statement由100改为1000

13.安装在oracle linux 5.5_64位上安装DM7,初始化库的时候报错:
Extract install files..........
java.lang.UnsatisfiedLinkError: /tmp/DMInstall/source/bin/libdmutl.so: /tmp/DMInstall/source/bin/libdmutl.so: ELF file OS ABI invalid

原因:官网提供的达梦数据库版本是基于REDHAT6的,oracle linux5.5的内核版本过低,建议使用2.6.32以上内核的linux版本。

  1. DM7在初始化库的过程中需要注意哪几个重要参数?
    (1) 页大小(page_size)
    除去Clob、Blob等大字段外,数据库中一行记录的所有字段的实际长度的和不能超过页大小的一半。
    建议页大小设置为16K,防止在后期进行数据迁移和开发过程中出现记录超长的问题;
    (2) 日志文件的大小(log_size)
    数据库redo日志文件的大小,单位为M,正式环境日志文件的大小一般设置为2048;
    (3) 字符串比较大小写敏感(case_sensitive)
    默认为大小写敏感的,根据具体情况进行设置。迁移实施中如果原始库为Oracle和DB2数据库的话
    需设置为大小写敏感,若为SQL Server和MySQL数据库则需设置为大小写不敏感,所以在数据库
    初始化库的过程中需要根据具体情况来选择。
    注意事项:
    在开发环境和测试环境的页大小、字符串大小写敏感等初始化参数一定要保持一致,避免使用.bak文件进行
    还原的时候,因为初始化参数不一致导致无法还原的问题。所以在初始化库之前务必规划好上述参数,因为
    页大小和字符串比较大小写敏感这两个参数一旦初始化完成,后期无法修改。如需修改,则只能删掉现有实例
    重现初始化新的实例。
    总结:
    数据库在安装的过程中基本上就是下一步下一步,按照默认选项安装就好,安装路径根据自己的要求选择。
    当数据库安装完成,在使用数据库配置助手dbca工具初始化库的过程中,其它步骤按照默认选项下一步即可,
    当到这个页面时需要注意以下三个参数的设置,其它参数如无特殊要求按照默认选项就好。

  2. 何为字符串比较大小写敏感?
    关于字符串比较大小写敏感主要涉及到两个方面的内容:
    (1) 对字段的值比较而言
    假如表Test中有如下两条记录
    c1 c2
    1 a
    2 A
    同样的查询语句:select * from Test where c2 = 'a';
    在大小写不敏感的库中会查出如下的两条记录
    c1 c2
    1 a
    2 A
    而在大小写敏感的库中则只会查出如下的一条记录
    C1 C2
    1 a
    (2) 对于表名、字段名而言
    在设置为大小写敏感的库中进行查询的时候,可能经常会遇到无效的表名或列名的问题,
    下面针对这种情况进行说明。
    (i) 如果使用DM管理工具图形界面建表的话建议表名和字段名都使用大写。因为使用图形界面建表相当于
    使用语句建表的时候加了双引号的,会固定住大小写。如果写成小写,那么就是小写了,在查询的时候
    也需要加双引号,否则就有可能报无效的表名或列名的问题,比较麻烦;
    (ii) 如果使用脚本建表的话,如果表名和字段名没有加双引号的话都会被系统自动转换成大写。
    如:create table test(a int);系统会自动把表名test,字段名a转换成大写,处理方式与Oracle数据库一致。
    所以针对大小写敏感的库,在使用建表脚本或者通过查询脚本进行查询的时候建议统一不要写双引号,
    让系统统一自动都转化为大写;
    (iii) 以上两点主要针对大小写敏感的库而言,大小写不敏感的库则不存在上述问题。
    总结:基于以上两点,在初始化数据库的过程中就可以对字符串比较大小写敏感这个参数做出合理的选择了。

  3. DM7是否需要设置所谓的外网IP?
    DM7是不需要设置外网IP的,只要网络畅通,相应端口(默认端口为5236)开放的情况下就可以访问。

  4. DM7是否支持增量备份?第三方管理工具是不是好用些?
    DM7支持增量备份,详细内容请参考DM_DBA.pdf手册的第31章 备份和还原的相关章节。
    个人觉得数据库本身自己做的增量备份肯定比所谓的第三方工具更稳定可靠。

  5. DM7数据库管理员SYSDBA用户的密码忘记了能否找回?
    (1) 原则上数据库管理员SYSDBA用户的密码忘记了是无法找回的;
    (2) 极个别特殊的情况可能需要通过研发从源码层面进行修改,从而跳过密码认证这块;
    温馨提示:
    (1) 数据库管理员SYSDBA密码修改后一定要牢记,默认密码为SYSDBA(密码严格区分大小写)。

    (2) 如果数据库中还有其它的用户,可以尝试在数据迁移工具DTS中使用其它用户登录,把数据库中 相关用户的数据迁移到新的实例对应的用户中。

  6. DM7如何判定当前库中一个表是否存在?
    可以通过查询DBA_TABLES或ALL_TABLES,如果要查询某个用户下某个表是否存在,可以通过OWNER列进行限定。
    如:查询用户TEST下是否存在表TAB,SQL脚本如下
    select * from DBA_TABLES where owner = 'TEST' and table_name = 'TAB';
    注:
    (1) 关于DBA_TABLES中每个字段的具体含义可以参考DM_DBA.pdf手册_附录3 ORACLE兼容视图;
    (2) 为了提高 DM7与ORACLE 的兼容性,DM7提供了较为丰富的与Oracle兼容的视图。

  7. DM7如何配置归档?
    DM7配置归档的详细操作步骤如下:
    (1) 打开dm.ini中的归档开关:ARCH_INI=1;
    (2) 在数据文件目录data/DAMENG下配置dmarch.ini,内容如下:
    [ARCHIVE_LOCAL1]
    ARCH_TYPE = LOCAL #归档类型 LOCAL/REALTIME
    ARCH_DEST = d:\dmdbms\data\DAMENG\ARCH #归档目标路径(注意实际路径)
    ARCH_FILE_SIZE = 1024 #单个归档文件大小,单位Mb,缺省128M
    ARCH_SPACE_LIMIT = 10240 #REDO日志归档空间限制,单位为Mb,0表示无限制
    (3) 重启数据库服务器
    完成上述三步则就完成了DM7归档的配置。
    关于每个参数具体含义介绍:
    (i) ARCH_TYPE 归档类型,对于单机的数据库配置归档而言,基本就是本地归档(LOCAL),如果涉及到DM7
    其它集群的配置时,则会涉及到其它的归档类型;
    (ii) ARCH_DEST 归档目标路径,一般专门新建一个归档文件夹存放归档文件,这样产生的归档文件就会放到
    该归档文件夹中;
    (iii) ARCH_FILE_SIZE 单个归档文件的大小,数据库在运行的过程中会产生归档文件,当单个归档文件的大小
    达到1024M时,系统会自动切换写下一个归档文件;
    (iiii) ARCH_SPACE_LIMIT 归档空间限制,首先需要说明的一点就是归档文件是循环写的,上面已经提到了当
    单个归档文件的大小达到1024M时,系统会自动切换写下一个归档文件。随着系统的运行归档日志文件
    会越来越多,当达到归档空间限制之后,系统会自动删除老的归档文件。而关于这个归档空间限制的大小
    一般需要结合备份策略来考虑,基本的设置的原则是至少要能够容纳下2~3个全库全库备份间的所有归档。

  8. DM7如何屏蔽保留字?
    方法一:双引号法
    这个一般可以用来处理建表语句中的保留字冲突,如表名或者字段名是DM7的保留字。这种方法一般可以
    快速地绕过问题,但是对于大小写敏感的库,这种用双引号的方法会固定死字段大小写,对于小写的字段,
    可能会带来无效的表名或者列名的问题。
    方法二:dm.ini中的参数设置
    在dm.ini中有个参数EXCLUDE_RESERVED_WORDS,这个参数可以用来屏蔽你想要屏蔽的保留字,将需要屏蔽
    的保留字写在=号后面,然后以逗号分隔。设置在dm.ini中的好处就是一旦设置,永久生效而且对所有客户端都有效,
    这样就不需要在所有客户端系统中进行专门配置。但是设置在dm.ini中之后,这个保留字就永久性失效了,哪怕你想
    通过manager客户端工具在本地连接也没用了。而且该方式还存在一个隐患就是由于屏蔽掉了一些系统的保留字,
    所以可能会导致系统的一些功能无法正常使用。
    建议:
    在移植过程中遇到DM7的保留字,最好的处理方式还是对这些保留字进行修改,尽量不要使用DM7的保留字。

  9. 在安装DM7的过程中出现错误 ELF file OS ABI invalid 该如何解决?
    解决办法:报这个错误说明安装的数据库版本与操作系统版本不匹配,需找我们商务人员重新申请相匹配的数据库版本。

  10. 使用DM7时如何进行导入导出?
    建议通过命令行的方式进行导入导出。详细可参见:DM_DBA.pdf手册 第31章 备份和还原 中逻辑备份和逻辑还原的
    相关章节。

  11. DM7如何关闭一个session?
    可以通过调用一个系统函数SP_CLOSE_SESSION来关闭一个session。
    函数定义:
    VOID SP_CLOSE_SESSION(SESSION_ID INT)
    功能说明:
    停止一个活动的会话
    参数说明:
    SESSION_ID:会话 ID
    举例说明:
    SP_CLOSE_SESSION(510180488);

  12. DM7有类似于Oracle的AWR分析报告吗?
    有的,详细请参考DM_SQL.pdf手册中 21.25 DBMS_WORKLOAD_REPOSITORY包中的相关内容和示例说明。

  13. Oracle中raw类型在DM7中可以用哪种类型代替?
    Oracle中raw类型在DM7中可以使用varbinary代替。

  14. 如何扩展数据库的redo日志?
    调整数据库redo日志的大小,如将2个redo日志都扩展到2G(注意redo日志的实际路径)。使用SYSDBA用户登录,
    然后执行如下脚本:
    alter database resize logfile 'D:\dmdbms\data\DAMENG\DAMENG01.log' to 2048;
    alter database resize logfile 'D:\dmdbms\data\DAMENG\DAMENG02.log' to 2048;

  15. DM7数据库如何进行卸载?
    在使用DM7的过程中,有时候我们可能需要卸载DM7后重新安装新的数据库版本,下面简单讲述如何正常卸载
    DM7数据库。
    前提条件:在进行卸载达梦数据库之前,先正常关闭达梦数据库。
    Windows环境:
    方法1:在Windows的 开始 -> 所有程序 -> 达梦数据库 -> 卸载;
    方法2:在达梦数据库的安装目录,如D:\dmdbms目录下可以看到达梦数据库的卸载程序uninstall.exe,双击该
    程序也可以完成卸载。
    注意事项:先保证达梦数据库处于关闭状态然后再进行卸载,否则Windows服务窗口中达梦数据库注册的一些服务和
    注册表中的一些信息可能无法正常删除,这样可能会给下一次的安装带来麻烦。
    Linux环境:
    方法1:图形界面卸载
    如果可以直接接触Linux服务器的桌面,在桌面上会有一个DMDBMS的文件夹,里面也有卸载的图标,
    双击即可完成卸载,与Windows的界面风格完全一致;
    方法2:字符界面卸载
    在达梦数据库的安装目录,如/opt/dmdbms目录下有一个卸载脚本uninstall.sh,在Linux终端中执行命令
    ./uninstall.sh -i 即可以字符界面完成对达梦数据库的卸载。
    注意事项:先保证达梦数据库处于关闭状态然后再进行卸载。

  16. DM7存储过程和语句块中如何进行打印? begin
    print '使用print语法打印';
    end;

--使用dbms_output包打印首先需要创建系统包:
SP_CREATE_SYSTEM_PACKAGES(1);
--然后开启这个打印的包:
dbms_output.enable;

begin
dbms_output.put_line('使用dbms_output包语法打印');
end;

30.linux系统下 达梦数据库设置为开机自启动怎么设置?

修改启动脚本,将DM启动脚本DmServiceXXXXX 移到/etc/init.d下,chkconfig DmServiceXXXXX on

确认此数据库能以dmdba用户正常前台启动后(必须步骤),操作步骤如下:

第一步:复制数据库实例服务脚本dmserverd,命名为DmInstanceServiceDAMENG并修改,修改path值为dm.ini路径(必须),dm_home设置为dm主程序安装路径(必须),svc_porg设置为数据库实例名(可选推荐)。

第二步:将脚本DmInstanceServiceDAMENG 复制到 /etc/rc.d/init.d 目录下。

|

cp /opt/dmdbms/bin/DmInstanceServiceDAMENG /etc/rc.d/init.d/DmInstanceServiceDAMENG

|

第三步:赋予服务脚本DmInstanceServiceDAMENG 可执行权限。

|

chmod 777 /etc/rc.d/init.d/DmInstanceServiceDAMENG

|

第四步:注册 DM实例服务并配置开机自动启动。

|

chkconfig --add DmInstanceServiceDAMENG

chkconfig DmInstanceServiceDAMENG on

chkconfig --list DmInstanceServiceDAMENG

|

第五步:后台启动达梦数据库实例服务,查看服务状态,关闭实例服务。

|

service DmInstanceServiceDAMENG start

service DmInstanceServiceDAMENG status

service DmInstanceServiceDAMENG stop

|

31.如何使用SQL插入BLOBcreate or replace directory utllobdir as 'C:\alipay'; --你的BLOB文件所在位置。
create table bfile_tab (bfile_column BFILE);
create table t (blob_column BLOB);

declare
a_blob BLOB;
a_bfile BFILE := BFILENAME('UTLLOBDIR','test.jpg');
begin
insert into bfile_tab values (a_bfile)
returning bfile_column into a_bfile;
insert into t values (empty_blob())
returning blob_column into a_blob;
dbms_lob.fileopen(a_bfile);
dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
dbms_lob.fileclose(a_bfile);
commit;
end;
要较新的版本才支持 32.没有bool类型怎么办?
用bit类型就好

33.使用WINDOWS系统时,原本在DM服务查看器里面可以看到的数据库服务怎么没了呢?

基本上,都是由于杀毒软件删除了服务导致的,请重新注册服务,然后关闭360

34.达梦数据库的数据文件最大可以多少?

受操作系统和文件系统限制

35.使用达梦管理工具访问DM数据库,在使用图形化工具查看数据库对象时,报错“非法的基类名”,“无效的列名”等。

一般发生在客户端工具与服务器版本差别很大时,需要更新到客户端与服务器版本相同。

36.DM7字符串连接符号是?

使用||进行字符串连接

37.如何替换KEY文件

将key文件拷贝到DM的安装目录下的bin目录下,改名并替换掉原本的dm.key。然后重启服务。

38.DM7查表必须要 表空间.表名 是怎么回事?

使用某一个用户登陆时,访问该用户的默认表空间里的表时,不需要带表空间名。

39.如何切换模式?

set schema XXX

40.为什么我的对象名写的是对的,查询时还报找不到对象呢?

一般出现这种情况,是因为你的对象名是小写的,而DM在执行SQL时自动将所有小写字符转化为了大写。解决方法是将小写字符用双引号“”包起来。或是所有对象名都使用大写。
41.标度和精度有啥区别?

精度指数字的位数。 标度指小数点后的数字位数。 例如,数 123.45 的精度是 5,标度是 2。
42.想要存储年月日和时分,使用什么数据类型?

Datetime
43.数据库还原时,报XX参数不匹配

一般是字符大小写敏感、页大小这两个参数不匹配。重新初始化一个参数与做备份的实例相同的实例即可。
44.我的TEMP表空间为什么这么大? 当用户的 SQL 语句需要磁盘空间来完成某个操作时,DM 数据库会从 TEMP 表空间分配临时段。如创建索引、无法在内存中完成的排序操作、SQL 语句中间结果集以及用户创建的临时表等都会使用到 TEMP表空间。 如果你的TEMP表空间很大,那说明你的业务当中存在很多急需优化的SQL。TEMP表空间在重启后会释放掉,也可以手动回收。

45.DM配置UNIXODBC及PERL通过ODBC连接DM。有另外一个帖子解释的很详细:http://www.itpub.net/thread-1824202-1-1.html

DM 配置unixODBC以及Perl通过ODBC连接DM 配置unixODBC以及Perl通过ODBC连接DMDM 配置unixODBC以及Perl通过ODBC连接DM

46.达梦中的一个SQL有没有唯一的ID?

V$SQL_PLAN里查看SQL_ID

47.达梦的密码策略?

通过DM.INI里的参数:PWD_POLICY设置系统默认口令策略。0: 无策略;1: 禁止与用户名相同;2:口令长度不小于 9;4:至少包含一个大写字母(A-Z);8 :至少包含一个数字(0-9);16:至少包含一个标点符号(英文输入法状态下,除“和空格外的所有符号;若为其他数字,则表示配置值的和,如 3=1+2,表示同时启用第 1 项和第 2 项策略。当 INI参数COMPATIBLE_MODE=1 时,PWD_POLICY 的实际值均为 0
48.DM.INI介绍
每创建一个 DM 数据库,就会自动生成 dm.ini。dm.ini 是 DM 数据库启动所必须的配置文件,通过配置该文件可以设置 DM 数据库服务器的各种功能和性能选项,主要的配置内容见DBA手册。
参数分为动态参数与静态参数,动态参数可以通过SP_SET_PARA_VALUE函数直接修改并生效

49.导入DMP文件时的常见问题
a)中文乱码。一般是由于导出与导入时的字符集的环境变量不同。使用命令行dimp命令导入,并在执行dimp前先执行export LANG=...将当前字符集调整的和导出时的一样
b)报各种初始化参数不一致的警告(CASE_SENSIVE参数不匹配、页大小不一致等)。导出的库与导入的库的初始化参数不一致时会出现这些错误。
c)XX对象已存在。提示已经很明确了。

50.删除表空间时提示“试图删除已经使用的表空间”?

提示已经很明确了,把表空间里的表删掉吧

51.关于VARCHAR类型的长度的限制。
VARCHAR类型字段的长度问题,是在异构数据库迁移时非常常见的一个问题。
DM的VARCHAR字段的最大长度与“页大小”这一参数有关。在建库时指定,之后无法修改。
4K的1900,8K的3900,16K的8000,32K的8188

52.DM7创建DBLINK简要说明。

53.关于拆分字符串,可以参考下面的例子:
create table test_wm(c1 int,c2 varchar(100),c3 varchar(100));

insert into test_wm values(1,'3,2,4,5','no');
insert into test_wm values(2,'5,1,1+2','yes');

select C1,C3,regexp_substr(C2,'[^,]+',1,level) son,LEVEL
from test_wm
CONNECT BY LEVEL<=REGEXP_COUNT(C2,',')+1 and prior C1=C1 and prior dbms_random.value() is not null;

54.JAVA外部函数的调用方法。

a.先生成一个JAVA包,放到某个目录下,我们假设放在了E:\test.jar
b.执行SQL:
CREATE OR REPLACE FUNCTION MY_INT(a int, b int)RETURN intEXTERNAL 'e:\test.jar' "test.testAdd" USING java;
注意类名和函数名区分大小写
c.然后就可以调用外部函数了select MY_INT(1,2);

55.为啥我查询时,有过滤条件,也建了索引,但它就是不走索引?
注意两点:
数据分布、统计信息
很多时候,统计信息不全会导致优化器计算执行代价的时候算错,误认为走索引会比全表慢,造成执行计划不对。
统计信息的收集方法:
某用户下的所有索引:
DBMS_STATS.GATHER_SCHEMA_STATS('SSCKF',100,TRUE,'FOR ALL INDEXED SIZE AUTO');

某用户下所有字段(包括索引):
DBMS_STATS.GATHER_SCHEMA_STATS('SSCKF',100,TRUE,'FOR ALL COLUMNS SIZE AUTO');
某表下的所有字段:
DBMS_STATS.GATHER_TABLE_STATS('SSCKF','FO_ACCOUNTBILL',null,100,TRUE,'FOR ALL COLUMNS SIZE AUTO');

收集某一列的统计信息
sp_col_stat_init('JXWOA','OA2_RECEIVEDOC','RD_STATE');
sp_col_stat_init('JXWOA','OA2_SENDDOC','SD_STATE');

有个朋友自己做了10W条测试数据,然后写了个SELECT * FROM T WHERE C='A';这样的测试语句。
但这10W条数据全是一样的,怎么可能走索引。
修改测试数据的脚本,让C这个字段的值平均分布在1~1000上,做完后收集统计信息,就走索引了。

  1. DM7如何查看建库时的字符集?
    select unicode();
    --根据返回值进行判断
    0 表示 GB18030,1 表示 UTF -8,2 表示 EUC -KR

57.更新数据的时候提示记录超长是什么原因?
这是因为达梦里面一个表中所有的列(大字段除外)的长度加起来不能超过页大小的一半。
比如安装时页大小为8k,那么一行记录的长度除大字段外所有列加起来不能超过4k
select page(); --8192
create table test(c1 int,c2 varchar(2000),c2 varchar(2000),c2 varchar(2000)); --可创建成功
insert into test values(1,LPAD('a',2000),'a','a'); --未超过4k,可以插入成功
insert into test values(2,LPAD('a',2000),LPAD('a',2000),'a'); --超过4k,报错:记录超长
update test set c3=LPAD('a',2000) where c1=1; --更新操作导致记录超长,报错br/>58、有时候密码包含了@等特殊字符导致disql无法直接连接和运行。需要通过转移符来处理。disql转义符使用如下
1) linux下,需要使用双引号将密码包含进来,同时外层再使用单引号进行转移,具体例子如下:
./disql SYSDBA/' "abcd@efgh" '@localhost
2) windows下,需要使用双引号将密码包含进来,同时对双引号使用\进行转移,具体例子如下:
disql SYSDBA/"abcd@efgh"@localhost