达梦 DM8 安装、实例初始化与 Oracle 兼容开发验证手册
库能启动,为什么项目还是接不上
一套 DM8 实例已经显示服务正常,Java 应用却可能在对象名大小写、空串与 NULL、分页语法或驱动加载处失败。更麻烦的是,团队直到导入数据后才发现字符集、页大小、大小写敏感或长度语义选错;这些不是改一行应用配置就能挽回的参数,往往意味着重建实例和重新迁移。
因此第一次启动不能只追求端口 5236 可连接。要把 CPU 与 OS 软件包、安装用户、实例参数、业务用户、表空间、真实 JDBC、导出恢复和清理顺序串成一次完整演练。操作前准备这些资源:
达梦在线服务平台账号,按 CPU / OS 从达梦下载中心获取对应 DM8 安装包或 Docker tar 包,并确认该介质允许的使用方式与许可证期限。Linux / Windows 安装权限;Linux 本机安装建议创建 dmdba 用户,避免 root 直接安装。Docker / Compose 仅用于学习或开发封装,前提是已取得官方或团队验收的 Docker tar 包。
预留端口 5236,共享环境不要沿用默认端口暴露给所有人。至少一种客户端:disql、DM 管理工具、DBeaver、DataGrip 或应用 JDBC。一个强密码占位符,例如 YOUR_STRONG_DM_SYSDBA_PASSWORD,真实值只放本机 .env 或密钥系统。
一套可销毁的测试数据和独立恢复实例,避免拿唯一一份导出文件做覆盖式验证。
先检查端口:
lsof -i :5236
docker version
docker compose versionWindows:
netstat -ano | findstr ":5236"如果目标是信创平台、国产 CPU 或专用 Linux 发行版,要从 达梦下载中心 选择与 CPU、OS 对应的软件包,并在目标环境重跑 smoke test。安装包与 CPU、OS、glibc 不匹配时,不要靠修改启动脚本硬凑。
主流部署方式
| 方式 | 定义 | 适用场景 | 不适合 |
|---|---|---|---|
| Linux 本机安装 | 使用官方安装包,dmdba 用户安装并配置实例 | 固定开发机、接近生产 OS、信创环境验证 | 快速清理、多版本并存 |
| Windows 本机安装 | 使用官方 Windows 包和配置助手 | 个人学习、桌面工具体验、低门槛验证 | 团队共享、CI、长期自动化 |
| Docker tar 学习环境 | 下载官方或团队验收的 Docker tar,docker load 后启动 | 快速试验、隔离环境、CI smoke | 无来源镜像、生产部署 |
| 共享开发实例 | DBA 或平台团队提供的非生产 DM | 多人联调、权限验证、兼容迁移验证 | 个人 reset、随意改兼容模式 |
| 企业非生产实例 | 与生产版本、补丁、字符集接近的测试库 | 上线前验证、迁移演练、性能预估 | 替代正式生产 runbook |
选型建议:
学习和最小接入:Windows / Linux 开发版或官方 Docker tar 学习环境。项目联调:共享开发实例,明确 owner、版本、端口、实例参数和清理策略。Oracle 迁移验证:先定 COMPATIBLE_MODE、大小写、空串 / NULL 行为和字符集,再建对象。
信创适配:必须使用目标 CPU / OS 包,不从 x86 容器得出结论。生产部署:开发验证通过后仍需独立设计授权、主备、备份、监控、容量与容灾,不能直接复制开发命令。
Linux 本机安装与初始化
Linux 上先创建 dmdba 用户、设置文件句柄、规划目录并调整权限:
groupadd dinstall
useradd -G dinstall -m -d /home/dmdba -s /bin/bash dmdba
mkdir -p /dmdata/data /dmdata/arch /dmdata/dmbak
chown -R dmdba:dinstall /dmdata/data /dmdata/arch /dmdata/dmbak
chmod -R 755 /dmdata/data /dmdata/arch /dmdata/dmbak挂载与当前 CPU、OS 匹配的安装介质后,以 dmdba 执行安装程序;安装结束还没有数据库实例,必须继续运行 dminit:
su - dmdba
cd /mnt
./DMInstall.bin -i
# 按安装器最终提示切回 root 执行,实际路径以安装目录为准
exit
/home/dmdba/dmdbms/script/root/root_installer.sh
su - dmdba
cd /home/dmdba/dmdbms/bin
./dminit help
./dminit PATH=/dmdata/data DB_NAME=DMDEV INSTANCE_NAME=DMDEV \
PORT_NUM=5236 PAGE_SIZE=16 EXTENT_SIZE=32 CASE_SENSITIVE=Y \
CHARSET=1 LENGTH_IN_CHAR=1 \
SYSDBA_PWD=YOUR_STRONG_DM_SYSDBA_PASSWORD \
SYSAUDITOR_PWD=YOUR_STRONG_DM_SYSAUDITOR_PASSWORD这里的页大小、簇大小、大小写敏感、字符集和长度语义只是演示取值,不是生产推荐值。dminit 完成后先保存实际输出与生成的 dm.ini,再前台启动一次观察日志:
./dmserver /dmdata/data/DMDEV/dm.ini看到数据库进入 OPEN 状态后另开终端连接。若路径、参数名或目录层级与当前安装包不同,以 dminit help 和实际生成目录为准;不要在不清楚实例路径时注册系统服务。
Docker tar 学习模板
如果下载中心提供对应 Docker 镜像 tar,可按实际包名导入并记录载入后的仓库名、tag 与 digest:
docker load -i dm8_xxx_single.tar
docker images | grep dm
export DM_IMAGE='dm8_single:<loaded-tag>'
docker image inspect "${DM_IMAGE}" --format '{{index .RepoDigests 0}}'下面的 Compose 只是把已验收 tar 包封装成可重复的开发环境;达梦不同介质的入口脚本、默认账号、环境变量和数据目录可能不同,先用 docker image inspect 与包内说明确认,再把模板值替换成该镜像真实契约:
services:
dm8:
image: "${DM_IMAGE}"
container_name: tool-dm8-dev
privileged: true
environment:
SYSDBA_PWD: "${DM_SYSDBA_PASSWORD}"
SYSAUDITOR_PWD: "${DM_SYSAUDITOR_PASSWORD}"
INSTANCE_NAME: "dm8"
UNICODE_FLAG: "1"
CASE_SENSITIVE: "1"
LENGTH_IN_CHAR: "1"
ports:
- "5236:5236"
volumes:
- dm8-data:/opt/dmdbms/data
healthcheck:
test:
[
"CMD-SHELL",
"/opt/dmdbms/bin/disql SYSDBA/$${SYSDBA_PWD}@127.0.0.1:5236 -e 'select 1;' >/dev/null 2>&1"
]
interval: 20s
timeout: 10s
retries: 30
start_period: 90s
volumes:
dm8-data:.env.example:
DM_IMAGE=dm8:validated
DM_SYSDBA_PASSWORD=YOUR_STRONG_DM_SYSDBA_PASSWORD
DM_SYSAUDITOR_PASSWORD=YOUR_STRONG_DM_SYSAUDITOR_PASSWORD
DM_APP_PASSWORD=YOUR_STRONG_DM_APP_PASSWORD说明:
DM_IMAGE 必须来自官方下载 tar 或团队内部验收镜像。SYSDBA_PWD / SYSAUDITOR_PWD 等变量名以当前镜像说明为准,不同 tar 包可能不同。CASE_SENSITIVE、UNICODE_FLAG、LENGTH_IN_CHAR 等初始化参数建库后不能随便改。
--privileged 常用于学习镜像,但 CI 和共享开发机要评估安全边界。初始化变量只在空数据目录首次创建实例时生效。复用旧 volume 后修改字符集、大小写或密码,不会自动重建数据库。
实例、用户和模式
达梦不是 MySQL 式“一个服务里建多个 database”的心智模型。开发文档建议按:
实例 -> 用户/模式 -> 表/视图/序列/索引开发账号示例:
CREATE TABLESPACE TS_TOOL_EFFICIENCY DATAFILE 'ts_tool_efficiency01.dbf' SIZE 128;
CREATE USER APP_TOOL_EFFICIENCY
IDENTIFIED BY "YOUR_STRONG_DM_APP_PASSWORD"
DEFAULT TABLESPACE TS_TOOL_EFFICIENCY;
GRANT CREATE SESSION TO APP_TOOL_EFFICIENCY;
GRANT CREATE TABLE TO APP_TOOL_EFFICIENCY;
GRANT CREATE SEQUENCE TO APP_TOOL_EFFICIENCY;
GRANT CREATE VIEW TO APP_TOOL_EFFICIENCY;原则:
应用不使用 SYSDBA。runtime / migration / readonly 账号分离。每个项目一个应用用户 / 模式,独立表空间或至少独立配额治理。
共享实例禁止个人随意改兼容模式和初始化参数。
初始化参数
这些参数要在建业务对象前确认:
| 参数 | 为什么重要 | 判断标准 |
|---|---|---|
| 字符集 | 影响中文、排序、导入导出 | 开发和生产一致 |
| 大小写敏感 | 影响对象名和 SQL 迁移 | Oracle 迁移、Java ORM 要先验证 |
| 页大小 / 簇大小 | 影响存储结构 | 初始化前确定 |
LENGTH_IN_CHAR | 影响字符串长度语义 | Java 字段和 Oracle 迁移要验证 |
COMPATIBLE_MODE | 影响 SQL 兼容行为 | 建业务表前确定 |
不要在已有数据后随手切兼容模式。尤其 Oracle 空串 / NULL、大小写、索引和查询行为,后改很容易把测试结果变成假象。
JDBC
应用数据源使用 DM 驱动类和 DM URL:
spring.datasource.url=jdbc:dm://localhost:5236
spring.datasource.username=APP_TOOL_EFFICIENCY
spring.datasource.password=YOUR_STRONG_DM_APP_PASSWORD
spring.datasource.driver-class-name=dm.jdbc.driver.DmDriverOracle 兼容相关要分清:
JDBC URL 的 compatibleMode=oracle 是客户端连接参数。服务端 dm.ini 的 COMPATIBLE_MODE=2 是实例级兼容模式。两者不是同一层,不要用 JDBC 参数假装改变数据库整体兼容行为。
驱动端兼容也不是无害别名。DM JDBC 编程指南说明,compatibleMode=oracle 会改变部分 JDBC 接口行为,其中包括忽略 Connection.setReadOnly(),并在 Connection.close() 前提交事务。项目若启用它,必须增加“异常关闭连接不得提交未完成事务”的反向测试,并检查连接池回收、批处理返回值、元数据类型和 LOB 偏移行为;只验证一条查询远远不够。
从 SQL 到数据页与 Redo
一条写 SQL 进入实例后,要经历解析、优化、执行、锁与事务管理。数据页通常先进入缓冲区,修改形成脏页并产生 Redo;提交、检查点与脏页刷盘不是同一时刻。实例异常重启时,Redo 用于把数据文件恢复到一致状态;数据守护则把主库 Redo 发送到备库并重演。因此“主库提交成功”“备库收到日志”“备库重演可见”是三种状态,不能用端口存活替代一致性证据。
两个 disql 会话可以做锁的正反实验。会话 A 更新后不提交:
UPDATE USER_DEMO SET USERNAME = 'held-by-a' WHERE ID = 1;会话 B 更新同一行会进入等待。此时从动态会话、事务与锁视图确认阻塞者和被阻塞者,再由会话 A ROLLBACK;预期会话 B 继续。若应用经常出现连接池耗尽,证据应优先收集活动事务、锁等待、SQL 文本和等待时长,而不是盲目扩大连接池。长事务还会推高回滚、日志、备份和主备追赶成本。
执行计划也要做成可比较实验:在固定数据分布下先对未索引字段查询并保存执行计划,再创建索引、更新统计信息、重跑同一查询。小表继续全表扫描可能是优化器的正确选择;只有当估算行数与实际分布长期偏离,或大表高选择性查询仍异常扫描时,才继续检查统计信息、隐式转换和复合索引列序。用 Hint 强行得到一个“好看计划”不能替代根因修复。
CLI 连接:
disql SYSDBA/"YOUR_STRONG_DM_SYSDBA_PASSWORD"@127.0.0.1:5236确认版本和许可证提示:
SELECT 1;
SELECT EXPIRED_DATE FROM SYS."V$LICENSE";创建应用用户和表:
CREATE TABLESPACE TS_TOOL_EFFICIENCY DATAFILE 'ts_tool_efficiency01.dbf' SIZE 128;
CREATE USER APP_TOOL_EFFICIENCY
IDENTIFIED BY "YOUR_STRONG_DM_APP_PASSWORD"
DEFAULT TABLESPACE TS_TOOL_EFFICIENCY;
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE VIEW
TO APP_TOOL_EFFICIENCY;
CONNECT APP_TOOL_EFFICIENCY/"YOUR_STRONG_DM_APP_PASSWORD";
CREATE TABLE USER_DEMO (
ID BIGINT IDENTITY(1, 1) PRIMARY KEY,
USERNAME VARCHAR(64) NOT NULL,
CREATED_AT TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
);
INSERT INTO USER_DEMO(USERNAME) VALUES ('demo');
COMMIT;
SELECT ID, USERNAME, CREATED_AT FROM USER_DEMO ORDER BY ID;预期返回一行 demo。随后创建只读账号做反向实验,避免“应用能访问”其实是系统权限过大:
CONNECT SYSDBA/"YOUR_STRONG_DM_SYSDBA_PASSWORD";
CREATE USER APP_TOOL_READONLY IDENTIFIED BY "YOUR_STRONG_DM_READONLY_PASSWORD";
GRANT CREATE SESSION TO APP_TOOL_READONLY;
GRANT SELECT ON APP_TOOL_EFFICIENCY.USER_DEMO TO APP_TOOL_READONLY;
CONNECT APP_TOOL_READONLY/"YOUR_STRONG_DM_READONLY_PASSWORD";
SELECT ID, USERNAME FROM APP_TOOL_EFFICIENCY.USER_DEMO;
INSERT INTO APP_TOOL_EFFICIENCY.USER_DEMO(USERNAME) VALUES ('should_fail');查询应成功,插入应返回权限不足。若插入成功,检查账号是否额外拥有 RESOURCE、DBA 或对象写权限;修正授权后重新连接再测,因为连接池中的旧会话可能暂时掩盖凭证与权限变化。先删除临时只读账号,业务表留给导出恢复实验:
CONNECT SYSDBA/"YOUR_STRONG_DM_SYSDBA_PASSWORD";
DROP USER APP_TOOL_READONLY CASCADE;导出入口:
dexp APP_TOOL_EFFICIENCY/YOUR_STRONG_DM_APP_PASSWORD@127.0.0.1:5236 FILE=app_tool_efficiency.dmp LOG=app_tool_efficiency.log恢复不能写回原实例来冒充验证。先用相同初始化参数启动第二个空实例,例如把宿主端口映射为 15236,在其中创建同名空用户和目标表空间,再导入:
dimp APP_TOOL_EFFICIENCY/YOUR_STRONG_DM_APP_PASSWORD@127.0.0.1:15236 FILE=app_tool_efficiency.dmp LOG=app_tool_efficiency_restore.log如果导入介质需要用户级或模式级参数,先执行 dexp help / dimp help,按当前补丁工具支持的 OWNER、SCHEMAS 等模式生成参数文件,不凭其他数据库的 remap 语法猜测。恢复成功不能只看 dimp 退出码。要连接 15236 上的恢复用户,检查关键表数量、样例行数、序列或自增当前值,并执行一次只读查询与一次受控写入;失败时保留导入日志里的首个错误、实例参数、补丁版本和源端字符集,从空用户重新导入,不能在半恢复状态上继续补对象。
恢复验收完成后,再由管理账号删除源端实验对象:
DROP TABLE APP_TOOL_EFFICIENCY.USER_DEMO;项目里建议保留:
compose.yaml
.env.example
db/
dameng/
init/
001_tablespace.sql
002_user.sql
migration/
verify/
verify.sql
dump/
docs/
dependency-setup.md
scripts/
dm-up.sh
dm-verify.sh
dm-export.sh
dm-reset-dev.sh迁移工具接入前先验证:
达梦 JDBC 驱动是否进内部 Maven 仓库或依赖管理。ORM dialect 是否真实支持 DM,不能只用 Oracle dialect 猜。COMPATIBLE_MODE、大小写和空串 / NULL 行为是否与项目一致。
Flyway / Liquibase 的 schema history 表落在哪个用户 / 模式。大小写对象名、引号、序列、自增、分页、时间类型是否通过样例。
查看端口:
lsof -i :5236连接:
disql APP_TOOL_EFFICIENCY/"YOUR_STRONG_DM_APP_PASSWORD"@127.0.0.1:5236查看当前用户:
SELECT USER;查看对象:
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE
FROM ALL_OBJECTS
WHERE OWNER = 'APP_TOOL_EFFICIENCY'
ORDER BY OBJECT_TYPE, OBJECT_NAME;表空间容量要观察总量、剩余量和增长速度:
SELECT a.tablespace_name,
total / (1024 * 1024) AS total_mb,
free / (1024 * 1024) AS free_mb,
ROUND((total - free) / total, 4) * 100 AS used_percent
FROM (SELECT tablespace_name, SUM(bytes) free
FROM dba_free_space GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM(bytes) total
FROM dba_data_files GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name;
SELECT TABLE_USED_SPACE('APP_TOOL_EFFICIENCY', 'USER_DEMO') AS allocated_pages,
TABLE_USED_PAGES('APP_TOOL_EFFICIENCY', 'USER_DEMO') AS used_pages;百分比只是当前快照。容量预算还要纳入数据文件自动扩展上限、归档、临时空间、导出文件和恢复副本,并根据每日增长率与保留期推算耗尽时间。连续多轮导入和清理后,已用页与表空间增长应回到可解释基线;单轮删除后文件没有立刻缩小,不应直接判成泄漏。
停止开发容器:
docker compose down只有确认是本地开发数据,才允许删除 volume:
docker compose down -v许可证提示或到期
现象:
日志出现默认 license 提示。试用过期后实例无法启动。团队误把试用 key 当成长期授权。
处理:共享开发环境记录 license owner、授权用途和到期提醒;出现到期提示时联系授权责任人处理,不把试用 key 当成长期凭证。
Docker 镜像来源不清
现象:
启动脚本使用了无法追溯来源的 docker pull dm8。团队 CI 无法复现镜像。镜像里默认密码、初始化参数和数据目录不清楚。
处理:只使用官方下载 tar 或内部验收镜像;记录 tar 包名、版本、架构、来源、digest 和 owner。
端口占用
排查:
lsof -i :5236
docker ps --format "table {{.Names}}\t{{.Ports}}"处理:本地可映射为 15236:5236,共享开发环境不要所有项目都占 5236。
兼容模式改晚了
现象:
Oracle 迁移时空串 / NULL 行为不一致。大小写对象名和索引行为异常。已有数据后再切 COMPATIBLE_MODE,测试结论互相矛盾。
处理:建业务对象前确定兼容模式、字符集、大小写和长度语义;已有库需要重建或单独迁移验证,不在原库随手改。
JDBC 连接失败
排查:
驱动类是否是 dm.jdbc.driver.DmDriver。URL 是否是 jdbc:dm://host:5236。JDK 与驱动版本是否匹配。
密码特殊字符是否被 shell / properties 转义。SSL 或兼容参数是否和服务端配置匹配。
不能进入仓库的内容:
DM_SYSDBA_PASSWORD、DM_SYSAUDITOR_PASSWORD、DM_APP_PASSWORD、.env。真实 JDBC URL、内网 IP、共享库账号、license key。dexp / dimp 导出文件、日志和客户数据。
官方下载包、Docker tar 的受控下载地址和内部镜像仓库凭证。生产连接截图、管理工具连接历史和 SQLark / DBeaver 配置。
.gitignore 建议:
.env
db/dameng/dump/*.dmp
db/dameng/dump/*.log
db/dameng/export/*.sql共享达梦开发库至少要有:
安装包 / 镜像来源、版本、CPU / OS、digest 和 owner。实例名、端口、字符集、大小写、页大小、长度语义和兼容模式。SYSDBA / 审计账号 owner,应用不得使用系统账号。
项目用户 / 模式 / 表空间命名规范。runtime / migration / readonly 账号。导入导出目录、清理周期和脱敏要求。
license 试用到期提醒和责任人。Oracle / MySQL / PostgreSQL 迁移差异清单。
生产架构怎样选
DM 数据守护用 Redo 传输与重演维持主备,核心组件包括主库、备库、dmwatcher 和 dmmonitor。它还可以组成读写分离、MPP 主备或 DMDSC 主备。名称相近不代表解决同一个问题,选型应从可用性、吞吐类型、共享存储条件和团队能力出发。
| 架构 | 主要解决的问题 | 关键代价 | 必做验证 |
|---|---|---|---|
| 单实例 | 开发、测试、低可用要求业务 | 节点故障即中断 | 脱机/联机备份能从空目录恢复 |
| 实时主备 | 单节点故障与数据保护 | Redo 传输、备库重演、切换仲裁 | 计划切换、故障接管、旧主隔离与重加入 |
| 读写分离 | 在主备基础上分担只读负载 | 读一致模式、驱动路由和重演延迟 | 写后读、事务内路由、备库故障回主 |
| DMDSC | 多实例访问共享存储,提升单库可用与并行能力 | 共享存储、集群协调、全局锁与故障域复杂 | 节点故障、存储链路故障、脑裂防护 |
| DM MPP | 大规模分析与横向数据分布 | 分布键、数据倾斜、跨节点网络和运维成本 | 倾斜数据、节点故障、重分布与 MPP 主备 |
实时主备不是把两台数据库都开放写入。计划切换前要确认主备模式、归档有效、Redo 发送与重演位置收敛;故障接管前必须隔离旧主,并确认监视器的仲裁路径,避免网络分区后出现双主。旧主恢复后按数据守护流程重加入,不能带着旧时间线直接开放服务。自动切换还依赖确认监视器,部署在与主备相同故障域会让“自动”在真正故障时一起失效。
读写分离要做反向实验:主库提交带唯一标识的记录,立即通过只读入口轮询,记录首次可见时间;再在备库不可用时确认连接是否回到主库、事务是否被重试。需要严格写后读的交易链路应保持主库亲和或启用经过压测的事务一致策略。为追求吞吐而接受即时归档或异步备库时,必须把可见性延迟和故障数据窗口写进业务契约。
DMDSC 与 MPP 不是普通 OLTP 主备的“更高级版本”。前者依赖共享存储与集群协调,适合明确需要多实例访问同一数据库的场景;后者采用对等无共享执行节点,面向大规模分析。普通交易系统在单实例容量、SQL、索引和主备尚未治理前引入它们,通常只会增加授权、硬件、网络、备份和排障成本。
备份、升级与授权一起治理
dexp / dimp 是逻辑对象导出导入,适合迁移和开发恢复 smoke;数据库级物理恢复则要使用备份集与 DMRMAN,并经历 restore、recover 等一致性步骤。两者不能互相替代,主备也不能替代备份,因为误删和错误 DDL 会沿 Redo 到达备库。联机物理备份是否依赖 DMAP 还受 BAK_USE_AP 影响,安装后漏执行 root_installer.sh 可能让备份链路在真正需要时才暴露问题。
升级前在同 CPU、OS、补丁、字符集、页大小和兼容模式的影子实例恢复脱敏备份,验证 JDBC、ORM、批处理、存储过程、权限拒绝、备份恢复与主备切换。升级后的数据文件不应直接交给旧执行码启动;可回退路径应是切回未升级主备节点,或从升级前备份恢复到旧版本环境。应用回退还要确认新 schema 和新数据没有突破旧应用的兼容边界。
达梦介质、功能组件、技术支持和生产使用通常受许可证与合同约束。预算不能只算服务器:还要包含每个环境和节点的授权口径、Data Watch/DMDSC/MPP 等能力、共享存储、备份空间、恢复临时空间、异地副本、监控审计及支持服务。试用许可证只适合受控验证;共享环境必须记录授权责任人、到期提醒和退出方案,不能等实例拒绝启动后再找 key。
容量账要至少包含数据文件、索引、联机与归档 Redo、临时表空间、回滚空间、逻辑导出、物理备份集和恢复副本。Data Watch 每增加一个备库都会增加存储与日志链路成本,MPP 还会增加数据重分布和节点间网络。表空间百分比只能说明当前快照,最终扩容信号应由增长率、备份窗口、恢复时间和业务峰值共同决定。
| 深水区 | 现象 | 判断入口 | 配置 / 命令 / 取舍 |
|---|---|---|---|
| Docker 镜像不明 | 本地能跑,团队不可复现 | tar 包、digest、来源 | 官方下载或内部验收 |
| 试用授权误用 | 共享库突然不可启动 | license 视图、owner | 记录过期时间和责任人 |
| root 安装 | 权限和目录混乱 | 安装用户、目录 owner | 本机安装用 dmdba |
| 5236 冲突 | 多项目互相占端口 | lsof、Docker ports | 宿主端口项目化 |
| SYSDBA 滥用 | 应用拿系统账号连接 | 配置扫描、session | 应用独立用户 |
| MySQL 心智误导 | 试图建多个 database | 初始化脚本 | 按用户/模式组织 |
| 兼容模式后改 | 已有数据行为不一致 | dm.ini、迁移记录 | 建表前确定 |
| 大小写误判 | ORM 找不到表 | 对象名、quoted identifier | 项目规范固定 |
| 字符集误判 | 中文乱码、导入失败 | 实例参数、导入日志 | 初始化前确认 |
| 空串 / NULL | Oracle 迁移查询异常 | 兼容模式、样例 SQL | 迁移前用样例验证 |
| JDBC 参数混乱 | 客户端兼容和服务端兼容混为一谈 | URL、dm.ini | 分层记录 |
| 导出未恢复 | 有 dmp 但不可用 | 临时实例导入 | 每次模板保留恢复 smoke |
| 误连生产 | 清理脚本删错实例 | URL、账号、端口 | reset 加白名单 |
达梦的深水区,是“实例初始化取舍”比“启动命令”更重要。字符集、大小写、兼容模式、系统账号、license 和导出文件一旦没管住,后面的联调会变成反复猜测。
共享环境的准入门禁
DM8 开发实例交给团队使用前,应留下可复核证据:软件包或镜像与 CPU、OS、digest 对得上;实例参数快照与目标环境一致;真实 JDBC 完成建表、写入、查询和权限拒绝实验;dexp 产物在独立实例恢复成功;重置脚本拒绝生产地址和非开发实例名。许可证到期日、表空间自动扩展上限、dump 保留期和账号 owner 也必须进入台账。
凭证轮换时先创建新密码并刷新密钥系统,让连接池建立新连接;确认旧会话排空后再使旧凭证失效。验收看旧密码无法新建连接、应用错误率回落且连接数恢复稳定。每月再复查闲置账号、系统角色授予、表空间耗尽时间、长事务、导出文件中的敏感数据和最近一次恢复结果,异常项必须绑定责任人与处理期限。
达梦不是“国产 Oracle 容器”。只有实例参数、兼容模式、用户/模式、JDBC、容量和恢复证据都能重复验证,它才是可控的工程依赖,而不是上线前才暴露的兼容黑盒。
