注册
达梦8单机安装完整版1.0(适用于小白的实战版,一步步下来,简单高效)
专栏/技术分享/ 文章详情 /

达梦8单机安装完整版1.0(适用于小白的实战版,一步步下来,简单高效)

Onemore 2025/05/30 14 0 0
摘要

!!!下载附件,用Typora打开即可。!!!文章内容只是示意,展示不全

DM8单机安装_完整版手册

一、检查安装包

1.查看CPU 架构、颗数、核心数

# 查看cpu lscpu

<img src="./完整版单机安装手册.assets/image-20250421101305103.png" alt=“image-20250421101305103” style=“zoom: 50%;” align=“left” />

物理核心总数 = Core(s) per socket × Socket(s)

本次安装信息:

cpu架构:aarch64

cpu颗数:16

cpu核心数:1

2.根据CPU架构进行选包

# 查看NAME: "UnionTech OS Server 20" 这是统信 Kylin Linux Advanced Server:这是麒麟 cat /etc/os-release #查看内核/系统 uname -a

image-20250421101620320

操作系统:Linux操作系统

3.检查安装包版本是否正确

4.检查tar命令

# 无tar命令,服务器无法正常安装 tar --help

二、系统参数配置

1.修改openfile参数

输入命令检查openfile参数是否为65536或者无限制
#输入命令检查open file参数:

ulimit -a

若open file参数不是65536或者无限制则用以下方式进行修改:
#输入命令进入limits.conf文件编辑界面:

su - root vi /etc/security/limits.conf

进入到limits.conf文件后,键盘按“i”开始插入数据,在文件内容末尾增加内容:

* soft nproc 65536
* hard nproc 65536
* soft nofile 65536
* hard nofile 65536

dmdba soft nice 65536
dmdba hard nice 65536
dmdba soft as unlimited
dmdba hard as unlimited
dmdba soft fsize unlimited
dmdba hard fsize unlimited
dmdba soft nproc 65536
dmdba hard nproc 65536
dmdba soft nofile 65536
dmdba hard nofile 65536
dmdba soft core unlimited
dmdba hard core unlimited
dmdba soft data unlimited
dmdba hard data unlimited

2.关闭swap分区

# 查看内存 free -m #永久关闭 swap 分区,root, 需重启 sed -ri 's/.*swap.*/#&/' /etc/fstab # 查看内存 free -m

3.确认磁盘调度算法

##重新确认调度算法,,sda替换为要装的磁盘 cat /sys/block/sda/queue/scheduler ##永久修改 ##修改内核引导参数,加入 elevator= deadline [root@~]# vi /boot/grub/menu.lst ##更改到如下内容 kernel /boot/vmlinuz-2.6.32-504.el6 ro root=LABEL=/ elevator=deadline rhgb quiet ##重新确认调度算法,vdc替换为要装的磁盘 [root@~]# cat /sys/block/vdc/queue/scheduler

4.禁用透明大页,禁用numa

###禁用透明大页 ##查看是否启用透明大页 [root@~]# cat /sys/kernel/mm/transparent_hugepage/enabled ##[always]表示透明大页启用 [never] 表示透明大页禁用 ##永久修改 [root@~]# vi /etc/default/grub ##编辑grub文件,在 “GRUB_CMDLINE_LINUX=” 配置参数结尾加入 “transparent_hugepage=never numa=off” ##重新生成 /etc/grub2.cfg 配置文件:

命令生效范围对比表(由deepSeek整理,注意甄别)

