达梦问题汇总

备份还原

  1. 报错信息:核心已转储

操作背景:根据正式环境数据库参数,在测试环境上建库,将正式环境数据库进行在线备份后的备份集传到测试环境,最后在测试环境上利用该备份集进行还原。还原操作成功,恢复时报”核心已转储”,清缓存和重启服务器后仍报该错误。

备份恢复是报“核心已转储”

解决:由于正式环境数据库和测试环境数据库小版本有差别,因此将测试环境数据库版本换为和正式环境数据库一样的版本后,成功备份还原。

管理工具/执行SQL

1.报错信息:字符串转换错误

操作背景:执行SQL语句时,将查询条件中varchar类型的字段和1相等,导致操作结果报”字符串转换错误”

解决:将数字1加单引号,将其作为字符类型和varchar类型字段相比较。

  1. 报错信息:字符串截断

操作背景:在查询过程中,对TEXT类型数据进行模糊查询,结果显示字符串截断。

解决:修改CLOB_LIKE_MAX_LEN为3000,修改后需重启数据库生效。

  1. 报错信息:数据溢出

操作背景:在查询过程中,应用将两个表中的number字段和varchar字段直接做关联,导致报”数据溢出”。

解决:在SQL中使用CAST内置函数将number字段转化为varchar进行关联。

  1. 报错信息:系统错误

操作背景:打开达梦数据库管理工具,连接数据库时,报“系统错误”,原因是因为数据库的版本为8,管理工具版本为7 由于版本相差太大,导致报错。

解决:重新安装最新的达梦数据库管理工具。

迁移

  1. 报错信息:创建表出错

操作背景:

解决:对表结构进行检查,检查到语法不兼容的地方:将NOW()之后的语句删除后创建表

  1. 报错信息:列长度超出定义

操作背景:

解决:在达梦数据库中将对应字段长度设置更大

3.报错信息:数据溢出

操作背景:

解决:

将原本的NUMRIC(38,38) 更改为NUMRIC(38)

 

4.报错信息违反唯一性约束

操作背景:由于本身数据存在重复,但是需要迁移该唯一索引

解决:步骤如下

①先将该表中的数据删除

②创建唯一索引

③使唯一索引失效

④重新迁移表中数据

  1. 执行存储过程SQL,报错信息非法的基类名[BPCHAR]

操作背景:

解决:

将BPCHAR(1)修改为VARCHAR(20)

  1. 报错信息:迁移过程中报回滚版本过旧

解决:将生产环境UNDO_RETENTION参数的值从90改为240重新进行迁移

附件(常用语句)

1.抓取SQL

(1)修改每个节点主节点的sqllog.ini文件

BUF_TOTAL_SIZE = 10240  #SQLs Log Buffer Total Size(K)(1024~1024000)

BUF_SIZE = 1024  #SQLs Log Buffer Size(K)(50~409600)

BUF_KEEP_CNT = 6  #SQLs Log buffer keeped count(1~100)

[SLOG_ALL]

FILE_PATH = /saic/dmdbms/logcommit  #日志存放目录(手动创建).放到空间大的目录下

PART_STOR = 0

SWITCH_MODE = 2  #按照文件大小切换

SWITCH_LIMIT = 100 #文件大小100M

ASYNC_FLUSH = 1 #异步刷日志

FILE_NUM = 100  #文件个数

ITEMS = 0

SQL_TRACE_MASK = 1

MIN_EXEC_TIME = 0

USER_MODE = 0

USERS = SP_REFRESH_SVR_LOG_CONFIG();   #是配置文件生效

如果配置文件sqllog.ini还需要修改的话,把参数关掉SP_SET_PARA_VALUE(1,'SVR_LOG',0)

sp_set_para_value(1,'svr_log',1);开启sql日志

sp_set_para_value(1,'svr_log',0);关闭sql日志

select * from v$parameter where name like 'SVR_LOG';

3.杀掉活动会话select类型语句

(1)SQL语句为:

declare

v_cnt int;

begin

