########################################调优及备份########################################
1.配置环境变量 export LD_LIBRARY_PATH=“PATH:DM_HOME/tool
2.dm.ini参数调优 参考:https://eco.dameng.com/document/dm/zh-cn/pm/physical-storage 使用sysdba用户登陆dm管理工具或disql工具,执行以下脚本 如果在disql命令行中执行,需要先执行 set serverout on 然后再执行脚本,将执行后显示的 sp_set_para_value 部分的sql粘贴出来,重新再执行
###特别注意,小心修改这两个参数 RECYCLE,BUFFER
disql SYSDBA/SYSDBA@192.168.81.81:5236
set serverout on sp_set_para_value(2,‘WORKER_THREADS’, 16 ); —工作线程数 sp_set_para_value(2,‘TASK_THREADS’, 4 ); —任务线程数 sp_set_para_value(2,‘IO_THR_GROUPS’, 4 ); —io线程组数(限非Windows) sp_set_para_value(2,‘MAX_OS_MEMORY’, 100 ); —操作系统内存的最大百分比 sp_set_para_value(2,‘MEMORY_POOL’, 8000 ); —内存池大小(mb) sp_set_para_value(2,‘MEMORY_N_POOLS’, 59 ); —内存池数量 sp_set_para_value(2,‘MEMORY_TARGET’, 30000 ); —内存共享池目标大小(MB) sp_set_para_value(2,‘BUFFER’, 320000 ); —初始系统缓冲区大小(MB) sp_set_para_value(2,‘BUFFER_POOLS’, 301 ); —缓冲池数量 sp_set_para_value(2,‘RECYCLE’, 32000 ); —系统回收缓冲区大小(MB) sp_set_para_value(2,‘RECYCLE_POOLS’, 51 ); —回收缓冲池的数量 sp_set_para_value(2,‘FAST_POOL_PAGES’, 99999999 ); —快速池的页数 sp_set_para_value(2,‘FAST_ROLL_PAGES’, 9999999 ); —快速滚动页面的页数 sp_set_para_value(2,‘MEMORY_MAGIC_CHECK’, 1 ); —是否开启对所有内存池的校验,0关,1开,2加强开 sp_set_para_value(2,‘ENABLE_FREQROOTS’, 1 ); —是否收集频繁使用的页面 sp_set_para_value(2,‘HJ_BUF_GLOBAL_SIZE’, 128000 ); —所有hash连接的最大hash缓冲区大小(MB) sp_set_para_value(2,‘HJ_BUF_SIZE’, 512 ); —单个hash连接的最大hash缓冲区大小(MB) sp_set_para_value(2,‘SORT_FLAG’, 1 ); —选择排序方法 sp_set_para_value(2,‘SORT_BLK_SIZE’, 1 ); —最大排序blk大小(MB)
将 DIRECT_IO 改为0 注意改 sp_set_para_value(2,‘DIRECT_IO’, 0 ); 即为参数调优 刷参数后必须调整参数; alter system set ‘MAX_SESSIONS’=2000 SPFILE; [最大连接数]
注意其他参数:(详细见管理员手册)
COMPATIBLE_MODE (异构数据库兼容):2
修改方法: sp_set_para_value(2,‘COMPATIBLE_MODE’, 2 );
3.注册许可证 —测试略
上传正确的KEY到/dm8/bin(如果使用错误的处理器类型key将导致实例停止)
1>.数据库正在使用
#替换/dm8/bin文件
chown dmdba
2>.数据库已关闭
#替换/dm8/bin文件,修改权限即可
chown dmdba
4.创建表空间及备份
说明:创建rural用户,密码为
disql SYSDBA/SYSDBA@192.168.81.81:5236
—表空间和数据库用户应用自己建 —创建表空间 create tablespace “rural” datafile ‘/dm8_data/rural/rural.DBF’ size 10240 AUTOEXTEND ON NEXT 2048; —创建索引表空间(数据量小项目可以不必,数据量大的项目需要分开维护) create tablespace “rural_idx” datafile ‘/dm8_data/rural/rural_idx.DBF’ size 5120 AUTOEXTEND ON NEXT 2048; —创建用户 CREATE USER “rural” IDENTIFIED BY “admin1234” DEFAULT TABLESPACE “rural” DEFAULT INDEX TABLESPACE “rural_idx”; —赋予权限 GRANT “PUBLIC”,“RESOURCE”,“VTI”,“SOI”,“SVI” TO “rural”; —取消用户登陆限制 alter user “rural” limit failed_login_attemps unlimited,password_lock_time unlimited,password_grace_time unlimited;
—删除用户 drop user “rural” cascade; —删除表空间 drop tablespace “rural”; drop tablespace “rural_idx”;
—创建只读用户,DBQUERY CREATE USER “DBQUERY” IDENTIFIED BY “DBQUERY168” read only; —赋予权限 grant CREATE SESSION,SELECT ANY TABLE,SELECT ANY VIEW TO “DBQUERY”; —更改sysdba密码 alter user “SYSDBA” identified by “oracle”;
5.归档配置 1>查询归档 select PARA_NAME,PARA_VALUE,DEFAULT_VALUE from v$dm_ini where para_name LIKE ‘%ARCH_INI%’;
2>查询归档状态 Select * from v$arch_status;
3>检查归档参数是否生效 cd /dm8_data/rural/ cat dm.ini|grep -i ARCH_INI
4>归档自动删除 注意:归档之前已经配置,不需要再次执行 ###按照归档大小删除 ARCH_SPACE_LIMIT:Redo日志归档空间限制,当同一节点的本地归档文件或远程归档文件达到限制值时, 系统自动删除最早生成的归档日志文件。0表示无空间限制,取值范围(1024M~2147483647M), 对本地归档和远程归档有效,缺省为0。可手动修改dmarch.ini中ARCH_SPACE_LIMIT参数,也可执行sql: alter database modify archivelog ‘DEST=/dm8/arch, TYPE=LOCAL, FILE_SIZE=200, SPACE_LIMIT=10240’;
###按照时间删除 ARCH_RESERVE_TIME:归档日志保留时间,单位分钟,取值范围(0~4294967294)。 只对远程归档和本地归档有效,服务器每隔5分钟检查是否存在超过保留时间的归档并删除。 默认为0,表示不删除归档。手动修改dmarch.ini中ARCH_RESERVE_TIME参数,更改为1440即归档保留24小时。
6.定时备份及删除 #全量+删除 —说明:每天23:30生成统计信息,全量备份,删除30天前的全量备份 —注意开启归档,备份路径/backup/dailybak call SP_INIT_JOB_SYS(1); call SP_CREATE_JOB(‘coun_bakall_delall’,1,0,”,0,0,”,0,‘每天 23:00 全量备份、删除 30 天前的全量备份’); call SP_JOB_CONFIG_START(‘coun_bakall_delall’); call SP_ADD_JOB_STEP(‘coun_bakall_delall’, ‘coun’, 0, ‘CALL SP_DB_STAT_INIT();’, 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_STEP(‘coun_bakall_delall’, ‘bakall’, 6, ‘01020000/backup/dailybak’, 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_STEP(‘coun_bakall_delall’, ‘delall’, 0, ‘SF_BAKSET_BACKUP_DIR_ADD(”DISK”,”/backup/dailybak”); CALL SP_DB_BAKSET_REMOVE_BATCH(”DISK”,SYSDATE-30);’, 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘coun_bakall_delall’, ‘coun_bakall_delall_time01’, 1, 1, 1, 0, 0, ‘23:30:00’, NULL, ‘2019-01-01 01:01:01’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘coun_bakall_delall’);
#全量+增量+删除(建议采用) SP_INIT_JOB_SYS(1); call SP_CREATE_JOB(‘bakall_one’,1,0,”,0,0,”,0,‘执行一次全量备份’); call SP_JOB_CONFIG_START(‘bakall_one’); call SP_ADD_JOB_STEP(‘bakall_one’, ‘bakall_one_work’, 6, ‘01020000/backup/dailybak’, 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘bakall_one’, ‘bakall_one_time’, 1, 0, 0, 0, 0, NULL, NULL, ‘2023-07-04 14:50:00’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘bakall_one’);
—创建代理环境 call SP_INIT_JOB_SYS(1); call SP_DROP_JOB(‘full_bak’); call SP_DROP_JOB(‘inc_bak’); call SP_DROP_JOB(‘del_bak’);
—创建全备作业 call SP_CREATE_JOB(‘full_bak’,1,0,”,0,0,”,0,‘周六2:00做全备’); call SP_JOB_CONFIG_START(‘full_bak’); call SP_ADD_JOB_STEP(‘full_bak’, ‘step1’, 6, ‘01000000/backup/dailybak’, 1, 1, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘full_bak’, ‘step2’, 1, 2, 1, 64, 0, ‘02:00:00’, NULL, ‘2023-07-04 14:00:00’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘full_bak’);
—创建增量作业 call SP_CREATE_JOB(‘inc_bak’,1,0,”,0,0,”,0,‘周日到周五2:00做增备’); call SP_JOB_CONFIG_START(‘inc_bak’); call SP_ADD_JOB_STEP(‘inc_bak’, ‘step1’, 6, ‘11000000/backup/dailybak|/backup/dailybak/’, 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘inc_bak’, ‘step2’, 1, 2, 1, 63, 0, ‘02:00:00’, NULL, ‘2023-07-04 00:00:00’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘inc_bak’);
—创建定时删除作业 call SP_CREATE_JOB(‘del_bak’,1,0,”,0,0,”,0,‘每天凌晨3点删除14天前的备份’); call SP_JOB_CONFIG_START(‘del_bak’); call SP_ADD_JOB_STEP(‘del_bak’, ‘step1’, 0, ‘SF_BAKSET_BACKUP_DIR_ADD(”DISK”,”/backup/dailybak”); CALL SP_DB_BAKSET_REMOVE_BATCH(”null”,SYSDATE-14);’, 1, 1, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘del_bak’, ‘step2’, 1, 1, 1, 0, 0, ‘03:00:00’, NULL, ‘2023-07-04 00:00:00’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘del_bak’);
查看作业执行情况 set pagesize 1000 SELECT EXEC_ID,NAME,START_TIME,END_TIME,ERRCODE,JOBID FROM SYSJOB.SYSJOBHISTORIES2 ORDER BY START_TIME;
查看失败作业详细信息 SELECT EXEC_ID,ERRCODE,ERRINFO FROM SYSJOB.SYSJOBHISTORIES2 WHERE ERRCODE !=0;
查看备份任务 SELECT JOB,SCHEMA_USER,LAST_DATE,LAST_SEC,NEXT_DATE,FAILURES,INSTANCE,“INTERVAL” FROM DBA_JOBS;
查看执行内容 SELECT JOB,WHAT FROM DBA_JOBS;
7.配置应用连接,创建dm_svc.conf
Linux环境
vi /etc/dm_svc.conf TIME_ZONE=(+8:00) LANGUAGE=(cn) DW1=(192.168.56.81:5236,192.168.81.82:5236)
[DW1] LOGIN_MODE=(1) SWITCH_TIME=(300) SWITCH_INTERVAL=(200)
###应用连接
########################################选做########################################
1.逻辑备份配置在备库上(可选)
vi /dm8/scripts/demo.sh
#/bin/bash
export LD_LIBRARY_PATH=“PATH:DM_HOME/tool
#time
CUR_DATE=date +'%Y%m%d%H%M%S'
#weekday
WEEKDAY_INDEX=date +'%w'
echo “###begin exp_full_bak …###”
dexp SYSDBA/***********:35231 file=dexp_CJC_{CUR_DATE}.log OWNER=oracle
echo “###delete dmp history file …###”
find /backup/dmp -mtime 2 -type f -name “demo.dmp” -exec rm -rf {} ;
find /backup/dmp -mtime 2 -type f -name “demo*.log” -exec rm -rf {} ;
echo “###end bak …###”
#定时任务授权 chmod +x /dm8/scripts/demo.sh
#配置定时任务,每天晚上23点30分定时执行备份脚本 crontab -e 30 21 * * * su - dmdba -c “/dm8/scripts/demo.sh” 2>/dev/null
#备份报错处理
如果报错:[-7170]
如果报错:[-718]
SQL> BACKUP DATABASE FULL BACKUPSET '/backup/dmp/CJC_full_bak_20220426';BACKUP DATABASE FULL BACKUPSET ‘/dm/dmbak/CJC_full_bak_20220426’;
[-718]
手动切换归档
SQL> alter system switch logfile;2.定时全库收集统计信息(可选) —创建统计信息记录表 drop table MY_TAB_STATS; create table MY_TAB_STATS(tab_num int identity(1,1), tab_name varchar2(100), stat_time timestamp(6), stat_err varchar(1000)); —初始化统计信息记录表 truncate table MY_TAB_STATS; select * from MY_TAB_STATS; insert into MY_TAB_STATS(TAB_NAME) select table_name from all_tables where owner=‘EKP’; update MY_TAB_STATS set stat_time = to_date(‘1970-01-01 00:00:00’); commit;
—开始更新 sf_set_session_para_value(‘HAGR_HASH_SIZE’,100000000); set serveroutput on call stat_zzj(0,100); create or replace procedure stat_zzj(a int,b int) as num_start int; num_end int; BEGIN num_start=a; num_end=b; FOR TB IN ( select tab_num,tab_name from MY_TAB_STATS where tab_num > a and tab_num <b ) loop begin DBMS_STATS.GATHER_TABLE_STATS(‘EKP’,TB.TAB_NAME,NULL,100,TRUE,‘FOR ALL COLUMNS SIZE AUTO’); UPDATE MY_TAB_STATS SET STAT_TIME = SYSDATE WHERE TAB_NUM = TB.TAB_NUM; COMMIT; print TB.TAB_NAME||’ Done,Current Time is ’|| sysdate; exception when others then update MY_TAB_STATS SET STAT_TIME = SYSDATE, STAT_ERR = SQLCODE||”||SQLERRM WHERE TAB_NUM = TB.TAB_NUM; END; END LOOP; END;
—创建定时收集统计信息的作业 call SP_CREATE_JOB(‘stat_zzj’,1,0,”,0,0,”,0,”); call SP_JOB_CONFIG_START(‘stat_zzj’); call SP_JOB_SET_EP_SEQNO(‘stat_zzj’,0); call SP_ADD_JOB_STEP(‘stat_zzj’, ‘step1’, 0, ‘call stat_zzj(0,100);’, 0, 0, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE(‘stat_zzj’, ‘step2’, 1, 0, 0, 0, 0, NULL, NULL, ‘2023-05-31 22:00:00’, NULL, ”); call SP_JOB_CONFIG_COMMIT(‘stat_zzj’);