命令 适用系统启动模式 典型生效系统 关键说明
grub2-mkconfig -o /etc/grub2.cfg 通用 所有 Linux 系统 符号链接到真实路径,不直接生效(需确认实际指向)
grub2-mkconfig -o /boot/efi/EFI/kylin/grub.cfg UEFI 模式 麒麟 KylinOS 专用于麒麟的 UEFI 引导路径
grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg UEFI 模式 openEuler 专用于 openEuler 的 UEFI 引导路径
grub-mkconfig -o /boot/grub/grub.cfg Legacy BIOS 模式 统信/Debian/Ubuntu/Deepin 传统 BIOS 系统的标准路径(部分系统兼容 grub2-mkconfig
grub2-mkconfig -o /boot/grub2/grub.cfg Legacy BIOS 模式 CentOS/RHEL/Fedora/openSUSE 红帽系和 SUSE 系在 BIOS 模式的标准路径

5.配core日志、内存分配参数

vi /etc/sysctl.conf kernel.core_pattern =/data/core/core-%e-%p-%s vm.overcommit_memory=0 # 使生效 sysctl -p

0:表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1:表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2:表示内核允许分配超过所有物理内存和交换空间总和的内存

6.关闭selinux(统信应该是没有selinux)

vi /etc/selinux/config SELINUX=disabled

image-20250421164351484

7.系统时间检查

# 不符合当前时间的需要修改,本处略 date

8.重启+检查

#输入命令重启服务器 reboot; #输入命令查看参数修改是否成功 ulimit -a #查看selinux是否关闭成功 getenforce # 查看内存 free -m # 查看 numa dmesg | grep -i numa cat /proc/cmdline # 查看透明大页 cat /sys/kernel/mm/transparent_hugepage/enabled

check-06

check-07

9.说明

磁盘 IO、网络、调整 nproc.conf 参数、CPU 超线程检查、内存池管理调整、RemoveIPC 参数检查、调整 login、core

三、防火墙配置

#查看版本 cat /etc/redhat-release # redhat 6 iptables -L # 命令行添加端口,永久更改,需重启防火墙服务 [root@~]# iptables -A INPUT -s 0.0.0.0/0.0.0.0 -p tcp --dport 5236 -j ACCEPT # 保存设置 [root@~]# service iptables save # 重启防火墙 [root@~]# service iptables restart # redhat 7/8 # 添加(--permanent 永久生效,没有此参数重启后失效) firewall-cmd --zone=public --add-port=5236/tcp --permanent # 重新载入 firewall-cmd --reload # 查看 firewall-cmd --zone=public --query-port=5236/tcp # 删除 firewall-cmd --zone=public --remove-port=5236/tcp --permanent

其他相关命令:

查看防火墙状态

systemctl status firewalld.service

关闭防火墙服务

systemctl stop firewalld.service

#开机时禁用防火墙服务

systemctl disable firewalld.service

#查询已开放的端口列表:

firewall-cmd --zone=public --list-ports

四、创建用户组、用户、文件目录

1.创建组、用户

#创建安装用户dmdba,将新建用户放在用户组dinstall中 groupadd dinstall useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba # useradd -u 12345 -g dinstall -m -d /home/dmdba -s /bin/bash dmdba #初始化dmdba用户密码 passwd dmdba Sysdba#123

2.创建安装目录

mkdir data chown -R dmdba:dinstall data chmod -R 775 data cd /data mkdir dm8 core dmbak dmarch dmdata chown -R dmdba:dinstall dm8 core dmbak dmarch dmdata chmod -R 775 dm8 core dmbak dmarch dmdata

3.上传安装包、key文件

# 上传key cp dm--8.1--0625.key /opt/dm.key chown dmdba:dinstall /opt/dm.key chmod 755 /opt/dm.key # 上传安装包并挂载镜像 mount dm8_20210818_x86_rh6_64_ent_8.4.2.18_pack14.iso /mnt

4.磁盘挂载、划分

1.如果未进行磁盘挂载、分区,需要先处理磁盘

(1)lsblk =》查看当前磁盘情况

(2)fdisk /dev/sdb =》新建分区

(3)mkfs.xfs -f /dev/sdb1 分区强制格式化

(4)mount /dev/sdb /data 临时

(5)vi /etc/fstab

(6)blkid =》查看分区UUID

(7)echo “UUID=fb709be6-622a-4452-ac68-49aeb3063349 /data xfs defaults 0 0” >> /etc/fstab

(8)mount -a 执行挂载测试

Linux下mount挂载新硬盘和开机自动挂载 - sirdong - 博客园

小于200G,不分区、不分盘划分方法 #查看现有磁盘 lsblk #磁盘分区 /dev/磁盘名 fdisk /dev/sdb #新建磁盘 n #新建p分区 #强制格式化 mkfs.xfs -f /dev/sdb1 # 挂载 mount /dev/sdb /data #强制格式化 mkfs.xfs -f /dev/sdb1 # 挂载 mount /dev/sdb /data

划分原则(仅供参考):

/data
├── dm8 # 安装目录
├── core # 核心转储文件
├── dmbak # 备份文件
├── dmarch # 归档日志
└── dmdata # 数据文件

  • 小于等于200G的硬盘,就不要划分了,直接挂载到 /data
  • 如果客户的数据量100G、提供了500G的空间,则可以考虑划分分区了
  • dm8:比较固定,3-5G空间
  • core:内存异常定位用,如果磁盘空间充足,则设置成跟内存一样的大小,如果不足,则设置为内存的一半
  • dmbak:根据系统的数据量来,如果100G的系统

仅供参考:

<img src="./完整版单机安装手册.assets/image-20250421150436966.png" alt=“image-20250421150436966” style=“zoom:50%;” align=“left” />

5.调整安装临时目录

[root@localhost ~]# cd /opt [root@localhost opt]# mkdir tmp [root@localhost opt]# chown dmdba:dinstall /opt/tmp [root@localhost opt]# chown dmdba:dinstall /opt/tmp [root@localhost opt]# chmod 777 /opt/tmp [root@localhost opt]# su - dmdba [dmdba@localhost ~]$ export DM_INSTALL_TMPDIR=/opt/tmp

6.需改环境变量

su - dmdba vi .bash_profile export DM_HOME="/data/dm8" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/data/dm8/bin" export PATH=$PATH:$DM_HOME/bin:$DM_HOME/tool # 使生效 source .bash_profile #检查 env | grep PATH

五、数据库安装

[dmdba@zbx-client mnt]$ ls 'DM8 Install.pdf' DMInstall.bin ./DMInstall.bin -i 请选择安装语言(C/c:中文 E/e:英文) [C/c]:c 解压安装程序.......... core file size (blocks, -c) unlimited data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 26546 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 26546 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited 可打开文件数过少,建议至少设置为65536或更多。 欢迎使用达梦数据库安装程序 是否输入Key文件路径? (Y/y:是 N/n:否) [Y/y]:n 是否设置时区? (Y/y:是 N/n:否) [Y/y]:y 设置时区: [ 1]: GTM-12=日界线西 [ 2]: GTM-11=萨摩亚群岛 [ 3]: GTM-10=夏威夷 [ 4]: GTM-09=阿拉斯加 [ 5]: GTM-08=太平洋时间(美国和加拿大) [ 6]: GTM-07=亚利桑那 [ 7]: GTM-06=中部时间(美国和加拿大) [ 8]: GTM-05=东部部时间(美国和加拿大) [ 9]: GTM-04=大西洋时间(美国和加拿大) [10]: GTM-03=巴西利亚 [11]: GTM-02=中大西洋 [12]: GTM-01=亚速尔群岛 [13]: GTM=格林威治标准时间 [14]: GTM+01=萨拉热窝 [15]: GTM+02=开罗 [16]: GTM+03=莫斯科 [17]: GTM+04=阿布扎比 [18]: GTM+05=伊斯兰堡 [19]: GTM+06=达卡 [20]: GTM+07=曼谷,河内 [21]: GTM+08=中国标准时间 [22]: GTM+09=汉城 [23]: GTM+10=关岛 [24]: GTM+11=所罗门群岛 [25]: GTM+12=斐济 [26]: GTM+13=努库阿勒法 [27]: GTM+14=基里巴斯 请选择设置时区 [21]:21 安装类型: 1 典型安装 2 服务器 3 客户端 4 自定义 请选择安装类型的数字序号 [1 典型安装]:1 所需空间: 1178M 请选择安装目录 [/home/dmdba/dmdbms]:/data/dm8 可用空间: 327G 是否确认安装路径(/data/dm8)? (Y/y:是 N/n:否) [Y/y]:y 安装前小结 安装位置: /data/dm8 所需空间: 1178M 可用空间: 327G 版本信息: 有效日期: 安装类型: 典型安装 是否确认安装? (Y/y:是 N/n:否):y 2023-07-19 09:27:18 [INFO] 安装 基础 模块... 2023-07-19 09:27:18 [INFO] 安装达梦数据库... 2023-07-19 09:27:22 [INFO] 安装 服务器 模块... 2023-07-19 09:27:22 [INFO] 安装 客户端 模块... 2023-07-19 09:27:25 [INFO] 安装 驱动 模块... 2023-07-19 09:27:26 [INFO] 安装 手册 模块... 2023-07-19 09:27:26 [INFO] 安装 服务 模块... 2023-07-19 09:27:27 [INFO] 移动日志文件。 2023-07-19 09:27:28 [INFO] 安装达梦数据库完成。 请以root系统用户执行命令: /data/dm8/script/root/root_installer.sh 安装结束 #以dmdba用户执行,切换到bin目录下, # 兼容模式 COMPATIBLE_MODE 默认值 0 | 标识符大小写敏感(CASE_SENSITIVE) 默认值 1 敏感 | 结尾空格填充模式(BLANK_PAD_MODE)默认值0 CHARSET=1 UTF-8 ./dminit PATH=/data/dmdata PORT_NUM=5236 DB_NAME=DAMENG INSTANCE_NAME=DMSERVER PAGE_SIZE=32 EXTENT_SIZE=32 CHARSET=1 LOG_SIZE=1024 CASE_SENSITIVE=0 SYSDBA_PWD=NynctNjc20250425 SYSAUDITOR_PWD=NynctNjc20250425 ./dminit PATH=/home/dmdata PORT_NUM=5236 DB_NAME=XZSP INSTANCE_NAME=XZSP PAGE_SIZE=32 EXTENT_SIZE=32 CHARSET=1 CASE_SENSITIVE=0 BLANK_PAD_MODE=1 LOG_SIZE=1024 SYSDBA_PWD=Sysdba#12345 SYSAUDITOR_PWD=Sysdba#12345 2、root 执行注册服务脚本 cd $DM_HOME/script/root ./dm_service_installer.sh -t dmserver -p DMSERVER -dm_ini /data/dmdata/DAMENG/dm.ini systemctl enable DmAPService systemctl enable DmService+实例名 systemctl start DmService+实例名 systemctl enable DmAPService systemctl enable DmServiceDMSERVER systemctl start DmServiceDMSERVER ./disql SYSDBA/'"Sysdba#12345"':5236

命令行方式卸载 DM 数据库
DM 安装目录下执行./uninstall.sh -i 卸载 DM 数据库:
[dmdba@KylinDCA03 dm8]$ ./uninstall.sh -i

删除实例

rm -rf

(虚拟机内存不要太小,不然out of memory, fail to allocate memory from OS)

./dm_service_uninstaller.sh -n DmServiceDMSERVER

六、安装后配置

# 开启数据库的服务器日志记录功能,并刷新服务器日志配置,使 SVR_LOG 参数生效 SP_SET_PARA_VALUE(1,'SVR_LOG',1); SP_REFRESH_SVR_LOG_CONFIG(); # 归档开启: alter database mount; alter database noarchivelog; alter database open; # 修改归档配置,归档上限50G alter database mount; alter database ARCHIVELOG; alter database ADD ARCHIVELOG 'type=local,dest=/data/dmarch,file_size=1024,space_limit=102400'; alter database open; 查看归档配置: select arch_mode from v$database; select * from v$dm_arch_ini; 修改归档的配置(修改归档空间上限): alter database modify archivelog 'type=local, dest=/home/dmdba/dmdbms/dmarch, SPACE_LIMIT=00'; # alter database modify archivelog 'type=local, dest=/data/dm8/DAMENG/arch, SPACE_LIMIT=51200'; 删除7天之前的归档日志 SELECT SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE-1); 创建作业环境 先执行 SP_INIT_JOB_SYS(0); 再尝试执行 SP_INIT_JOB_SYS(1); --定时全量备份: call SP_CREATE_JOB('DB_FULL_BACKUP1',1,0,'',0,0,'',0,'fullbak'); call SP_JOB_CONFIG_START('DB_FULL_BACKUP1'); call SP_ADD_JOB_STEP('DB_FULL_BACKUP1', 'DB_FULL_BACKUP1', 6, '00000000/opt/data/dmbak', 0, 0, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE('DB_FULL_BACKUP1', 'DB_FULL_BACKUP1', 1, 2, 1, 1, 0, '3:00:00', NULL, '2024-08-19 16:48:47', NULL, ''); call SP_JOB_CONFIG_COMMIT('DB_FULL_BACKUP1'); --定时增量备份: call SP_CREATE_JOB('DB_INC_BACKUP1',1,0,'',0,0,'',0,'incbak'); call SP_JOB_CONFIG_START('DB_INC_BACKUP1'); call SP_ADD_JOB_STEP('DB_INC_BACKUP1', 'DB_INC_BACKUP1', 6, '10000000/data/dmbak|/opt/data/dmbak', 0, 0, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE('DB_INC_BACKUP1', 'DB_INC_BACKUP1', 1, 2, 1, 126, 0, '3:00:00', NULL, '2024-08-19 16:48:41', NULL, ''); call SP_JOB_CONFIG_COMMIT('DB_INC_BACKUP1'); --定时清理: call SP_CREATE_JOB('DELETE_DB_FULL_BACKUP1',1,0,'',0,0,'',0,'keep7day'); call SP_JOB_CONFIG_START('DELETE_DB_FULL_BACKUP1'); call SP_ADD_JOB_STEP('DELETE_DB_FULL_BACKUP1', 'DELETE_DB_FULL_BACKUP1', 0, 'CALL SF_BAKSET_BACKUP_DIR_ADD(''DISK'',''/data/dmbak''); CALL SP_DB_BAKSET_REMOVE_BATCH(''DISK'', NOW()-7);', 0, 0, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE('DELETE_DB_FULL_BACKUP1', 'DELETE_DB_FULL_BACKUP1', 1, 1, 1, 0, 0, '04:00:00', NULL, '2024-08-19 16:48:57', NULL, ''); call SP_JOB_CONFIG_COMMIT('DELETE_DB_FULL_BACKUP1'); --清理归档 call SP_CREATE_JOB('DELETE_ARCH',1,0,'',0,0,'',0,'keep7day'); call SP_JOB_CONFIG_START('DELETE_ARCH'); call SP_ADD_JOB_STEP('DELETE_ARCH', 'DELETE_ARCH', 0, 'SF_ARCHIVELOG_DELETE_BEFORE_TIME(SYSDATE -7);', 1, 2, 0, 0, NULL, 0); call SP_ADD_JOB_SCHEDULE('DELETE_ARCH', 'DELETE_ARCH', 1, 1, 1, 0, 0, '04:00:00', NULL, '2024-08-19 16:49:01', NULL, ''); call SP_JOB_CONFIG_COMMIT('DELETE_ARCH'); 查看作业信息 select * from sysjob.SYSJOBS; 待运行的作业 ID。可通过查询 SYSJOBS 系统表得到。 例 立即执行一次 ID 为 1747730322 的作业。 SP_DBMS_JOB_RUN(174833671); 作业步骤信息 select * from SYSJOB.SYSJOBSTEPS; 作业调度信息 select * from sysjob.SYSJOBSCHEDULES; 删除作业 call SP_DROP_JOB('DB_INC_BACKUP1'); 清理作业日志 SP_JOB_CLEAR_HISTORIES ('DELETE_DB_FULL_BACKUP1'); 创建表空间和用户配置权限: xintu/Xintu_123! create tablespace "xintu" datafile '/data/dmdata/DAMENG/xintu.DBF' size 1024 autoextend on next 1024 maxsize 409600; create user "xintu" IDENTIFIED by "Xintu_123!" DEFAULT TABLESPACE "xintu"; grant "DBA","PUBLIC","RESOURCE","SOI","VTI" to "xintu"; select * from SYSOBJECTS t where t."TYPE$" ='SCH'; --查看模式 select * from SYSOBJECTS t where t."SUBTYPE$" ='USER'; --查看用户 grant SELECT ANY TABLE to "xintu" with admin option; 创建模式: CREATE SCHEMA "jnip" AUTHORIZATION "SYSDBA"; // 兼容mysql sp_set_para_value(2,'COMPATIBLE_MODE',4); // 兼容oracle sp_set_para_value(2,'COMPATIBLE_MODE',2); 查看数据库初始化信息: SELECT '实例名称' 数据库选项,INSTANCE_NAME 数据库集群相关参数值 FROM v$instance union all SELECT '数据库授权码',(SELECT SERIES_NO FROM V$LICENSE) UNION ALL SELECT '数据库有效期',cast((SELECT EXPIRED_DATE FROM V$LICENSE)as VARCHAR) UNION ALL SELECT '授权客户',(SELECT AUTHORIZED_CUSTOMER FROM V$LICENSE) UNION ALL SELECT '数据库版本',substr(svr_version,instr(svr_version,'(')) FROM v$instance union all SELECT '数据库版本小号',(SELECT id_code) FROM v$instance union all SELECT '数据库实例路径',(SELECT PARA_VALUE from v$dm_ini where para_name like'%SYSTEM_PATH%') FROM v$instance union all SELECT '页大小',cast(PAGE()/1024 as varchar) union all SELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union all SELECT '字符集',CASE SF_GET_UNICODE_FLAG() WHEN '0' THEN 'GBK18030' WHEN '1' then 'UTF-8' when '2' then 'EUC-KR' end union all SELECT '大小写敏感',DECODE(SF_GET_CASE_SENSITIVE_FLAG,'0','N-不敏感','1','Y-敏感') union all SELECT 'char是否以字符为单位',DECODE(PARA_VALUE,0,'0-否,以字节存储',1,'1-是,以字符存储') FROM V$DM_INI WHERE "V$DM_INI".PARA_NAME='LENGTH_IN_CHAR' union all SELECT 'BLANK_PAD_MODE',cast ( BLANK_PAD_MODE() as varchar) union all SELECT '数据库兼容',DECODE(PARA_VALUE,0,'不兼容',1,'1-SQL92',2,'2-Oracle',3,'3-MSSQLServer',4,'4-MySQL',5,'5-DM6',6,'6-Teradata',7,'7-PG') from v$dm_ini where para_name='COMPATIBLE_MODE' union all SELECT '关键字过滤',PARA_VALUE from v$dm_ini where para_name='EXCLUDE_RESERVED_WORDS';

七、数据库优化部分

[dmdba@localhost bin]$ ./disql SYSDBA/SYSDBA:5236 SQL>start Autodm8.sql
/* ************************************************************************** * * * Auto parameter adjustment 3.5 for dm8* * [April 10, 2023 ] * Written by Mr. Huanghaiming * * Take effect after restart dmserver * * ************************************************************************** */ declare exec_mode int:= 0; --0表示直接执行脚本修改参数,1表示不直接修改参数,打印设置参数的语句,设置为1后,必须调整v_mem_mb和v_cpus is_dsc int := 0; --是否是dsc集群,如果是dsc集群请设置为1,将自动调整dsc相关参数 mem_per int:= 90; --默认所有的内存归达梦数据库使用,如实际不能100%可用,可以调整此参数 v_mem_mb int:= 8000; --exec_mode为1时请自行根据机器实际内存调整此参数 v_cpus int:= 4; --exec_mode为1时请自行根据机器实际CPU核数调整此参数 sort_mode int:=0; --并发量较高的OLTP类型系统此参数设置为0,并发量不高的一般业务系统和OLAP类的系统此参数设置为1 pk_cluster_mode int:=0;--是否使用聚集主键:性能要求高且大字段较少的业务场景建议设置为1,大字段多的场景设置为0 tname varchar(100); MEMORY_POOL int; MEMORY_N_POOLS int; MEMORY_TARGET int; BUFFER INT; MAX_BUFFER INT; RECYCLE int; CACHE_POOL_SIZE int; BUFFER_POOLS int; RECYCLE_POOLS int; SORT_BUF_SIZE int; SORT_BUF_GLOBAL_SIZE INT; DICT_BUF_SIZE INT; HJ_BUF_SIZE INT; HAGR_BUF_SIZE INT; HJ_BUF_GLOBAL_SIZE INT; HAGR_BUF_GLOBAL_SIZE INT; SORT_FLAG INT; SORT_BLK_SIZE INT; RLOG_POOL_SIZE INT; TASK_THREADS INT; IO_THR_GROUPS INT; FAST_POOL_PAGES INT :=3000; FAST_ROLL_PAGES INT :=1000; CNT INT; begin CNT :=0; if exec_mode=0 then SELECT TOP 1 N_CPU,TOTAL_PHY_SIZE/1024/1024 INTO v_cpus,v_mem_mb FROM V$SYSTEMINFO; end if; v_mem_mb := v_mem_mb * (mem_per/100.0); v_mem_mb=round(v_mem_mb,-3); IF v_mem_mb <= 2000 THEN goto return_2000; END IF; IF v_mem_mb > 512000 THEN v_mem_mb :=v_mem_mb*0.8; END IF; MEMORY_TARGET=round(cast(v_mem_mb * 0.12 as int),-3); TASK_THREADS :=4; IO_THR_GROUPS :=4; IF v_cpus < 8 THEN TASK_THREADS :=4; IO_THR_GROUPS :=2; END IF; IF v_cpus >= 64 THEN v_cpus := 64; TASK_THREADS :=16; IO_THR_GROUPS :=8; END IF; BUFFER := round(cast(v_mem_mb * 0.4 as int),-3); RECYCLE :=cast(v_mem_mb * 0.04 as int); IF v_mem_mb < 70000 THEN with t as ( select rownum rn from dual connect by level <= 100 ) , t1 as ( select * from t where rn > 1 minus select ta.rn * tb.rn from t ta, t tb where ta.rn <= tb.rn and ta.rn > 1 and tb.rn > 1 ) select top 1 rn into BUFFER_POOLS from t1 where rn > v_mem_mb/800 order by 1; ELSE BUFFER_POOLS := 101; END IF; --修改内存池 IF v_mem_mb >= 16000 THEN IF v_mem_mb= 16000 THEN MEMORY_POOL := 1500; SORT_BUF_GLOBAL_SIZE := 1000; MEMORY_N_POOLS := 3; CACHE_POOL_SIZE := 512; ELSE MEMORY_POOL := 2000; SORT_BUF_GLOBAL_SIZE := 2000; MEMORY_N_POOLS := 11; CACHE_POOL_SIZE := 1024; END IF; FAST_POOL_PAGES :=9999; SORT_FLAG = 0; SORT_BLK_SIZE=1; SORT_BUF_SIZE := 10; RLOG_POOL_SIZE := 1024; HJ_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000); HAGR_BUF_GLOBAL_SIZE := LEAST(cast(v_mem_mb * 0.0625 as int),10000); HJ_BUF_SIZE :=250; HAGR_BUF_SIZE :=250; IF v_mem_mb >= 64000 THEN FAST_POOL_PAGES :=99999; FAST_ROLL_PAGES :=9999; BUFFER :=BUFFER-3000; CACHE_POOL_SIZE := 2048; RLOG_POOL_SIZE := 2048; SORT_FLAG = 1; SORT_BLK_SIZE=1; SORT_BUF_SIZE=50; SORT_BUF_GLOBAL_SIZE= cast(v_mem_mb * 0.02 as int); HJ_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.15625 as int); HAGR_BUF_GLOBAL_SIZE := cast(v_mem_mb * 0.04 as int); HJ_BUF_SIZE :=512; HAGR_BUF_SIZE :=512; MEMORY_N_POOLS := 59; END IF; DICT_BUF_SIZE := 50; HJ_BUF_GLOBAL_SIZE :=round(HJ_BUF_GLOBAL_SIZE,-3); HAGR_BUF_GLOBAL_SIZE :=round(HAGR_BUF_GLOBAL_SIZE,-3); SORT_BUF_GLOBAL_SIZE :=round(SORT_BUF_GLOBAL_SIZE,-3); RECYCLE :=round(RECYCLE,-3); ELSE MEMORY_POOL :=GREAT(cast(v_mem_mb * 0.0625 as int),100); MEMORY_POOL :=round(MEMORY_POOL,-2); MEMORY_N_POOLS := 2; CACHE_POOL_SIZE := 200; RLOG_POOL_SIZE := 256; SORT_BUF_SIZE := 10; SORT_BUF_GLOBAL_SIZE := 500; DICT_BUF_SIZE := 50; SORT_FLAG = 0; SORT_BLK_SIZE=1; HJ_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500); HAGR_BUF_GLOBAL_SIZE := GREAT(cast(v_mem_mb * 0.0625 as int),500); HJ_BUF_SIZE := GREAT(cast(v_mem_mb * 0.00625 as int),50); HAGR_BUF_SIZE :=GREAT(cast(v_mem_mb * 0.00625 as int),50); END IF; --设置根据RECYCLE情况RECYCLE_POOLS参数 with t as ( select rownum rn from dual connect by level <= 100 ) , t1 as ( select * from t where rn > 1 minus select ta.rn * tb.rn from t ta, t tb where ta.rn <= tb.rn and ta.rn > 1 and tb.rn > 1 ) select top 1 rn into RECYCLE_POOLS from t1 where rn <= RECYCLE*1024/3000/(page()/1024) order by 1 desc; tname :='BAK_DMINI_' || to_char(sysdate,'yymmdd'); execute IMMEDIATE 'select count(*) from USER_ALL_TABLES where table_name= ?' into CNT using tname; if exists(select 1 from V$INSTANCE where MODE$ in ('NORMAL','PRIMARY')) then IF CNT=0 THEN execute IMMEDIATE 'CREATE TABLE BAK_DMINI_' || to_char(sysdate,'yymmdd') || ' as select *,sysdate uptime from v$dm_ini'; ELSE execute IMMEDIATE 'INSERT INTO BAK_DMINI_' || to_char(sysdate,'yymmdd') || ' select *,sysdate uptime from v$dm_ini'; END IF; end if; --如果sort_mode设置为0,采用旧的排序模式 if sort_mode=0 then SORT_FLAG = 0; SORT_BUF_SIZE := 2; end if; MAX_BUFFER := BUFFER; IF exec_mode=0 THEN --修改cpu相关参数 SP_SET_PARA_VALUE(2,'WORKER_THREADS',v_cpus); SP_SET_PARA_VALUE(2,'TASK_THREADS',TASK_THREADS); SP_SET_PARA_VALUE(2,'IO_THR_GROUPS',IO_THR_GROUPS); --修改内存池相关参数 SP_SET_PARA_VALUE(2,'MAX_OS_MEMORY', mem_per); SP_SET_PARA_VALUE(2,'MEMORY_POOL', MEMORY_POOL); SP_SET_PARA_VALUE(2,'MEMORY_N_POOLS', MEMORY_N_POOLS); SP_SET_PARA_VALUE(2,'MEMORY_TARGET', MEMORY_TARGET); --修改内存检测参数为1 SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK', 1); --修改缓冲区相关参数 SP_SET_PARA_VALUE(2,'BUFFER', BUFFER); --新版本已去掉MAX_BUFFER参数,如果存在就修改 IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='MAX_BUFFER') THEN SP_SET_PARA_VALUE(2,'MAX_BUFFER', MAX_BUFFER); END IF; SP_SET_PARA_VALUE(2,'BUFFER_POOLS', BUFFER_POOLS); SP_SET_PARA_VALUE(2,'RECYCLE', RECYCLE); SP_SET_PARA_VALUE(2,'RECYCLE_POOLS', RECYCLE_POOLS); --修改fast_pool相关参数,如果是dsc环境,适当放小,以免影响启动速度 IF is_dsc= 1 THEN SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES', 10000); SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES', 3000); ELSE SP_SET_PARA_VALUE(2,'FAST_POOL_PAGES', FAST_POOL_PAGES); SP_SET_PARA_VALUE(2,'FAST_ROLL_PAGES', FAST_ROLL_PAGES); --如果不是dsc环境,开启热页动态加载,关闭预读 SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',1); SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1); SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0); SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0); END IF; --修改HASH相关参数 SP_SET_PARA_VALUE(1,'HJ_BUF_GLOBAL_SIZE', HJ_BUF_GLOBAL_SIZE); SP_SET_PARA_VALUE(1,'HJ_BUF_SIZE', HJ_BUF_SIZE ); SP_SET_PARA_VALUE(1,'HAGR_BUF_GLOBAL_SIZE',HAGR_BUF_GLOBAL_SIZE); SP_SET_PARA_VALUE(1,'HAGR_BUF_SIZE', HAGR_BUF_SIZE ); --修改排序相关参数 SP_SET_PARA_VALUE(2,'SORT_FLAG',SORT_FLAG); SP_SET_PARA_VALUE(2,'SORT_BLK_SIZE',SORT_BLK_SIZE); SP_SET_PARA_VALUE(2,'SORT_BUF_SIZE', SORT_BUF_SIZE); SP_SET_PARA_VALUE(2,'SORT_BUF_GLOBAL_SIZE', SORT_BUF_GLOBAL_SIZE); --修改其他内存参数 SP_SET_PARA_VALUE(2,'RLOG_POOL_SIZE', RLOG_POOL_SIZE); SP_SET_PARA_VALUE(2,'CACHE_POOL_SIZE', CACHE_POOL_SIZE); SP_SET_PARA_VALUE(2,'DICT_BUF_SIZE', DICT_BUF_SIZE); SP_SET_PARA_VALUE(2,'VM_POOL_TARGET', 16384); SP_SET_PARA_VALUE(2,'SESS_POOL_TARGET', 16384); --修改实例相关参数 SP_SET_PARA_VALUE(2,'USE_PLN_POOL', 1); SP_SET_PARA_VALUE(2,'ENABLE_MONITOR', 1); SP_SET_PARA_VALUE(2,'SVR_LOG', 0); SP_SET_PARA_VALUE(2,'TEMP_SIZE', 1024); SP_SET_PARA_VALUE(2,'TEMP_SPACE_LIMIT', 102400); SP_SET_PARA_VALUE(2,'MAX_SESSIONS', 1500); SP_SET_PARA_VALUE(2,'MAX_SESSION_STATEMENT', 20000); --性能要求高且大字段较少的业务场景建议设置为1,大字段多的场景设置为0 if pk_cluster_mode = 1 then SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',1); else SP_SET_PARA_VALUE(2,'PK_WITH_CLUSTER',0); end if; SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0); --修改优化器相关参数 SP_SET_PARA_VALUE(2,'OLAP_FLAG',2); SP_SET_PARA_VALUE(2,'VIEW_PULLUP_FLAG',1); SP_SET_PARA_VALUE(2,'OPTIMIZER_MODE',1); SP_SET_PARA_VALUE(2,'ADAPTIVE_NPLN_FLAG',0); --开启并行PURGE SP_SET_PARA_VALUE(2,'PARALLEL_PURGE_FLAG',1); --开启手动并行 SP_SET_PARA_VALUE(2,'PARALLEL_POLICY',2); --UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。 SP_SET_PARA_VALUE(2,'UNDO_EXTENT_NUM',16); --开启SQL 注入HINT功能 SP_SET_PARA_VALUE(2,'ENABLE_INJECT_HINT',1); SP_SET_PARA_VALUE(2,'FAST_LOGIN',1); SP_SET_PARA_VALUE(2,'BTR_SPLIT_MODE',1); --关闭参数监控 SP_SET_PARA_VALUE(2,'ENABLE_MONITOR_BP',0); IF is_dsc= 1 THEN SP_SET_PARA_VALUE(2,'ENABLE_FREQROOTS',0); --2022年5月月度版以后版本放开数据页预加载参数,DSC环境下开启 IF exists(select 1 from v$version where banner like '%-%' and REGEXP_SUBSTR(banner,'[^-]+',1,2)>='2022-05-25' and REGEXP_SUBSTR(banner,'[^-]+',1,3)>=161267) THEN SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',16); SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',4); SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',5); ELSE SP_SET_PARA_VALUE(2,'MULTI_PAGE_GET_NUM',1); SP_SET_PARA_VALUE(2,'PRELOAD_SCAN_NUM',0); SP_SET_PARA_VALUE(2,'PRELOAD_EXTENT_NUM',0); END IF; SP_SET_PARA_VALUE(2,'DSC_N_POOLS',MEMORY_N_POOLS); IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='DSC_GBS_REVOKE_OPT') THEN SP_SET_PARA_VALUE(2,'DSC_GBS_REVOKE_OPT',0); END IF; SP_SET_PARA_VALUE(2,'DSC_HALT_SYNC',0); SP_SET_PARA_VALUE(2,'DSC_N_CTLS',50000); SP_SET_PARA_VALUE(2,'DSC_ENABLE_MONITOR',0); SP_SET_PARA_VALUE(2,'TRX_DICT_LOCK_NUM',5); SP_SET_PARA_VALUE(2,'DIRECT_IO',1); END IF; ELSE --修改cpu相关参数 PRINT 'SP_SET_PARA_VALUE(2,''WORKER_THREADS'','||v_cpus||');'; PRINT 'SP_SET_PARA_VALUE(2,''TASK_THREADS'','||TASK_THREADS||');'; PRINT 'SP_SET_PARA_VALUE(2,''IO_THR_GROUPS'','||IO_THR_GROUPS||');'; --修改内存池相关参数 PRINT 'SP_SET_PARA_VALUE(2,''MAX_OS_MEMORY'', '||mem_per||');'; PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_POOL'', '||MEMORY_POOL||');'; PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_N_POOLS'', '||MEMORY_N_POOLS||');'; PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_TARGET'', '||MEMORY_TARGET||');'; --修改缓冲区相关参数 PRINT 'SP_SET_PARA_VALUE(2,''BUFFER'', '||BUFFER||');'; --新版本已去掉MAX_BUFFER参数,如果存在就修改 IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='MAX_BUFFER') THEN PRINT 'SP_SET_PARA_VALUE(2,''MAX_BUFFER'', '||MAX_BUFFER||');'; END IF; PRINT 'SP_SET_PARA_VALUE(2,''BUFFER_POOLS'', '||BUFFER_POOLS||');'; PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE'', '||RECYCLE||');'; PRINT 'SP_SET_PARA_VALUE(2,''RECYCLE_POOLS'', '||RECYCLE_POOLS||');'; --修改fast_pool相关参数,如果是dsc环境,适当放小,以免影响启动速度 IF is_dsc= 1 THEN PRINT 'SP_SET_PARA_VALUE(2,''FAST_POOL_PAGES'', 10000);'; PRINT 'SP_SET_PARA_VALUE(2,''FAST_ROLL_PAGES'', 3000);'; ELSE PRINT 'SP_SET_PARA_VALUE(2,''FAST_POOL_PAGES'', '||FAST_POOL_PAGES||');'; PRINT 'SP_SET_PARA_VALUE(2,''FAST_ROLL_PAGES'', '||FAST_ROLL_PAGES||');'; --如果不是dsc环境,开启热页动态加载,关闭预读 PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_FREQROOTS'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''MULTI_PAGE_GET_NUM'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_SCAN_NUM'',0);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_EXTENT_NUM'',0);'; END IF; --修改内存检测参数为1 PRINT 'SP_SET_PARA_VALUE(2,''MEMORY_MAGIC_CHECK'', 1);'; --修改HASH相关参数 PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_GLOBAL_SIZE'', '||HJ_BUF_GLOBAL_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(1,''HJ_BUF_SIZE'', '||HJ_BUF_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_GLOBAL_SIZE'','||HAGR_BUF_GLOBAL_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(1,''HAGR_BUF_SIZE'', '||HAGR_BUF_SIZE||');'; --修改排序相关参数 PRINT 'SP_SET_PARA_VALUE(2,''SORT_FLAG'','||SORT_FLAG||');'; PRINT 'SP_SET_PARA_VALUE(2,''SORT_BLK_SIZE'','||SORT_BLK_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_SIZE'', '||SORT_BUF_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(2,''SORT_BUF_GLOBAL_SIZE'', '||SORT_BUF_GLOBAL_SIZE||');'; --修改其他内存参数 PRINT 'SP_SET_PARA_VALUE(2,''RLOG_POOL_SIZE'', '||RLOG_POOL_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(2,''CACHE_POOL_SIZE'', '||CACHE_POOL_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(2,''DICT_BUF_SIZE'', '||DICT_BUF_SIZE||');'; PRINT 'SP_SET_PARA_VALUE(2,''VM_POOL_TARGET'', 16384);'; PRINT 'SP_SET_PARA_VALUE(2,''SESS_POOL_TARGET'', 16384);'; --修改实例相关参数 PRINT 'SP_SET_PARA_VALUE(2,''USE_PLN_POOL'', 1);'; PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_MONITOR'', 1);'; PRINT 'SP_SET_PARA_VALUE(2,''SVR_LOG'', 0);'; PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SIZE'', 1024);'; PRINT 'SP_SET_PARA_VALUE(2,''TEMP_SPACE_LIMIT'', 102400);'; PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSIONS'', 15000);'; PRINT 'SP_SET_PARA_VALUE(2,''MAX_SESSION_STATEMENT'', 20000);'; --性能要求高且大字段较少的业务场景建议设置为1,大字段多的场景设置为0 if pk_cluster_mode = 1 then PRINT 'SP_SET_PARA_VALUE(2,''PK_WITH_CLUSTER'', 1);'; else PRINT 'SP_SET_PARA_VALUE(2,''PK_WITH_CLUSTER'', 0);'; end if; PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_ENCRYPT'',0);'; --修改优化器相关参数 PRINT 'SP_SET_PARA_VALUE(2,''OLAP_FLAG'',2);'; PRINT 'SP_SET_PARA_VALUE(2,''VIEW_PULLUP_FLAG'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''OPTIMIZER_MODE'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''ADAPTIVE_NPLN_FLAG'',0);'; --开启并行PURGE PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_PURGE_FLAG'',1);'; --开启手动并行 PRINT 'SP_SET_PARA_VALUE(2,''PARALLEL_POLICY'',2);'; --UNDO_RETENTION如果放大,可以适当调大UNDO_EXTENT_NUM。负载高的时候,减少文件系统的申请/释放操作。 PRINT 'SP_SET_PARA_VALUE(2,''UNDO_EXTENT_NUM'',16);'; --开启INJECT HINT功能 PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_INJECT_HINT'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''BTR_SPLIT_MODE'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''FAST_LOGIN'',1);'; --关闭参数监控 PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_MONITOR_BP'',0);'; IF is_dsc= 1 THEN PRINT 'SP_SET_PARA_VALUE(2,''ENABLE_FREQROOTS'',0);'; --2022年5月月度版以后版本放开数据页预加载参数 IF exists(select 1 from v$version where banner like '%-%' and REGEXP_SUBSTR(banner,'[^-]+',1,2)>='2022-05-25' and REGEXP_SUBSTR(banner,'[^-]+',1,3)>=161267) THEN PRINT 'SP_SET_PARA_VALUE(2,''MULTI_PAGE_GET_NUM'',16);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_SCAN_NUM'',4);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_EXTENT_NUM'',5);'; ELSE PRINT 'SP_SET_PARA_VALUE(2,''MULTI_PAGE_GET_NUM'',1);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_SCAN_NUM'',0);'; PRINT 'SP_SET_PARA_VALUE(2,''PRELOAD_EXTENT_NUM'',0);'; END IF; PRINT 'SP_SET_PARA_VALUE(2,''DSC_N_POOLS'',' ||MEMORY_N_POOLS ||');'; IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='DSC_GBS_REVOKE_OPT') THEN PRINT 'SP_SET_PARA_VALUE(2,''DSC_GBS_REVOKE_OPT'',0);'; END IF; PRINT 'SP_SET_PARA_VALUE(2,''DSC_HALT_SYNC'',0);'; PRINT 'SP_SET_PARA_VALUE(2,''DSC_N_CTLS'',50000);'; PRINT 'SP_SET_PARA_VALUE(2,''DSC_ENABLE_MONITOR'',0);'; PRINT 'SP_SET_PARA_VALUE(2,''TRX_DICT_LOCK_NUM'',5);'; PRINT 'SP_SET_PARA_VALUE(2,''DIRECT_IO'',1);'; END IF; END IF; select MEMORY_TARGET+BUFFER+RECYCLE+HJ_BUF_GLOBAL_SIZE+HAGR_BUF_GLOBAL_SIZE+CACHE_POOL_SIZE +DICT_BUF_SIZE+SORT_BUF_GLOBAL_SIZE+RLOG_POOL_SIZE; exception when others then raise_application_error (-20001,substr( ' 执行失败, '||SQLCODE||' '||SQLERRM||' '||dbms_utility.format_error_backtrace , 1, 400)); <<return_2000>> null; end; /

