基于 CentOS 7 虚拟机环境(4核8G内存),已安装 DM 数据库,实例名 DMTEST
| 项目 | 配置 |
|---|---|
| 操作系统 | CentOS Linux 7 (Core) |
| CPU | 4核 Intel i7-14650HX |
| 内存 | 7.6G 总内存,可用约 6.3G |
| 数据目录 | /dmdata (30G) |
| 数据库实例 | DMTEST |
| 服务名 | DmServiceDMTEST |
| DM安装目录 | /home/dmdba/dmdbms |
# 设置环境变量
export DM_HOME=/home/dmdba/dmdbms
export DM_DATA=/dmdata
# 查看实例状态
systemctl status DmServiceDMTEST
DM数据库实例的内存结构如下图所示:
| 序号 | 内存区域 | 参数名 | 作用 | 说明 |
|---|---|---|---|---|
| 1 | 数据缓冲区 | BUFFER | 缓存数据页,减少磁盘I/O | 最大内存区域,建议占物理内存40%-60% |
| 2 | 字典缓冲区 | DICT_BUF_SIZE | 缓存表结构、索引等元数据 | 提升DDL/DML元数据访问速度 |
| 3 | SQL缓冲区 | CACHE_POOL_SIZE | 缓存SQL执行计划和结果集 | 减少SQL重复解析开销 |
| 4 | 重做日志缓冲区 | RLOG_BUF_SIZE | 缓存事务日志 | 单位是页(默认32KB/页),影响事务提交性能 |
| 5 | 排序缓冲区 | SORT_BUF_SIZE | ORDER BY / GROUP BY等排序操作 | 排序操作专用内存 |
| 6 | 回收缓冲区 | RECYCLE | 缓存被淘汰的数据页 | 用于快速重新加载热数据 |
| 参数名 | 作用 | 当前值 | 单位 |
|---|---|---|---|
| BUFFER | 数据缓冲区 | 2000 | MB |
| DICT_BUF_SIZE | 字典缓冲区 | 128 | MB |
| CACHE_POOL_SIZE | SQL缓冲区 | 200 | MB |
| RLOG_BUF_SIZE | 重做日志缓冲区 | 1024 | 页(约32MB) |
| RLOG_POOL_SIZE | 重做日志池 | 256 | MB |
| SORT_BUF_SIZE | 排序缓冲区 | 10 | MB |
| RECYCLE | 回收缓冲区 | 240 | MB |
| WORKER_THREADS | 工作线程数 | 4 | 个 |
| MAX_SESSIONS | 最大会话数 | 100 | 个 |
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@localhost:5236
-- 查看所有参数
SELECT * FROM V$PARAMETER;
-- 查看参数总数
SELECT COUNT(*) FROM V$PARAMETER;
-- 查看关键内存参数
SELECT
NAME,
VALUE,
SYS_VALUE,
FILE_VALUE,
DESCRIPTION
FROM V$PARAMETER
WHERE NAME IN (
'BUFFER', -- 数据缓冲区(MB)
'DICT_BUF_SIZE', -- 字典缓冲区(MB)
'RLOG_BUF_SIZE', -- 重做日志缓冲区(页数)
'RLOG_POOL_SIZE', -- 重做日志池(MB)
'SORT_BUF_SIZE', -- 排序缓冲区(MB)
'CACHE_POOL_SIZE', -- SQL缓冲区(MB)
'RECYCLE', -- 回收缓冲区(MB)
'MAX_SESSIONS', -- 最大会话数
'WORKER_THREADS' -- 工作线程数
);
| TYPE值 | 含义 | 说明 |
|---|---|---|
| READ ONLY | 只读参数 | 不可修改 |
| IN FILE | 静态参数 | 修改后需重启 |
| SYS | 系统动态参数 | 修改后立即生效 |
| SESSION | 会话级参数 | 仅影响当前会话 |
-- 查看参数类型分布
SELECT TYPE, COUNT(*)
FROM V$PARAMETER
GROUP BY TYPE;
| 方式 | 命令 | 生效时机 | 适用场景 |
|---|---|---|---|
| 会话级 | SP_SET_PARA_VALUE(1, '参数', 值) |
当前会话 | 临时测试 |
| 系统级 | SP_SET_PARA_VALUE(2, '参数', 值) |
立即生效 | 生产环境调优 |
| 静态 | SP_SET_PARA_VALUE(0, '参数', 值) |
重启后生效 | 永久配置 |
-- 语法说明
-- SP_SET_PARA_VALUE(类型, '参数名', 新值)
-- 类型: 0=静态, 1=会话, 2=系统动态
根据 7.6G 内存环境,目标参数配置如下:
| 参数 | 当前值 | 目标值 | 调整理由 |
|---|---|---|---|
| BUFFER | 2000 | 3500 | 提高数据缓存命中率 |
| DICT_BUF_SIZE | 128 | 256 | 减少元数据磁盘读取 |
| RLOG_BUF_SIZE | 1024 | 2048 | 减少日志写入频率 |
| RLOG_POOL_SIZE | 256 | 512 | 支持更大并发事务 |
| SORT_BUF_SIZE | 10 | 4 | 避免内存浪费 |
| CACHE_POOL_SIZE | 200 | 256 | 缓存更多执行计划 |
| RECYCLE | 240 | 400 | 提升热数据重新加载速度 |
| WORKER_THREADS | 4 | 8 | 充分利用4核CPU |
| MAX_SESSIONS | 100 | 150 | 支持更多并发连接 |
# 连接数据库执行调优
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@localhost:5236
-- 1. 备份当前参数(记录原值)
-- 建议先记录当前值,以便回滚
-- 2. 动态调整参数(立即生效)
SP_SET_PARA_VALUE(2, 'BUFFER', 3500);
SP_SET_PARA_VALUE(2, 'DICT_BUF_SIZE', 256);
SP_SET_PARA_VALUE(2, 'RLOG_BUF_SIZE', 2048);
SP_SET_PARA_VALUE(2, 'RLOG_POOL_SIZE', 512);
SP_SET_PARA_VALUE(2, 'SORT_BUF_SIZE', 4);
SP_SET_PARA_VALUE(2, 'CACHE_POOL_SIZE', 256);
SP_SET_PARA_VALUE(2, 'RECYCLE', 400);
SP_SET_PARA_VALUE(2, 'WORKER_THREADS', 8);
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 150);
-- 3. 验证调整结果
SELECT NAME, VALUE, SYS_VALUE, FILE_VALUE
FROM V$PARAMETER
WHERE NAME IN ('BUFFER', 'DICT_BUF_SIZE', 'WORKER_THREADS', 'MAX_SESSIONS');
cat > /tmp/db_tune.sql << 'EOF'
SET ECHO ON;
PROMPT ========== 调优前参数值 ==========
SELECT NAME, VALUE FROM V$PARAMETER
WHERE NAME IN ('BUFFER','DICT_BUF_SIZE','RLOG_BUF_SIZE','RLOG_POOL_SIZE',
'SORT_BUF_SIZE','CACHE_POOL_SIZE','RECYCLE',
'WORKER_THREADS','MAX_SESSIONS');
PROMPT ========== 开始调优 ==========
SP_SET_PARA_VALUE(2, 'BUFFER', 3500);
SP_SET_PARA_VALUE(2, 'DICT_BUF_SIZE', 256);
SP_SET_PARA_VALUE(2, 'RLOG_BUF_SIZE', 2048);
SP_SET_PARA_VALUE(2, 'RLOG_POOL_SIZE', 512);
SP_SET_PARA_VALUE(2, 'SORT_BUF_SIZE', 4);
SP_SET_PARA_VALUE(2, 'CACHE_POOL_SIZE', 256);
SP_SET_PARA_VALUE(2, 'RECYCLE', 400);
SP_SET_PARA_VALUE(2, 'WORKER_THREADS', 8);
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 150);
PROMPT ========== 调优后参数值 ==========
SELECT NAME, VALUE FROM V$PARAMETER
WHERE NAME IN ('BUFFER','DICT_BUF_SIZE','RLOG_BUF_SIZE','RLOG_POOL_SIZE',
'SORT_BUF_SIZE','CACHE_POOL_SIZE','RECYCLE',
'WORKER_THREADS','MAX_SESSIONS');
PROMPT ========== 内存使用情况 ==========
SELECT POOL_NAME, TOTAL_SIZE, USED_SIZE,
ROUND(USED_SIZE/TOTAL_SIZE*100, 2) AS 使用率
FROM V$MEMORY_POOL;
PROMPT ========== 调优完成 ==========
EOF
# 执行脚本
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@localhost:5236 < /tmp/db_tune.sql
-- 特征:大量小事务,高并发,响应时间敏感
SP_SET_PARA_VALUE(2, 'BUFFER', 2048); -- 适中
SP_SET_PARA_VALUE(2, 'RLOG_BUF_SIZE', 4096); -- 大日志缓冲
SP_SET_PARA_VALUE(2, 'WORKER_THREADS', 16); -- 高并发
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 500);
SP_SET_PARA_VALUE(2, 'SORT_BUF_SIZE', 2); -- 小排序
-- 特征:大查询,复杂关联,排序量大
SP_SET_PARA_VALUE(2, 'BUFFER', 4096); -- 大缓存
SP_SET_PARA_VALUE(2, 'DICT_BUF_SIZE', 512); -- 大字典
SP_SET_PARA_VALUE(2, 'SORT_BUF_SIZE', 16); -- 大排序
SP_SET_PARA_VALUE(2, 'MAX_SESSIONS', 50);
SP_SET_PARA_VALUE(2, 'RECYCLE', 600);
grep -E "BUFFER|DICT_BUF_SIZE|WORKER_THREADS" /dmdata/data/DMTEST/dm.ini
# 重启服务
systemctl restart DmServiceDMTEST
# 验证参数是否持久化
cd /home/dmdba/dmdbms/bin
./disql SYSDBA/SYSDBA@localhost:5236 << EOF
SELECT NAME, VALUE, FILE_VALUE
FROM V$PARAMETER
WHERE NAME IN ('BUFFER', 'DICT_BUF_SIZE', 'WORKER_THREADS');
EOF
| 检查项 | 命令 | 目标 |
|---|---|---|
| BUFFER | SELECT * FROM V$PARAMETER WHERE NAME=‘BUFFER’ | 3500 |
| DICT_BUF_SIZE | SELECT * FROM V$PARAMETER WHERE NAME=‘DICT_BUF_SIZE’ | 256 |
| WORKER_THREADS | SELECT * FROM V$PARAMETER WHERE NAME='WORKER_THREADS‘ | 8 |
| 日志无报错 | grep -i -B3 -A3 error dm_*.log | 无ERROR |
调优前备份配置:
cp /dmdata/data/DMTEST/dm.ini /dmdata/data/DMTEST/dm.ini.bak
参数有单位差异:RLOG_BUF_SIZE 单位是页(默认32KB),SORT_BUF_SIZE 单位是 MB
动态参数立即生效:使用 SP_SET_PARA_VALUE(2, ...) 修改后不需要重启
系统预留内存:确保操作系统有足够内存,建议预留1-2G
文章
阅读量
获赞
