注册
DM8使用过程中的常见问题、产生原因及解决方案
培训园地/ 文章详情 /

DM8使用过程中的常见问题、产生原因及解决方案

青扬 2023/06/14 1861 2 0

DM8使用过程中的常见问题、产生原因及解决方案

1. “-2903: 语句块/包/存储函数中的间隔分区不支持自动扩展”

原因:达梦默认不允许间隔分区表自动扩展
解决方法:将DEL_HP_OPT_FLAG参数修改为4

SQL>SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',4);

测试效果
创建一张源表、一张间隔分区表(目的表)

---创建目的表

create table target
(
id NUMBER not null,
name VARCHAR2(20) not null,
birth DATE
)
partition by range(birth)
interval(numtoyminterval(1,'YEAR'))
(partition p1995 values less than(to_date('1995-01-01','YYYY-MM-DD')),
partition p1996 values less than(to_date('1996-01-01','YYYY-MM-DD')),
partition p1997 values less than(to_date('1997-01-01','YYYY-MM-DD'))
);

---创建源表

create table source
(
id NUMBER not null,
name VARCHAR2(20) not null,
birth DATE,
city VARCHAR2(12)
);

---插入目的表数据

insert into target values(1,'张三','1995-02-06');
insert into target values(2,'李四','1996-02-06');
insert into target values(3,'王五','1997-02-06');

---插入源表数据

insert into source values(1,'新张三','1995-02-06','杭州');
insert into source values(4,'老六','1999-02-06','武汉');
insert into source values(6,'童威','2000-02-06','成都');

---执行测试语句

merge into target a using source b
on (a.id=b.id)
when matched then
   update set a.name='未知'
when not matched then
   insert (id,name,birth) values(b.id,b.name,b.birth);

1间隔分区表报错1.png

---修改DEL_HP_OPT_FLAG参数

SP_SET_PARA_VALUE(1,'DEL_HP_OPT_FLAG',4);

---再次执行测试语句后
1间隔分区表报错2.png

2. 分区列更新将引起分区的更改

原因:分区表对于分区字段默认不允许进行update操作
解决方法:开启该表的row movement属性来允许对分区字段的update操作,再执行update操作后,删除旧分区内的相关数据,在新分区插入数据。

测试效果
---创建一个分区表,并插入数据

create table T20
(
id NUMBER not null,
name VARCHAR2(20) not null,
birth DATE
)
partition by range(birth)
interval(numtoyminterval(1,'YEAR'))
(partition p1995 values less than(to_date('1995-01-01','YYYY-MM-DD')),
partition p1996 values less than(to_date('1996-01-01','YYYY-MM-DD')),
partition p1997 values less than(to_date('1997-01-01','YYYY-MM-DD'))
);

insert into T20 values(1,'张三','1995-02-06');
insert into T20 values(2,'李四','1996-02-06');
insert into T20 values(3,'王五','1997-02-06');

---对该表执行update操作

update T20 set birth = '1998-02-06' where id = '3';

2分区列更新引起分区的更改报错1.png
---开启该表的row movement属性

alter table T20 enable row movement;

---再次执行update操作
2分区列更新引起分区的更改报错2.png

3. 创建序列时提示:无效的序列属性

语句

CREATE SEQUENCE S3 INCREMENT BY 10 START WITH 10 NOMINVALUE NOMAXVALUE CACHE 1;

3无效的序列属性.png
原因:CACHE关键字的值设置错误,CACHE 关键字表示序列的值是预先分配,并保持在内存中,以便更快地访问,并且最小值为2
解决方法:将语句改为

CREATE SEQUENCE S3 INCREMENT BY 10 START WITH 10 NOMINVALUE NOMAXVALUE CACHE 2;

3无效的序列属性2.png

4. 物化视图不自动更新

基表创建语句

create table T20
(
id NUMBER not null,
name VARCHAR2(20) not null,
birth DATE
);

物化视图创建语句

CREATE MATERIALIZED VIEW MV5 REFRESH COMPLETE WITH PRIMARY KEY START WITH 
SYSDATE NEXT SYSDATE + INTERVAL '1' MINUTE AS SELECT * FROM TEST.T20;

原因:可能是因为基表的表结构被改变,导致物化视图变为NEEDS_ COMPILE状态,该状态下需要根据基表的变化重建物化视图。

解决方法
---先查询该物化视图的状态

select * from SYS.USER_MVIEWS where MVIEW_NAME = 'MV5';

4物化视图不自动刷新2.png

---尝试使用CREATE OR REPLACE MATERIALIZED VIEW MV5或ALTER MATERIALIZED VIEW MV5 COMPILE语法都失败了。

---只能先删除该物化视图后再重建。

DROP MATERIALIZED VIEW MV5;
CREATE MATERIALIZED VIEW MV5 REFRESH COMPLETE WITH PRIMARY KEY START WITH 
SYSDATE NEXT SYSDATE + INTERVAL '1' MINUTE AS SELECT * FROM TEST.T20;