脚本理解(DeepSeek自动生成)

以下是对该达梦数据库自动参数调整脚本的逐层解析,帮助您全面理解其设计逻辑和实现机制:


一、脚本核心目标

自动化优化达梦数据库(DM8)的关键参数,根据硬件资源(CPU/内存)和业务场景(OLTP/OLAP)动态计算并设置最佳配置,适用于普通实例和DSC集群环境。


二、关键控制参数

参数名 类型 说明
exec_mode int 执行模式:0-直接修改参数,1-仅打印修改语句(需手动调整v_mem_mbv_cpus
is_dsc int 是否DSC集群:0-否,1-是(影响内存池和预加载策略)
mem_per int 分配给数据库的内存百分比(默认90%)
v_mem_mb int 手动模式下的总内存(MB)
v_cpus int 手动模式下的CPU核数
sort_mode int 排序模式:0-高并发OLTP(小排序缓存),1-OLAP/一般业务(大缓存)
pk_cluster_mode int 主键聚集模式:0-大字段场景,1-高性能小字段场景

三、核心算法逻辑

1. 资源自动检测(exec_mode=0时)

SELECT TOP 1 N_CPU, TOTAL_PHY_SIZE/1024/1024 INTO v_cpus, v_mem_mb FROM V$SYSTEMINFO; -- 获取实际CPU核数和物理内存

2. 内存分配公式

v_mem_mb = ROUND(总内存 * mem_per%, -3); -- 按千位取整 IF v_mem_mb >512GB THEN v_mem_mb *=0.8; -- 超大内存保留20%给系统 END IF;

3. 参数动态计算

参数组 计算公式/策略
CPU相关 TASK_THREADS=416,`IO_THR_GROUPS`=28(根据CPU核数分段设置)
缓冲区 BUFFER=总内存×40%,RECYCLE=总内存×4%,BUFFER_POOLS取质数优化并发访问
内存池 按总内存分档(<16GB/16~64GB/>64GB),设置不同MEMORY_POOLMEMORY_N_POOLS
排序/HASH SORT_BUF_GLOBAL_SIZEHJ_BUF_GLOBAL_SIZE按内存比例分配,OLTP模式缩小单个排序缓存

四、关键技术点

1. 质数优化并发(关键代码段)

-- 生成质数表(2~100) WITH t AS (SELECT ROWNUM rn FROM dual CONNECT BY LEVEL <= 100), t1 AS (SELECT * FROM t WHERE rn>1 MINUS SELECT ta.rn*tb.rn FROM t ta, t tb WHERE ta.rn<=tb.rn) -- 选择最接近且<=目标值的质数 SELECT TOP 1 rn INTO BUFFER_POOLS FROM t1 WHERE rn > v_mem_mb/800 ORDER BY 1;

设计意图:使用质数作为BUFFER_POOLS可减少缓存区争用,提升高并发下的锁效率。

2. 安全备份机制

CREATE TABLE BAK_DMINI_... AS SELECT * FROM v$dm_ini; -- 备份当前参数

作用:在执行前保存原始参数,便于异常回滚。

3. DSC集群特殊处理

IF is_dsc=1 THEN SET FAST_POOL_PAGES=10000; -- 减小预加载页数 SET ENABLE_FREQROOTS=0; -- 关闭热页动态加载 END IF;

原因:DSC环境需避免频繁内存操作影响节点间同步性能。


五、参数设置策略

1. 性能关键参数

参数 推荐值 作用
WORKER_THREADS =v_cpus 工作线程数,充分利用CPU
BUFFER 总内存×40% 数据缓存池大小,决定热点数据命中率
SORT_FLAG 0或1 排序算法模式:0-内存优先,1-磁盘优化

2. 安全相关参数

SP_SET_PARA_VALUE(2,'ENABLE_ENCRYPT',0); -- 关闭透明加密(按需开启) SP_SET_PARA_VALUE(2,'MEMORY_MAGIC_CHECK',1); -- 开启内存校验

3. 运维辅助参数

SP_SET_PARA_VALUE(2,'SVR_LOG',0); -- 关闭服务端日志(避免I/O压力) SP_SET_PARA_VALUE(2,'ENABLE_MONITOR',1); -- 开启性能监控

六、异常处理逻辑

1. 错误捕获

EXCEPTION WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20001, ...); -- 统一抛出可读错误