for rec in(select sess_id from v$sessions where state='ACTIVE' and clnt_ip<>'::1' and sql_text like 'SELECT%' order by 1)

loop

execute immediate 'call sp_close_session('||rec.sess_id||');';

end loop;

end;

/

或者

declare

v_cnt int;

begin

for rec in(select sess_id from v$sessions where state='ACTIVE' and clnt_ip<>'::1' and sql_text like 'SELECT%' order by 1)

loop

execute immediate 'call SP_CANCEL_SESSION_OPERATION('||rec.sess_id||');';

end loop;

end;

/

  1. 查询状态

select * from v$sessions where state = 'ACTIVE';

select * from v$sessions where state = 'ACTIVE' AND SQL_TEXT LIKE 'select%';

4.删除某一模式下所有表的数据

begin

for rec in (select owner,table_name from dba_tables where owner='模式名')

loop

execute immediate ' truncate table '||rec.owner||'.'||rec.table_name;

end loop;

end;

/

5.更新统计信息

(1)对库上所有模式下的所有用户表以及表上的所有索引生成统计信息

CALL SP_DB_STAT_INIT ();

(2)DBMS_STATS.GATHER_SCHEMA_STATS('模式名',100,TRUE, 'FOR ALL COLUMNS SIZE AUTO');更新一个模式所有的信息。

以后每次做完数据迁移要更新统计信息,这两条语句,具体用哪个,根据迁移情况选择。

压测之前先跑一下更新统计信息的命令。

6.删除备份语句

删除15天之前的备份  根据现场要求改这个时间,调度要设置成  每天执行

SF_BAKSET_BACKUP_DIR_ADD('DISK','/data/DAMENG/bak');

call SP_DB_BAKSET_REMOVE_BATCH('DISK',SYSDATE-1);

7.连接数据库,配置JDBC

8.统计每个表中的数据量

declare

cnt int;

begin

 for rec in (select owner,table_name from all_tables where owner='SYSDBA' order by table_name) loop

 execute immediate 'select count(*) from '||rec.owner||'.'||'"'||rec.table_name||'"' into cnt;

 print rec.owner||'.'||rec.table_name||','||cnt;

 end loop;

end;

-----------------------------------------------------------------------------------------------------------------------------

dbms_output.enable()

select * from test;

CREATE TABLE test (name varchar(200) ,num int)

declare

        cnt int;

