Skip to content

DM 实例结构

实例与数据库的关系

概念定义关系
实例运行中的数据库程序及其占用的系统资源一个实例可以挂载一个数据库
数据库存储在磁盘上的数据文件、日志文件和控制文件的集合一个数据库可以被多个实例挂载(如集群环境)

实例的生命周期

  1. 启动阶段:加载配置文件,分配内存,启动进程,挂载数据库
  2. 运行阶段:处理客户端请求,执行SQL语句,管理数据库对象
  3. 关闭阶段:停止客户端连接,刷新内存数据到磁盘,释放资源,关闭进程

实例组成

DM 数据库实例主要由以下几个部分组成:

  • 内存结构:实例运行时占用的内存空间,包括各种缓冲区、缓存和内存池
  • 进程结构:实例运行时启动的各种进程和线程
  • 存储结构:实例管理的磁盘文件,包括数据文件、日志文件和控制文件
  • 元数据:描述数据库对象的数据,存储在系统表空间中

内存结构

DM 数据库实例的内存结构分为多个区域,每个区域有特定的用途和管理方式。

核心内存组件

内存组件用途配置参数
内存池(MEMORY_POOL)分配内部对象,如会话、事务等MEMORY_POOL
数据缓冲区(BUFFER)缓存数据页,减少磁盘 I/OBUFFER, 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 数据库使用动态内存分配机制,根据实例负载自动调整内存使用。内存分配遵循以下原则:

  1. 预分配:启动时预分配一部分内存,如内存池、数据缓冲区等
  2. 动态扩展:根据需要动态扩展内存,如会话栈、排序缓冲区等
  3. 内存回收:定期回收不再使用的内存,提高内存利用率
  4. 内存限制:通过配置参数限制各内存组件的最大使用量

内存监控

可以通过以下方式监控内存使用情况:

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)实例异常终止重启实例

实例启动流程

  1. 读取配置文件:加载 dm.ini、dmarch.ini 等配置文件
  2. 初始化内存结构:分配内存池、数据缓冲区等内存组件
  3. 启动进程和线程:启动主进程和各种工作线程
  4. 挂载数据库:打开控制文件,读取数据库结构信息
  5. 恢复数据库:执行崩溃恢复,应用重做日志
  6. 打开数据库:打开数据文件和日志文件,允许客户端连接
  7. 启动后台任务:启动检查点、日志归档等后台任务

实例关闭流程

  1. 拒绝新连接:不再接受新的客户端连接
  2. 断开现有连接:断开所有现有客户端连接
  3. 停止后台任务:停止检查点、日志归档等后台任务
  4. 刷新内存数据:将内存中的脏数据刷新到磁盘
  5. 关闭文件:关闭数据文件、日志文件和控制文件
  6. 释放资源:释放内存、进程和线程资源
  7. 实例终止:实例完全关闭

实例配置与管理

实例配置

实例配置主要通过 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 5236

SQL 监控

sql
-- 查询实例状态
SELECT STATUS$ FROM V$INSTANCE;

-- 查询会话信息
SELECT * FROM V$SESSION;

-- 查询事务信息
SELECT * FROM V$TRANSACTION;

-- 查询内存使用情况
SELECT * FROM V$MEMORY;

实例性能优化

内存优化

  1. 调整数据缓冲区大小:根据业务负载和内存情况调整 BUFFER 参数
  2. 优化缓冲区个数:设置 BUFFER_POOLS 为 CPU 核心数的 1-2 倍
  3. 调整日志缓冲区大小:根据事务频率调整 RLOG_POOL_SIZE 参数
  4. 优化会话栈大小:根据查询复杂度调整 MAX_SESSION_STACK_SIZE 参数

进程和线程优化

  1. 调整工作线程数:设置 WORKER_THREADS 为 CPU 核心数的 1-2 倍
  2. 调整任务线程数:设置 TASK_THREADS 为 CPU 核心数的 1/2
  3. 优化 IO 线程:根据存储设备性能调整 IO_THR_GROUPS 和 IO_THR_INI 参数

存储优化

  1. 使用 SSD 存储:提高数据读写性能
  2. 分离数据文件和日志文件:减少 I/O 争用
  3. 优化数据文件大小:根据业务需求设置合适的文件大小
  4. 启用归档模式:确保数据安全,便于恢复

实例高可用性

主备架构

DM 数据库支持主备架构,通过 DMDataWatch 实现数据同步和自动故障切换:

  1. 主库:处理所有写操作,生成重做日志
  2. 备库:接收主库的重做日志,应用到备库,保持数据一致
  3. 监控节点:监控主备库状态,实现自动故障切换

集群架构

DM 数据库支持多种集群架构,提高实例的可用性和扩展性:

