测试环境
操作系统 中标麒麟6
达梦数据库 V8.1
01
问题一 以图形界面
安装数据库软件时报错
现象描述
用图形界面形式安装数据库遇到报错,显示报错信息如下:
[[email protected] mnt]$ ./DMInstall.bin
解压安装程序..........
No protocol specified
Exception in thread "main" org.eclipse.swt.SWTError: No more handles [gtk_init_check() failed]
at org.eclipse.swt.SWT.error(SWT.java:4109)
at org.eclipse.swt.widgets.Display.createDisplay(Display.java:902)
at org.eclipse.swt.widgets.Display.create(Display.java:890)
at org.eclipse.swt.graphics.Device.<init>(Device.java:154)
at org.eclipse.swt.widgets.Display.<init>(Display.java:499)
at org.eclipse.swt.widgets.Display.<init>(Display.java:490)
at org.eclipse.swt.widgets.Display.getDefault(Display.java:1693)
at org.eclipse.swt.widgets.Shell.<init>(Shell.java:260)
at org.eclipse.swt.widgets.Shell.<init>(Shell.java:358)
at org.eclipse.jface.window.Window.createShell(Window.java:487)
at org.eclipse.jface.window.Window.create(Window.java:430)
at org.eclipse.jface.dialogs.Dialog.create(Dialog.java:1089)
at org.eclipse.jface.window.Window.open(Window.java:790)
at com.dameng.install.ui.MainApplication.run(Unknown Source)
at com.dameng.install.ui.MainApplication.main(Unknown Source)
[[email protected] mnt]$
问题原因
当前操作系统的登录用户应该为非dmdba用户,如果在当前会话中启用图形界面需要将图形界面权限放开。
解决方法
切换到root用户后在命令行中输入xhost +,可以使得dmdba可以调用图形界面进行安装。
02
问题二 DM数据库遇到
“无效的表名或视图名”报错
现象描述
在操作DM时遇到报错,错误信息提示为“无效的表或视图名”。无论是查询tab2还是TAB2都是报错。
问题原因
出现这种情况大概率是表名(或是字段名)的大小写问题,这一点需要注意,因为dmserver处理的字段名都是默认大写,无论是查询还是新建,服务器默认都转为大写储存。当时这种机制设计是为了用户在创建和访问数据库对象时,不需要考虑对象名称的大小写问题,统一用大写的方式处理。若需要用小写或如驼峰式的方式命名,则需要用双引号将需要以原本的方式保存的字符引用在内。
而如果运用管理工具进行对象创建或者修改的时候会将对象名以双引号引用,这时创建的对象名是以原本的大小写形式存储下来的,为了是使得用户输入的形式与实际储存形式一致。在这种情况下会出现如果在管理工具的环境下创建的名称若是以小写输入,会以小写的形式存储下来,而再用命令行进行查询的时候若以相同的小写形式查询,则会出现“无效的表或视图名”的错误出现。
解决方法
在管理界面新建表或是视图或是字段时,使用大写字母。查询时,表名为大写字母例如:select * from TAB2。或是如果确实需要使用小写的表名,可以加上双引号。
例如:select * from test.“tab2”;
为了避免这种问题,在管理工具中创建对象名以大写形式创建,而在用DDL语句创建对象名或者进行查询的时候则抛弃双引号引用的方式。
另外还有一种可能性是数据库中确实不存在所查询的表,需要对于表名进行进一步的确认。
03
问题三 利用DMRMAN备份时
出现“管道连接失败”的错误信息
现象描述
如下图中,备份时出现故障“管道连接失败”是怎么回事,应该如何解决?
问题原因
遇到这种问题时的场景,一般是安装时在完成安装之前没有注册dmap服务,这样的情况下需要去注册并启动dmap服务;也有可能是dmap服务被意外关闭,这种情况下启动dmap服务即可。
解决方法
1、重启dmap服务
若没有注册dmap服务,有三种启动方式可供参考:
1.前台启动dmap
前台启动dmap,在安装路径下的bin目录下,用./dmap即可启动dmap服务,但在前台启动的方式下,关闭启动的当前窗口,dmap即会被关闭。
2.后台启动dmap
以这种方式启动dmap,在关闭当前窗口后dmap服务不会被关闭。
3.通过脚本注册dmap服务,用服务方式启动
利用脚本进行dmap服务注册并启动,在完整的软件安装过程中,在完成安装前原本应该以root身份运行脚本来注册启动dmap的。脚本在$DM_HOME/script/root目录下。
04
问题四 触发器出现无效的伪记录名new
触发器中引用无效的伪记录名
现象描述
我们写触发器的时候,可能会到错误:触发器中引用无效的伪记录名[NEW]
问题原因
是因为我们的触发器逻辑不对
处理方法
例如,我们是希望建立一个 for each row的触发器,
但是我们在触发器的定义中,却写成了for each statment了
这里是相关的例子
有问题的例子:
没有问题的例子:
create or replace trigger trig_a before insert on test
for each row
begin
delete test where v1=:new.v1;
proc_a(:new.v1);
end;
05
问题五 怎么查看达梦数据库字符集
问题描述
想要查看达梦的字符集
解决方法
达梦支持的字符集 UTF-8 、GB18030、EUK
怎么查看字符集
• sql查看 select Unicode
0-->gb18030;
1--->utf8
• 图形化界面工具查看 manager登录数据库后,右键左侧导航栏的根节点,选择管理服务器。在弹出的tab页面中, 有一个条目是对数据库服务器的字符集的说明。
06
问题六 str_to_date这个函数,
达梦不支持吗?可以用什么替代
现象描述
str_to_date这个函数达梦不支持吗?
处理方法
这是Mysql的一个字符串转时间类型的函数。DM没有这个函数,在DM中可以使用 to_data函数代替。对于Mysql转DM的小伙伴,如果碰到难以解决的问题,可以直接百度同类用法,如何迁移到Oracle上执行,把Oracle的用法,直接复用在DM上,一般都可行。使用方式如下:
直接用 to_data 即可。其他都不需要改动。
1.mysql日期和字符相互转换方法
date_format(date,'%Y-%m-%d') ————–>oracle中的to_char();
str_to_date(date,'%Y-%m-%d') ————–>oracle中的to_date();
%Y:代表4位的年份
%y:代表2位的年份
%m:代表月, 格式为(01……12)
%c:代表月, 格式为(1……12)
%d:代表月份中的天数,格式为(00……31)
%e:代表月份中的天数, 格式为(0……31)
%H:代表小时,格式为(00……23)
%k:代表 小时,格式为(0……23)
%h:代表小时,格式为(01……12)
%I:代表小时,格式为(01……12)
%i:代表分钟, 格式为(00……59) 【只有这一个代表分钟,大写的I 不代表分钟代表小时】
%r:代表 时间,格式为12 小时(hh:mm:ss [AP]M)
%T:代表 时间,格式为24 小时(hh:mm:ss)
%S:代表 秒,格式为(00……59)
%s:代表 秒,格式为(00……59)
2.例子:
select str_to_date(‘09/01/2009','%m/%d/%Y')
select str_to_date(‘20140422154706','%Y%m%d%H%i%s')
select str_to_date(‘2014-04-22 15:47:06','%Y-%m-%d %H:%i:%s')