作用:防止脚本中断导致参数处于中间状态。

2. 已知问题规避

-- 检查MAX_BUFFER是否存在(新版本已移除) IF EXISTS (SELECT * FROM V$DM_INI WHERE PARA_NAME='MAX_BUFFER') THEN ... END IF;

七、使用建议

  1. 测试环境验证

    • 先设置exec_mode=1生成参数修改语句,人工审核后再执行。
    • 使用v$dm_ini对比修改前后差异。
  2. 监控调整

    • 关注V$BUFFERPOOLV$MEM_POOL视图,观察缓冲区命中率和内存使用。
    • 根据实际负载微调BUFFER_POOLSRECYCLE_POOLS
  3. 版本适配

    • 注意达梦不同版本参数差异(如MAX_BUFFER已废弃)。

八、执行流程图示

graph TD
    A[开始] --> B{exec_mode=0?}
    B -->|是| C[自动检测CPU/内存]
    B -->|否| D[使用手动输入参数]
    C --> E[计算总内存分配]
    D --> E
    E --> F[分档计算内存池参数]
    F --> G[生成质数优化BUFFER_POOLS]
    G --> H[设置CPU相关参数]
    H --> I[配置排序/HASH缓存]
    I --> J[备份当前参数]
    J --> K{is_dsc=1?}
    K -->|是| L[应用DSC专用配置]
    K -->|否| M[应用单机优化]
    L --> N[提交所有参数修改]
    M --> N
    N --> O[结束]

通过以上解析,您应该能清晰理解该脚本如何根据硬件资源和业务需求动态优化数据库参数。实际使用时需结合监控数据持续调优。

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服