begin

        for rec in

        (

                select

                        owner,

                        table_name

                from

                        all_tables

                where

                        owner='TYXZSP'

                order by

                        table_name

        )

        loop

               execute immediate 'insert into test select '''||rec.owner||'.'||rec.table_name||''',count(*) from '||rec.owner||'."'||rec.table_name||'"' ;

                execute immediate 'commit';

        end loop;

end;

9.应用服务器上安装确认监视器所需命令:

nmcli con modify bond0 ipv4.routes “数据库1内网IP/32  数据库外网1IP”

nmcli con modify bond0 ipv4.routes “数据库2内网IP/32  数据库外网2IP

nmcli con up bond0

例如

nmcli con modify bond0 ipv4.routes “172.16.1.2/32  10.6.1.2”

nmcli con modify bond0 ipv4.routes “172.16.1.3/32  10.6.1.3”

nmcli con up bond0

10.修改用户失败登录次数限制

修改用户失败登录次数限制:ALTER USER "用户名" LIMIT FAILED_LOGIN_ATTEMPS UNLIMITED;修改用户口令过期时间限制:ALTER USER "用户名" LIMIT PASSWORD_LIFE_TIME UNLIMITED;修改用户口令锁定期限制: ALTER USER "用户名" LIMIT PASSWORD_LOCK_TIME UNLIMITED;

11.批量生成执行计划:

vim /data/explain.txt

spool /data/exp111.txt

explain select * from zz;

explain select * from nn;

exit

cd /opt/dmdbms/bin

./disql

start /data/explain.txt

在/data下会生成exp111.txt 文件

12.打开审计

在 DM 系统中,专门为审计设置了开关,要使用审计功能首先要打开审计开关。审计开关由过程 VOID SP_SET_ENABLE_AUDIT(param int);控制,过程执行完后会立即生效,param 有三种取值:

ü 0:关闭审计

ü 1:打开普通审计

ü 2:打开普通审计和实时审计

缺省值为 0。

例,打开普通审计开关。

SP_SET_ENABLE_AUDIT (1);

审计开关必须由具有 数据库审计员 权限的管理员进行设置 。

数据库审计员可通过查询 V$DM_INI 动态视图查询 ENABLE_AUDIT 的当前值。

SELECT * FROM V$DM_INI WHERE PARA_NAME='ENABLE_AUDIT';

13.修改审计

修改审计日志路径 dm.ini 里面添加AUD_PATH=新路径,重启数据库生效

sp_set_para_value(1,'ENABLE_AUDIT',1);开启审计

sp_set_para_value(1,'ENABLE_AUDIT',0);关闭审计

select * from v$dm_ini where para_name = 'COMPATIBLE_MODE' 查看数据库兼容性参数

14.更换授权

1.放key

将新的key文件分别放入需要换KEY的数据库服务器的/opt/dmdbms/bin目录,删除或移出原有的.key文件。

2.更新key

---方法一     重启数据库

HA环境建议先停止HA的故障切换

在/opt/dmdbms/bin目录执行

./DmS(按tab键补全)空格restart

---方法二  不重启数据库,执行函数  非所有版本支持,需要到/opt/dmdbms/doc/sql手册.pdf 里面搜索是否有sp_load_lic_info,如果没有只能才用方法一

打开数据库工具,新建查询,输入

sp_load_lic_info() 点击执行

----方法三   等待数据库检测

更新完key,第三天查询授权是否生效

3.查询授权是否生效

打开数据库工具,新建查询,输入select EXPIRED_DATE   from   V$LICENSE

点击查询,查看返回结果

15.修改句柄,修改最大连接数

修改句柄  动态参数   不用重启:sp_set_para_value(1,'MAX_SESSION_STATEMENT',20000);  

修改最大连接数  重启后生效: sp_set_para_value(2,'MAX_SESSIONS',1000);   

16.查询所有索引

select *from all_objectswhere owner='EDPS_WEB' and object_type='INDEX';

select *from all_objectswhere object_type ='INDEX' and owner ='EDPS_WEB';

select *from all_indexeswhere owner ='EDPS_WEB';

26.删除某个用户下的所有索引

select

        'drop index '

        || index_name

        ||';'

from

        all_indexes

where

        owner='EDPS_WEB';

17.分析core文件(每个节点)

(1)有core文件的话,在bin下执行

gdb dmserver core

set logging file /data/dmdata/core日期.txt --设置日志文件

(gdb) set logging on --打开日志

(gdb) thread apply all bt --抓取所有堆栈信息

(gdb)q --退出

(2)没有core文件时,需要停掉守护进程

没有生成core文件,但数据库很慢。在bin下执行

gdb dmserver 主库pid

set logging file /home/dmdba/dmdbms/core210939.txt --设置日志文件

(gdb) 

set logging on --打开日志

(gdb) thread apply all bt --抓取所有堆栈信息

(gdb)q --退出

根据core文件和线程分析是哪条SQL

./dmrdc sfile=./core文件 --会生成一个core_temp.xxx的文件

18.查看当前对应服务进程会话中打开的文件数

ls -l /proc/pid/fd |grep -c .

cat /proc/pid/limits

/*编辑system.conf全局服务生效,或者user.conf用户服务生效*/

    1)调整system.conf文件中对应参数,保存后需要重启整个服务器才会生效。

DefaultLimitCORE=infinity

DefaultLimitNOFILE=65536

DefaultLimitNPROC=65536

    2)针对单个service服务, 编辑对应的DmServer服务名.service脚本文件

vi /usr/lib/systemd/system/DmService服务名.service

[SERVICE]下添加如下一行:LimitNOFILE=65536

     /*运行如下命令使得对应服务更改生效*/

sudo systemctl daemon-reload

sudo systemctl restart DmService服务名.service


版权声明:本文为yangyiyun199863原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。