备份还原
- 报错信息:”核心已转储”
操作背景:根据正式环境数据库参数,在测试环境上建库,将正式环境数据库进行在线备份后的备份集传到测试环境,最后在测试环境上利用该备份集进行还原。还原操作成功,恢复时报”核心已转储”,清缓存和重启服务器后仍报该错误。
备份恢复是报“核心已转储”
解决:由于正式环境数据库和测试环境数据库小版本有差别,因此将测试环境数据库版本换为和正式环境数据库一样的版本后,成功备份还原。
管理工具/执行SQL
1.报错信息:”字符串转换错误”
操作背景:执行SQL语句时,将查询条件中varchar类型的字段和1相等,导致操作结果报”字符串转换错误”
解决:将数字1加单引号,将其作为字符类型和varchar类型字段相比较。
- 报错信息:”字符串截断”
操作背景:在查询过程中,对TEXT类型数据进行模糊查询,结果显示字符串截断。
解决:修改CLOB_LIKE_MAX_LEN为3000,修改后需重启数据库生效。
- 报错信息:”数据溢出”
操作背景:在查询过程中,应用将两个表中的number字段和varchar字段直接做关联,导致报”数据溢出”。
解决:在SQL中使用CAST内置函数将number字段转化为varchar进行关联。
- 报错信息:”系统错误”
操作背景:打开达梦数据库管理工具,连接数据库时,报“系统错误”,原因是因为数据库的版本为8,管理工具版本为7 由于版本相差太大,导致报错。
解决:重新安装最新的达梦数据库管理工具。
迁移
- 报错信息:创建表出错
操作背景:
解决:对表结构进行检查,检查到语法不兼容的地方:将NOW()之后的语句删除后创建表
- 报错信息:”列长度超出定义”
操作背景:
解决:在达梦数据库中将对应字段长度设置更大
3.报错信息:”数据溢出”
操作背景:
解决:
将原本的NUMRIC(38,38) 更改为NUMRIC(38)
4.报错信息”违反唯一性约束”
操作背景:由于本身数据存在重复,但是需要迁移该唯一索引
解决:步骤如下
①先将该表中的数据删除
②创建唯一索引
③使唯一索引失效
④重新迁移表中数据
- 执行存储过程SQL,报错信息”非法的基类名[BPCHAR]”
操作背景:
解决:
将BPCHAR(1)修改为VARCHAR(20)
- 报错信息:迁移过程中报回滚版本过旧
解决:将生产环境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;
/
- 查询状态
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