达梦数据库生产环境运维指南(持续更新)
前言
达梦数据库是什么?
想象一下:你需要管理一个国家图书馆的百万藏书,既要保证数据安全(不能丢),又要支持快速检索(查书要快),还要支持多人同时查阅(高并发)。
达梦数据库就是中国自主研发的"超级图书馆管理系统"! 它是国产数据库的代表,具备与 Oracle 类似的强大功能,但更符合中国企业的需求。
达梦数据库(DM)是武汉达梦数据库股份有限公司开发的关系型数据库,具有完全自主知识产权。在国产化浪潮下,达梦数据库被广泛应用于政府、金融、能源等关键领域。
本文档会告诉你:
- 达梦数据库核心概念
- 安装和配置
- 日常运维命令
- 性能监控
- 备份恢复
- 与 Oracle 的差异对比
目录
核心概念详解
达梦数据库架构
达梦架构是什么?
想象一下:达梦数据库就像一个"智能图书馆",有前台服务(连接管理)、索引系统(快速检索)、书库管理(数据存储)、安全门禁(权限控制)。
┌─────────────────────────────────────────────────────────────┐
│ 达梦数据库架构 │
│ │
│ ┌─────────────┐ │
│ │ 客户端 │ │
│ │ (Disql) │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ 数据库实例 (DMAP Server) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐│ │
│ │ │ 作业 │ │ 监视器 │ │ 归档 ││ │
│ │ │ 调度器 │ │ (Monitor)│ │ (ARCH) ││ │
│ │ └─────────┘ └─────────┘ └─────────┘│ │
│ └─────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────┐ │
│ │ 存储层 │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐│ │
│ │ │ System │ │ User │ │ Temp ││ │
│ │ │ Tablespace│ │ Tablespace│ │ Tablespace││ │
│ │ └─────────┘ └─────────┘ └─────────┘│ │
│ └─────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
达梦版本
| 版本 | 说明 | 适用场景 |
|---|---|---|
| DM8 标准版 | 单机版 | 开发、测试、小型应用 |
| DM8 企业版 | 支持集群 | 中大型企业 |
| DM8 安全版 | 支持国密 | 政府、军工 |
| DM8 集群版 | RAC 支持 | 关键业务 |
达梦安装
Linux 安装
# 👀 1. 下载达梦安装包
# 官网:https://www.dameng.com
# 👀 2. 创建用户(达梦不建议用 root 安装)
groupadd dinstall
useradd -g dinstall -m -d /home/dmdba -s /bin/bash dmdba
passwd dmdba
# 👀 3. 创建安装目录
mkdir -p /opt/dmdbms
chown -R dmdba:dinstall /opt/dmdbms
# 👀 4. 解压安装包
su - dmdba
tar -xvf dm8_xxxx_xxx.tar -C /opt/dmdbms
# 👀 5. 开始安装
cd /opt/dmdbms
./DMInstall.bin
# 👀 6. 配置环境变量
cat >> ~/.bash_profile << 'EOF'
export DM_HOME=/opt/dmdbms/dmdbms
export PATH=$DM_HOME/bin:$PATH
export LD_LIBRARY_PATH=$DM_HOME/bin:$LD_LIBRARY_PATH
EOF
source ~/.bash_profile
Docker 安装(快速测试)
# 👀 拉取达梦镜像
docker pull dmdbms/dm8:latest
# 👀 启动达梦容器
docker run -d \
--name dm8 \
-p 5236:5236 \
-e MODE=PRIMARY \
-v /data/dm8:/opt/dmdbms/data \
dmdbms/dm8:latest
# 👀 查看日志
docker logs -f dm8
# 👀 默认 SYSDBA 密码:SYSDBA001
数据库连接
连接工具
# 👀 1. Disql(命令行工具)
disql SYSDBA/SYSDBA001@localhost:5236
# 👀 2. 带 IP 和端口
disql SYSDBA/SYSDBA001@192.168.1.10:5236
# 👀 3. 帮助信息
disql -h
基本查询
-- 👀 查看达梦版本
SELECT * FROM V$VERSION;
-- 👀 查看数据库信息
SELECT * FROM V$DATABASE;
-- 👀 查看所有表空间
SELECT * FROM V$TABLESPACE;
-- 👀 查看当前会话
SELECT * FROM V$SESSION;
表空间管理
查看表空间
-- 👀 查看所有表空间
SELECT
NAME,
ID,
STATUS$,
TYPE$,
TOTAL_SIZE$,
FREE_SIZE$
FROM V$TABLESPACE;
-- 👀 查看表空间使用情况
SELECT
T.NAME AS tablespace_name,
TOTAL_SIZE$ * 512 / 1024 / 1024 AS "Total(MB)",
FREE_SIZE$ * 512 / 1024 / 1024 AS "Free(MB)",
(TOTAL_SIZE$ - FREE_SIZE$) * 512 / 1024 / 1024 AS "Used(MB)"
FROM V$TABLESPACE T;
创建表空间
-- 👀 创建普通表空间
CREATE TABLESPACE app_data
DATAFILE '/opt/dmdbms/data/app_data01.dbf'
SIZE 128
AUTOEXTEND ON NEXT 8 MAXSIZE 8192;
-- 👀 创建大文件表空间
CREATE BIGTABLESPACE app_big
DATAFILE '/opt/dmdbms/data/app_big01.dbf'
SIZE 1024;
-- 👀 创建临时表空间
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/opt/dmdbms/data/temp01.dbf'
SIZE 64;
修改表空间
-- 👀 添加数据文件
ALTER TABLESPACE app_data
ADD DATAFILE '/opt/dmdbms/data/app_data02.dbf'
SIZE 128;
-- 👀 修改数据文件
ALTER TABLESPACE app_data
DATAFILE '/opt/dmdbms/data/app_data01.dbf'
RESIZE 256;
-- 👀 删除表空间
DROP TABLESPACE app_data;
用户与权限
创建用户
-- 👀 创建用户
CREATE USER appuser IDENTIFIED BY "AppUser123"
DEFAULT TABLESPACE app_data
TEMPORARY TABLESPACE temp_data
QUOTA UNLIMITED ON app_data;
-- 👀 查看用户
SELECT * FROM DBA_USERS;
权限管理
-- 👀 授予权限
GRANT CONNECT, RESOURCE TO appuser;
GRANT CREATE TABLE TO appuser;
GRANT CREATE VIEW TO appuser;
-- 👀 撤销权限
REVOKE CREATE TABLE FROM appuser;
-- 👀 创建角色
CREATE ROLE app_role;
GRANT SELECT ON sys.employees TO app_role;
GRANT app_role TO appuser;
日常运维
服务管理
# 👀 查看服务状态
systemctl status DmServiceDMSERVER
# 👀 启动服务
systemctl start DmServiceDMSERVER
# 👀 停止服务
systemctl stop DmServiceDMSERVER
# 👀 重启服务
systemctl restart DmServiceDMSERVER
归档管理
-- 👀 查看归档状态
SELECT ARCH_MODE FROM V$DATABASE;
-- 👀 开启归档
ALTER DATABASE MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 👀 手动切换归档
ALTER SYSTEM SWITCH LOGFILE;
会话管理
-- 👀 查看会话
SELECT
SESSION_ID,
SQL_TEXT,
STATE,
CREATE_TIME
FROM V$SESSION;
-- 👀 杀死会话
SP_CLOSE_SESSION(session_id);
性能监控
监控指标
-- 👀 查看缓冲池命中率
SELECT
BUFFER_HIT_RATIO,
LIBRARY_HIT_RATIO,
LIBRARY_MISS_SIZE
FROM V$BUFFERPOOL;
-- 👀 查看 SQL 性能
SELECT
SQL_TEXT,
EXECUTIONS,
AVG_TIME,
CPU_TIME
FROM V$SQLSTATS
ORDER BY EXECUTIONS DESC
LIMIT 10;
-- 👀 查看等待事件
SELECT
NAME,
WAIT_TIME,
WAIT_COUNT
FROM V$SYSTEM_WAIT
ORDER BY WAIT_TIME DESC
LIMIT 10;
统计信息
-- 👀 收集表统计信息
DBMS_STATS.GATHER_TABLE_STATS(
OWNER => 'SYSDBA',
TABNAME => 'EMPLOYEES',
ESTIMATE_PERCENT => 10,
METHOD_OPT => 'FOR ALL COLUMNS SIZE AUTO'
);
-- 👀 收集索引统计
DBMS_STATS.GATHER_INDEX_STATS(
OWNER => 'SYSDBA',
INDNAME => 'EMP_IDX'
);
备份恢复
物理备份
# 👀 冷备份(需要停库)
# 1. 停止数据库
systemctl stop DmServiceDMSERVER
# 2. 备份数据文件
cp -r /opt/dmdbms/data /backup/data_$(date +%Y%m%d)
# 3. 启动数据库
systemctl start DmServiceDMSERVER
逻辑备份
# 👀 导出(Dexp)
dexp SYSDBA/SYSDBA001@localhost:5236 FILE=full.dmp LOG=full.log FULL=Y
# 👀 导入(Dimps)
dimp SYSDBA/SYSDBA001@localhost:5236 FILE=full.dmp LOG=imp.log FULL=Y
# 👀 导出特定用户
dexp SYSDBA/SYSDBA001 FILE=user.dmp SCHEMAS=APPUSER
# 👀 导出特定表
dexp SYSDBA/SYSDBA001 FILE=emp.dmp TABLES=APPUSER.EMPLOYEES
与 Oracle 对比
核心概念对比
| Oracle | 达梦 | 说明 |
|---|---|---|
| SID | INSTANCE_NAME | 实例名 |
| Tablespace | Tablespace | 表空间 |
| Datafile | Datafile | 数据文件 |
| SYSAUX | MAIN | 辅助表空间 |
| SYSTEM | SYSTEM | 系统表空间 |
| PDB | 兼容 Oracle PDB | 可插拔数据库 |
命令对比
| 操作 | Oracle | 达梦 |
|---|---|---|
| 连接 | sqlplus / as sysdba |
disql SYSDBA/SYSDBA |
| 版本 | SELECT * FROM v$version |
SELECT * FROM V$VERSION |
| 会话 | v$session |
V$SESSION |
| 表空间 | dba_tablespaces |
V$TABLESPACE |
| 用户 | dba_users |
DBA_USERS |
语法差异
-- 👀 分页查询
-- Oracle
SELECT * FROM (
SELECT rownum rn, t.* FROM employees t WHERE rownum <= 20
) WHERE rn > 10;
-- 👀 达梦(更简洁)
SELECT * FROM employees LIMIT 10 OFFSET 20;
-- 👀 递归查询
-- Oracle
SELECT * FROM employees START WITH id = 1 CONNECT BY PRIOR id = parent_id;
-- 👀 达梦(兼容 Oracle 语法)
SELECT * FROM employees START WITH id = 1 CONNECT BY PRIOR id = parent_id;
常见问题
问题 1:连接失败
现象: 无法连接到数据库
排查:
# 👀 检查服务状态
systemctl status DmServiceDMSERVER
# 👀 检查端口
netstat -an | grep 5236
# 👀 检查防火墙
firewall-cmd --list-ports
问题 2:表空间满
解决方案:
-- 👀 添加数据文件
ALTER TABLESPACE app_data ADD DATAFILE '/opt/dmdbms/data/app_data02.dbf' SIZE 128;
-- 👀 设置自动扩展
ALTER TABLESPACE app_data DATAFILE '/opt/dmdbms/data/app_data01.dbf' AUTOEXTEND ON NEXT 8 MAXSIZE 8192;
总结
核心要点
| 要点 | 关键操作 |
|---|---|
| 连接 | Disql 工具 |
| 表空间 | 创建、扩展、监控 |
| 用户 | 创建、授权 |
| 备份 | Dexp/Dimp |
| 监控 | V$ 动态视图 |
达梦优势
- 国产化支持 - 满足信创要求
- Oracle 兼容 - 迁移成本低
- 国密支持 - 安全可控
- 本地化服务 - 技术支持更方便
持续更新中… 如有问题或建议,欢迎交流讨论!
评论区