---再次查询该物化视图状态
4物化视图不自动刷新3.png

生产环境下物化视图的结构可能会比较复杂并且基表的数据可能会很多,请根据实际情况定夺重建的时机。

5. 建立了索引,查询不生效

原因:如果建立的是单列索引,而使用的时候用了系统函数处理了时间字段,则不会使用建立的索引
解决方法:修改查询SQL,不要使用函数
测试效果
---建立基表,并插入数据

create table T20
(
id NUMBER not null,
name VARCHAR2(20) not null,
birth DATE
);

insert into T20 values(1,'张三','1995-02-06');
insert into T20 values(2,'李四','1996-02-06');
insert into T20 values(3,'王五','1997-02-06');

---创建索引

create index index_T20 on T20(birth);

---查看执行计划
---使用了函数的情况下
5不走索引1.png

---未使用函数的情况下
5不走索引2.png

索引不生效的几种情况:
1、条件列不是索引首列。
2、条件列上有函数或计算。
3、存在隐式类型转换。
4、如果走索引会更慢。
5、没有更新统计信息。

6. 数据库开启审计后,审计日志空间越来越大

解决方法
可以使用函数将过期的物理文件删除,例如指定删除2023-01-01 00:00:00以前的普通审计文件。

SP_DROP_AUDIT_FILE(‘2023-01-01 00:00:00’,0);

或者在管理工具里建立定时删除审计日志文件的作业,例如每周周六23:00执行保留最近30天的审计日志文件函数SP_DROP_AUDIT_FILE(sysdate-30,0)
作业步骤
6定时删除审计日志1.png

作业调度
6定时删除审计日志2.png

7. 刚搭建的数据守护进程正常启动未报错,使用监视器查看主备机的ISTATUS都一直处于mount状态,无法正常提供服务。

原因:该现象的原因可能是主备机的数据库魔术不一致。
解决方法:进行一次备份还原操作,将主库物理备份,还原至备库
假设主机IP为192.168.20.1
备机IP为192.168.20.2

---先使用RMAN备份主库

RMAN> BACKUP DATABASE '/dm8/data/DAMENG/dm.ini' FULL TO BACKUP_FILE1 BACKUPSET '/dm8/backup/BACKUP_FILE_06'

---若提示[-8216]:归档日志不完整,则使用RMAN修复归档日志

RMAN> repair archivelog database '/dm8/data/DAMENG/dm.ini'

---先在备机创建好备份文件夹

[dmdba@kylin-training backup]$ mkdir BACKUP_FILE_06

---在主机的备份文件夹下使用scp方式将备份文件传输给备机,该方式需要输入备机的密码

scp -r *.* 192.168.20.2:/dm8/backup/BACKUP_FILE_06

---备机拿到备份文件后,使用RMAN进行还原、恢复、更新魔术

RMAN> RESTORE DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/BACKUP_FILE_06'
RMAN> RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' FROM BACKUPSET '/dm8/backup/BACKUP_FILE_06'
RMAN> RECOVER DATABASE '/dm8/data/DAMENG/dm.ini' UPDATE DB_MAGIC

---再次启动主备机的数据守护进程,则发现主备机的ISTATUS均恢复OPEN状态

8. 数据守护进程备库RSTAT状态显示为INVAILD,并且主库守护进程一直在OPEN和RECOVERY状态之间切换。

原因:一般情况下如果备库脱离集群的时间不长,主库会进入RECOVERY状态进行修复后使朱备库都恢复OPEN状态。但备库脱离集群的时间太长,使备库无法再追上主库日志。主库反复进入RECOVERY状态试图修复未果,导致了当前的现象。

解决方法:如果主库还在正常提供数据库服务,则建议在应用使用频率不高的时间段将主库进行物理热备,再还原到备库。
备库还原完成后,重新开启守护进程。
主库会再次自动进入RECOVERY状态,修复完成后,主备库均恢复至OPEN状态。

注意:生产环境中一定要有一台确认监视器,用来自动切换主备库,否则无论是主库还是备库异常后,集群都会无法正常提供数据库服务

小细节:

在练习过程中,有一个问题困扰了我好久,并且在网上也查不到解决方法。在麒麟V10操作系统中运行DM8的manager时,始终无法在查询窗口中输入中文。后来发现主要原因是在查询窗口中无法切换输入法,经过一段时间的摸索,发现在查询窗口中按鼠标右键,将”Input Methods”设置为”Fcitx”后就可以切换输入法了。
查询窗口输入中文.png

操作系统版本:
Linux kylin-training 4.19.90-52.15.v2207.ky10.x86_64 #1 SMP Thu Nov 24 21:50:03 CST 2022 x86_64 x86_64 x86_64 GNU/Linux

DM8版本:
DM Database Server x64 V8
DB Version: 0x7000c
1-2-192-2023.01.03-178822-20033-ENT

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服