集群类型架构优势
DMDSC共享存储集群高可用、负载均衡、无单点故障
DMDataWatch主备集群数据同步、自动故障切换、灾备
DMRAC实时应用集群高可用、高性能、易扩展

版本差异

DM 7 vs DM 8 实例结构差异

差异点DM 7DM 8
内存结构相对简单,内存组件较少更复杂,支持更多内存组件
线程架构基于线程池,工作线程数固定动态线程池,支持自适应调整
存储结构数据文件格式较简单优化了数据文件格式,提高了存储效率
实例管理命令行管理为主提供了更丰富的管理工具和 API
高可用支持基础的主备架构支持 DMDSC、DMDataWatch、DMRAC 等多种高可用架构

DM 8.1 新特性

  • 优化了内存管理,提高了内存利用率
  • 增强了线程池,支持动态调整线程数
  • 改进了实例启动和关闭流程,提高了可靠性
  • 增强了实例监控,提供了更多监控指标
  • 优化了实例恢复机制,提高了恢复速度

常见问题(FAQ)

Q1: 如何查看 DM 数据库实例的状态?

A1: 可以通过以下方式查看:

  1. 命令行:dm_service.sh status DmService实例名
  2. SQL 查询:SELECT STATUS$ FROM V$INSTANCE;
  3. 管理工具:通过 DM 管理工具查看实例状态

Q2: 如何修改 DM 数据库实例的配置参数?

A2: 可以通过以下方式修改:

  1. 直接编辑 dm.ini 文件,修改后需要重启实例
  2. 使用 ALTER SYSTEM 命令在线修改,部分参数可以立即生效
  3. 通过 DM 管理工具修改,可视化操作更方便

Q3: 如何优化 DM 数据库实例的性能?

A3: 可以从以下几个方面优化:

  1. 调整内存参数,如 BUFFER、MEMORY_POOL 等
  2. 优化进程和线程参数,如 WORKER_THREADS、IO_THR_GROUPS 等
  3. 优化存储结构,使用 SSD 存储,分离数据文件和日志文件
  4. 优化 SQL 语句,创建合适的索引
  5. 定期收集统计信息,更新数据字典

Q4: 如何实现 DM 数据库实例的高可用?

A4: 可以采用以下高可用方案:

  1. DMDataWatch 主备架构,实现数据同步和自动故障切换
  2. DMDSC 共享存储集群,提供高可用和负载均衡
  3. DMRAC 实时应用集群,提高可用性和扩展性
  4. 结合第三方负载均衡器,实现读写分离

Q5: 实例启动失败怎么办?

A5: 可以通过以下步骤排查:

  1. 查看日志文件 dm_实例名_日期.log,获取详细错误信息
  2. 检查配置文件 dm.ini 中的参数是否正确
  3. 检查数据文件和日志文件是否完整
  4. 检查端口是否被占用
  5. 检查磁盘空间是否充足
  6. 尝试使用 mount 模式启动,检查数据库结构

Q6: 如何迁移 DM 数据库实例?

A6: 可以通过以下方式迁移:

  1. 备份恢复:在新服务器上恢复数据库备份
  2. 数据文件复制:复制数据文件、日志文件和控制文件到新服务器
  3. 逻辑导出导入:使用 dmfldr 或 dmp 工具导出导入数据
  4. 数据库链接:通过数据库链接迁移数据

Q7: 如何监控 DM 数据库实例的性能?

A7: 可以通过以下方式监控:

  1. 使用 DM 自带的监控视图,如 V$INSTANCE、V$SESSION、V$MEMORY 等
  2. 生成 AWR 报告,分析性能瓶颈
  3. 使用第三方监控工具,如 Prometheus、Grafana 等
  4. 启用慢查询日志,分析慢查询

Q8: 实例关闭时出现"等待会话断开"怎么办?

A8: 可以尝试以下解决方法:

  1. 等待会话自然断开
  2. 手动断开会话:ALTER SYSTEM KILL SESSION '会话ID'
  3. 使用 force 选项关闭实例:shutdown immediate
  4. 检查是否有长事务在执行

Q9: 如何限制 DM 数据库实例的资源使用?

A9: 可以通过以下方式限制:

  1. 设置内存参数的最大值,如 BUFFER、MEMORY_POOL 等
  2. 限制会话数:MAX_SESSIONS 参数
  3. 限制每个会话的资源使用:如 SORT_BUF_SIZE、HJ_BUF_SIZE 等
  4. 使用资源管理器,限制用户或角色的资源使用

Q10: 如何升级 DM 数据库实例?

A10: 可以通过以下步骤升级:

  1. 备份数据库
  2. 停止旧版本实例
  3. 安装新版本数据库软件
  4. 使用 dminit 工具初始化实例(可选)
  5. 使用 dmupg 工具升级数据库
  6. 启动新版本实例
  7. 验证升级结果