外观
DM 实例结构
实例与数据库的关系
| 概念 | 定义 | 关系 |
|---|---|---|
| 实例 | 运行中的数据库程序及其占用的系统资源 | 一个实例可以挂载一个数据库 |
| 数据库 | 存储在磁盘上的数据文件、日志文件和控制文件的集合 | 一个数据库可以被多个实例挂载(如集群环境) |
实例的生命周期
- 启动阶段:加载配置文件,分配内存,启动进程,挂载数据库
- 运行阶段:处理客户端请求,执行SQL语句,管理数据库对象
- 关闭阶段:停止客户端连接,刷新内存数据到磁盘,释放资源,关闭进程
实例组成
DM 数据库实例主要由以下几个部分组成:
- 内存结构:实例运行时占用的内存空间,包括各种缓冲区、缓存和内存池
- 进程结构:实例运行时启动的各种进程和线程
- 存储结构:实例管理的磁盘文件,包括数据文件、日志文件和控制文件
- 元数据:描述数据库对象的数据,存储在系统表空间中
内存结构
DM 数据库实例的内存结构分为多个区域,每个区域有特定的用途和管理方式。
核心内存组件
| 内存组件 | 用途 | 配置参数 |
|---|---|---|
| 内存池(MEMORY_POOL) | 分配内部对象,如会话、事务等 | MEMORY_POOL |
| 数据缓冲区(BUFFER) | 缓存数据页,减少磁盘 I/O | BUFFER, BUFFER_POOLS |
| 回收缓冲区(RECYCLE) | 缓存不常用的数据页 | RECYCLE |
| 大字段缓冲区(HUGE_BUFFER) | 缓存大字段数据 | HUGE_BUFFER |
| 日志缓冲区(RLOG_POOL) | 缓存重做日志,提高写入效率 | RLOG_POOL_SIZE |
| 字典缓冲区(DICT_BUF) | 缓存数据字典信息 | DICT_BUF_SIZE |
| 排序缓冲区(SORT_BUF) | 执行排序操作时使用 | SORT_BUF_SIZE |
| 哈希连接缓冲区(HJ_BUF) | 执行哈希连接操作时使用 | HJ_BUF_SIZE |
| 会话栈(SESSION_STACK) | 存储会话相关信息 | MAX_SESSION_STACK_SIZE |
内存分配管理
DM 数据库使用动态内存分配机制,根据实例负载自动调整内存使用。内存分配遵循以下原则:
- 预分配:启动时预分配一部分内存,如内存池、数据缓冲区等
- 动态扩展:根据需要动态扩展内存,如会话栈、排序缓冲区等
- 内存回收:定期回收不再使用的内存,提高内存利用率
- 内存限制:通过配置参数限制各内存组件的最大使用量
内存监控
可以通过以下方式监控内存使用情况:
sql
-- 查询内存使用情况
SELECT * FROM V$MEMORY;
-- 查询数据缓冲区使用情况
SELECT * FROM V$BUFFERPOOL;
-- 查询内存池使用情况
SELECT * FROM V$MEM_POOL;进程结构
DM 数据库实例运行时会启动多个进程,每个进程负责特定的功能。
核心进程
| 进程名称 | 用途 | 配置参数 |
|---|---|---|
| dmserver | 数据库主进程,管理整个实例 | - |
| dmwatch | 数据守护进程,实现主备同步 | - |
| dmcss | 集群同步服务进程,管理集群节点 | - |
| dmasmsvr | 共享存储管理进程,管理共享存储 | - |
| dmmonitor | 集群监控进程,监控集群状态 | - |
线程结构
DM 数据库使用多线程架构,主进程 dmserver 内部包含多个线程,负责不同的功能:
| 线程类型 | 用途 | 配置参数 |
|---|---|---|
| 工作线程(WORKER_THREADS) | 处理客户端请求,执行SQL语句 | WORKER_THREADS |
| 任务线程(TASK_THREADS) | 执行后台任务,如检查点、日志归档等 | TASK_THREADS |
| IO 线程(IO_THR_GROUPS) | 处理磁盘 I/O 操作 | IO_THR_GROUPS, IO_THR_INI |
| 定时器线程 | 处理定时任务,如死锁检查、统计信息收集等 | - |
| 网络线程 | 处理网络连接,接收客户端请求 | - |
进程间通信
DM 数据库实例内部进程间通过以下方式通信:
- 共享内存:用于进程间快速数据交换,如集群节点间的状态同步
- 信号量:用于进程间同步,如控制对共享资源的访问
- 消息队列:用于进程间消息传递,如任务调度和事件通知
- TCP/IP:用于分布式环境中节点间的通信
存储结构
DM 数据库实例管理的存储结构包括数据文件、日志文件和控制文件等。
数据文件
数据文件是存储数据库数据的主要文件,包括:
| 数据文件类型 | 用途 | 默认文件名 |
|---|---|---|
| 系统表空间文件 | 存储系统表和数据字典 | SYSTEM.DBF |
| 回滚表空间文件 | 存储回滚数据 | ROLL.DBF |
| 临时表空间文件 | 存储临时数据 | TEMP.DBF |
| 主表空间文件 | 存储用户数据和对象 | MAIN.DBF |
| 用户表空间文件 | 存储特定用户的数据 | 由用户定义 |
日志文件
日志文件记录数据库的所有修改操作,用于数据恢复和主备同步:
| 日志文件类型 | 用途 | 默认文件名 |
|---|---|---|
| 重做日志文件 | 记录数据修改操作,用于崩溃恢复 | dm_实例名_0.log, dm_实例名_1.log |
| 归档日志文件 | 归档的重做日志,用于时间点恢复 | arch_实例名_时间戳.log |
| 告警日志文件 | 记录数据库告警信息 | dm_实例名_日期.log |
| 审计日志文件 | 记录数据库审计信息 | audit_实例名_日期.log |
控制文件
控制文件存储数据库的元数据和状态信息,包括:
| 控制文件类型 | 用途 | 默认文件名 |
|---|---|---|
| 控制文件 | 存储数据库结构和状态信息 | dm.ctl |
| 参数文件 | 存储数据库实例的配置参数 | dm.ini |
| 归档配置文件 | 存储归档配置信息 | dmarch.ini |
| MAL 配置文件 | 存储 MAL 系统配置信息 | dmmal.ini |
实例状态管理
DM 数据库实例有多种状态,反映了实例当前的运行情况。
实例状态
| 状态 | 描述 | 转换条件 |
|---|---|---|
| 关闭(Shutdown) | 实例未运行 | 启动实例 |
| 启动中(Starting) | 实例正在启动 | 启动完成 |
| 挂载(Mount) | 实例已启动,数据库已挂载,但未打开 | 打开数据库 |
| 打开(Open) | 实例已启动,数据库已打开,可接受客户端连接 | 关闭数据库 |
| 关闭中(Shutting Down) | 实例正在关闭 | 关闭完成 |
| 故障(Failed) | 实例异常终止 | 重启实例 |
实例启动流程
- 读取配置文件:加载 dm.ini、dmarch.ini 等配置文件
- 初始化内存结构:分配内存池、数据缓冲区等内存组件
- 启动进程和线程:启动主进程和各种工作线程
- 挂载数据库:打开控制文件,读取数据库结构信息
- 恢复数据库:执行崩溃恢复,应用重做日志
- 打开数据库:打开数据文件和日志文件,允许客户端连接
- 启动后台任务:启动检查点、日志归档等后台任务
实例关闭流程
- 拒绝新连接:不再接受新的客户端连接
- 断开现有连接:断开所有现有客户端连接
- 停止后台任务:停止检查点、日志归档等后台任务
- 刷新内存数据:将内存中的脏数据刷新到磁盘
- 关闭文件:关闭数据文件、日志文件和控制文件
- 释放资源:释放内存、进程和线程资源
- 实例终止:实例完全关闭
实例配置与管理
实例配置
实例配置主要通过 dm.ini 文件进行,包含了影响实例行为的各种参数。
核心配置参数
| 参数名 | 用途 | 默认值 |
|---|---|---|
| DB_NAME | 数据库名 | DAMENG |
| INSTANCE_NAME | 实例名 | DMSERVER |
| PORT_NUM | 监听端口 | 5236 |
| MAX_SESSIONS | 最大会话数 | 100 |
| WORKER_THREADS | 工作线程数 | 8 |
| BUFFER | 数据缓冲区大小 | 100MB |
| MEMORY_POOL | 内存池大小 | 200MB |
配置文件管理
bash
# 查看配置文件位置
$DM_HOME/data/实例名/dm.ini
# 编辑配置文件
vi $DM_HOME/data/实例名/dm.ini
# 在线修改配置参数
ALTER SYSTEM SET "BUFFER" = 2048 SPFILE;实例管理
启动实例
bash
# 使用服务脚本启动
dm_service.sh start DmService实例名
# 使用命令行工具启动
cd $DM_HOME/bin
./dmserver $DM_HOME/data/实例名/dm.ini
# 使用 disql 工具启动(仅适用于 Windows)
disql SYSDBA/SYSDBA@localhost:5236 startup关闭实例
bash
# 使用服务脚本关闭
dm_service.sh stop DmService实例名
# 使用命令行工具关闭
cd $DM_HOME/bin
./DmService实例名 stop
# 使用 disql 工具关闭
disql SYSDBA/SYSDBA@localhost:5236 shutdown重启实例
bash
# 使用服务脚本重启
dm_service.sh restart DmService实例名
# 先关闭再启动
./DmService实例名 stop
./DmService实例名 start实例监控
命令行监控
bash
# 查看实例状态
dm_service.sh status DmService实例名
# 查看进程状态
ps -ef | grep dmserver
# 查看端口监听
netstat -an | grep 5236SQL 监控
sql
-- 查询实例状态
SELECT STATUS$ FROM V$INSTANCE;
-- 查询会话信息
SELECT * FROM V$SESSION;
-- 查询事务信息
SELECT * FROM V$TRANSACTION;
-- 查询内存使用情况
SELECT * FROM V$MEMORY;实例性能优化
内存优化
- 调整数据缓冲区大小:根据业务负载和内存情况调整 BUFFER 参数
- 优化缓冲区个数:设置 BUFFER_POOLS 为 CPU 核心数的 1-2 倍
- 调整日志缓冲区大小:根据事务频率调整 RLOG_POOL_SIZE 参数
- 优化会话栈大小:根据查询复杂度调整 MAX_SESSION_STACK_SIZE 参数
进程和线程优化
- 调整工作线程数:设置 WORKER_THREADS 为 CPU 核心数的 1-2 倍
- 调整任务线程数:设置 TASK_THREADS 为 CPU 核心数的 1/2
- 优化 IO 线程:根据存储设备性能调整 IO_THR_GROUPS 和 IO_THR_INI 参数
存储优化
- 使用 SSD 存储:提高数据读写性能
- 分离数据文件和日志文件:减少 I/O 争用
- 优化数据文件大小:根据业务需求设置合适的文件大小
- 启用归档模式:确保数据安全,便于恢复
实例高可用性
主备架构
DM 数据库支持主备架构,通过 DMDataWatch 实现数据同步和自动故障切换:
- 主库:处理所有写操作,生成重做日志
- 备库:接收主库的重做日志,应用到备库,保持数据一致
- 监控节点:监控主备库状态,实现自动故障切换
集群架构
DM 数据库支持多种集群架构,提高实例的可用性和扩展性:
| 集群类型 | 架构 | 优势 |
|---|---|---|
| DMDSC | 共享存储集群 | 高可用、负载均衡、无单点故障 |
| DMDataWatch | 主备集群 | 数据同步、自动故障切换、灾备 |
| DMRAC | 实时应用集群 | 高可用、高性能、易扩展 |
版本差异
DM 7 vs DM 8 实例结构差异
| 差异点 | DM 7 | DM 8 |
|---|---|---|
| 内存结构 | 相对简单,内存组件较少 | 更复杂,支持更多内存组件 |
| 线程架构 | 基于线程池,工作线程数固定 | 动态线程池,支持自适应调整 |
| 存储结构 | 数据文件格式较简单 | 优化了数据文件格式,提高了存储效率 |
| 实例管理 | 命令行管理为主 | 提供了更丰富的管理工具和 API |
| 高可用支持 | 基础的主备架构 | 支持 DMDSC、DMDataWatch、DMRAC 等多种高可用架构 |
DM 8.1 新特性
- 优化了内存管理,提高了内存利用率
- 增强了线程池,支持动态调整线程数
- 改进了实例启动和关闭流程,提高了可靠性
- 增强了实例监控,提供了更多监控指标
- 优化了实例恢复机制,提高了恢复速度
常见问题(FAQ)
Q1: 如何查看 DM 数据库实例的状态?
A1: 可以通过以下方式查看:
- 命令行:
dm_service.sh status DmService实例名 - SQL 查询:
SELECT STATUS$ FROM V$INSTANCE; - 管理工具:通过 DM 管理工具查看实例状态
Q2: 如何修改 DM 数据库实例的配置参数?
A2: 可以通过以下方式修改:
- 直接编辑 dm.ini 文件,修改后需要重启实例
- 使用 ALTER SYSTEM 命令在线修改,部分参数可以立即生效
- 通过 DM 管理工具修改,可视化操作更方便
Q3: 如何优化 DM 数据库实例的性能?
A3: 可以从以下几个方面优化:
- 调整内存参数,如 BUFFER、MEMORY_POOL 等
- 优化进程和线程参数,如 WORKER_THREADS、IO_THR_GROUPS 等
- 优化存储结构,使用 SSD 存储,分离数据文件和日志文件
- 优化 SQL 语句,创建合适的索引
- 定期收集统计信息,更新数据字典
Q4: 如何实现 DM 数据库实例的高可用?
A4: 可以采用以下高可用方案:
- DMDataWatch 主备架构,实现数据同步和自动故障切换
- DMDSC 共享存储集群,提供高可用和负载均衡
- DMRAC 实时应用集群,提高可用性和扩展性
- 结合第三方负载均衡器,实现读写分离
Q5: 实例启动失败怎么办?
A5: 可以通过以下步骤排查:
- 查看日志文件
dm_实例名_日期.log,获取详细错误信息 - 检查配置文件 dm.ini 中的参数是否正确
- 检查数据文件和日志文件是否完整
- 检查端口是否被占用
- 检查磁盘空间是否充足
- 尝试使用 mount 模式启动,检查数据库结构
Q6: 如何迁移 DM 数据库实例?
A6: 可以通过以下方式迁移:
- 备份恢复:在新服务器上恢复数据库备份
- 数据文件复制:复制数据文件、日志文件和控制文件到新服务器
- 逻辑导出导入:使用 dmfldr 或 dmp 工具导出导入数据
- 数据库链接:通过数据库链接迁移数据
Q7: 如何监控 DM 数据库实例的性能?
A7: 可以通过以下方式监控:
- 使用 DM 自带的监控视图,如 V$INSTANCE、V$SESSION、V$MEMORY 等
- 生成 AWR 报告,分析性能瓶颈
- 使用第三方监控工具,如 Prometheus、Grafana 等
- 启用慢查询日志,分析慢查询
Q8: 实例关闭时出现"等待会话断开"怎么办?
A8: 可以尝试以下解决方法:
- 等待会话自然断开
- 手动断开会话:
ALTER SYSTEM KILL SESSION '会话ID' - 使用 force 选项关闭实例:
shutdown immediate - 检查是否有长事务在执行
Q9: 如何限制 DM 数据库实例的资源使用?
A9: 可以通过以下方式限制:
- 设置内存参数的最大值,如 BUFFER、MEMORY_POOL 等
- 限制会话数:MAX_SESSIONS 参数
- 限制每个会话的资源使用:如 SORT_BUF_SIZE、HJ_BUF_SIZE 等
- 使用资源管理器,限制用户或角色的资源使用
Q10: 如何升级 DM 数据库实例?
A10: 可以通过以下步骤升级:
- 备份数据库
- 停止旧版本实例
- 安装新版本数据库软件
- 使用 dminit 工具初始化实例(可选)
- 使用 dmupg 工具升级数据库
- 启动新版本实例
- 验证升级结果
