1. 达梦数据库从入门到精通的命令行世界如果你刚接触达梦数据库或者从Oracle、MySQL这类更常见的数据库转过来可能会觉得图形化工具更直观。但我要告诉你真正想玩转达梦尤其是做运维、性能调优或者自动化脚本命令行工具disql和DIsql是的大小写有区别后面会细说才是你的“瑞士军刀”。图形界面点几下鼠标固然方便但命令行能让你更精准、更高效地控制数据库尤其是在批量操作、远程管理和故障排查时那种掌控感是图形界面无法比拟的。这篇文章我就结合自己这些年踩过的坑和积累的经验把达梦数据库那些最常用、最核心的命令给你掰开揉碎了讲清楚让你从“会用”升级到“精通”。2. 核心命令行工具disql 与 DIsql 的异同与使用很多新手一开始就懵了达梦的命令行工具怎么有两个名字disql和DIsql到底有啥区别其实这恰恰是达梦兼容性和灵活性的一个体现。2.1 工具定位与启动方式简单来说disql是达梦数据库自带的、功能最强大的交互式命令行工具。它类似于 Oracle 的sqlplus是进行数据库操作、SQL执行、脚本运行的主力。而DIsql注意首字母大写通常指的是达梦数据库管理工具DM Management Tool中集成的命令行窗口其内核也是disql但提供了一个更友好的、带历史记录和部分图形辅助的界面。启动 disql最经典的方式是在操作系统的命令行中直接调用。假设你的达梦安装目录是/opt/dmdbmsLinux或D:\dmdbmsWindows并且bin目录已加入系统 PATH 环境变量你可以这样登录# Linux/Windows 通用基本格式 disql username/passwordhost:port # 示例以 SYSDBA 身份登录本地数据库的 5236 端口 disql SYSDBA/SYSDBAlocalhost:5236如果没配置 PATH就需要进入安装目录的bin子目录下执行。在 Windows 上你可能会看到一个disql.exe的可执行文件。启动 DIsql通常你通过开始菜单或桌面快捷方式打开“达梦数据库管理工具”连接上某个数据库后在工具栏或菜单里能找到“打开命令行窗口”或类似的按钮点击后弹出的就是DIsql环境。它已经自动连接到了当前管理的数据库无需再次输入连接串非常方便进行一些临时查询或快速操作。注意无论是disql还是DIsql其核心命令集和 SQL 语法都是完全一致的。下文所介绍的命令若无特殊说明在两者中均可使用。我个人在服务器运维时偏爱纯disql在开发调试时则常用管理工具里的DIsql窗口。2.2 连接参数详解与常见问题连接字符串看似简单但里面有几个参数容易出问题username/password: 用户名和密码。默认的最高权限用户是SYSDBA默认密码也是SYSDBA。生产环境务必修改host:port: 数据库服务器地址和端口。默认端口是5236。如果连接本机host可以是localhost、127.0.0.1或者直接省略disql SYSDBA/SYSDBA:5236。服务名方式连接对于配置了服务的环境也可以使用disql username/passwordservice_name。这需要在客户端的dm_svc.conf文件中配置服务名与地址端口的映射。一个常见的连接错误是“网络通信异常”。排查思路如下检查数据库服务是否启动在服务器上执行ps -ef | grep dmserver(Linux) 或查看 Windows 服务确认dmserver进程存在。检查端口监听在服务器上执行netstat -an | grep 5236(Linux) 或netstat -ano | findstr 5236(Windows)看5236端口是否处于LISTEN状态。检查防火墙确认服务器和客户端的防火墙是否放行了5236端口。检查连接字符串仔细核对用户名、密码、主机名和端口号特别是密码中是否有特殊字符最好用双引号括起来如disql SYSDBA/\YourPass123\192.168.1.100:5236。3. 基础操作与信息查询命令成功登录后我们就进入了disql的交互环境。提示符通常是SQL。下面这些命令是你每天都会用到的。3.1 库、表、用户等元数据查询想快速了解数据库里有什么这些命令必不可少查看所有表空间SELECT * FROM V$TABLESPACE;表空间是存储数据的逻辑容器类似于 Oracle 的概念。通过这个视图可以查看其 ID、名称、状态、文件路径等信息。查看当前用户下的所有表SELECT TABLE_NAME FROM USER_TABLES;这是最常用的。如果想查看所有用户的表需要有相应权限然后查询DBA_TABLES或ALL_TABLES。查看表结构DESC table_name;或者SP_TABLEDEF(SCHEMA_NAME, TABLE_NAME);。DESC命令最快捷能列出列名、数据类型、是否为空。SP_TABLEDEF这个存储过程能给出更接近CREATE TABLE语句的定义。查看当前用户SELECT USER;或SELECT SF_GET_USER();查看数据库版本信息SELECT * FROM V$VERSION;或者简单的SELECT ID_CODE;。这在确认补丁版本时非常有用。查看当前会话信息SELECT SESSID, SQL_TEXT FROM V$SESSIONS WHERE ...可以监控当前正在执行的 SQL。实操心得USER_TABLES、ALL_TABLES、DBA_TABLES这几个数据字典视图和 Oracle 高度相似如果你有 Oracle 基础会感到非常亲切。达梦在数据字典方面对 Oracle 的兼容性做得很好这降低了学习成本。3.2 常用 SQL 与脚本执行在disql中执行 SQL 和脚本是其核心功能。执行单条 SQL直接在SQL提示符后输入 SQL 语句以分号;结束按回车执行。例如SELECT COUNT(*) FROM EMPLOYEE;执行脚本文件使用START或命令。例如有一个名为init_schema.sql的脚本文件可以这样执行START /home/dmdba/scripts/init_schema.sql或/home/dmdba/scripts/init_schema.sql。在 Windows 上路径使用反斜杠或双引号包裹的正斜杠。编辑上一条命令在 Linux 下disql通常不支持上下箭头调历史命令除非在rlwrap包装下。但可以使用ED命令将上一条 SQL 语句写入一个临时文件并用默认编辑器如vi打开修改保存退出后会自动执行修改后的语句。查看执行计划优化 SQL 性能的关键。在 SQL 前加上EXPLAIN即可如EXPLAIN SELECT * FROM T1 WHERE ID100;。达梦也支持SET AUTOTRACE ON这样的跟踪设置可以在执行后同时显示执行计划和统计信息。注意脚本文件的编码问题是个大坑。如果脚本文件是 UTF-8 with BOM 格式或者编码与数据库服务器字符集不匹配执行时可能会报错“非法字符”或乱码。建议将脚本文件保存为UTF-8 无 BOM格式这是最稳妥的。如果从 Windows 传到 Linux还要注意换行符CRLF 转 LF的问题可以用dos2unix命令处理一下。4. 系统管理与运维核心命令这部分命令涉及数据库的启停、状态监控、参数调整等是 DBA 的日常工作。4.1 数据库状态与服务控制虽然数据库服务的启停通常由操作系统服务或DmService脚本来控制但在disql内部也可以进行一些状态检查和有限的控制。检查数据库状态SELECT STATUS$ FROM V$INSTANCE;可以查看实例状态OPEN,MOUNT,SUSPEND等。SELECT * FROM V$DATABASE;查看数据库信息。关闭数据库此命令需谨慎通常需要以SYSDBA身份登录。SHUTDOWN IMMEDIATE;是最常用的它会中断当前所有连接回滚未提交事务然后关闭数据库。SHUTDOWN ABORT;是强制关闭相当于断电下次启动需要恢复非紧急情况勿用。启动数据库在disql中如果数据库处于关闭状态通常需要连接到空闲实例disql / AS SYSDBA或使用SYSDBA密码登录一个未开启的端口概念较复杂然后执行STARTUP;命令。但更常见的做法是在操作系统层面使用DmService服务脚本。踩坑记录有一次在测试环境一个开发同事误在生产备库上执行了SHUTDOWN IMMEDIATE导致监控告警。虽然备库只读影响不大但也是个教训。关键运维命令一定要 double-check 连接的是哪个环境。建议在disql登录后先执行SELECT NAME FROM V$DATABASE;确认数据库名。4.2 参数管理与性能视图达梦有很多初始化参数类似于 Oracle 的spfile和pfile。查看参数SELECT * FROM V$PARAMETER WHERE NAME LIKE %MEMORY%;可以查看所有参数也可以模糊查询。SHOW PARAMETER MEMORY;这个命令更简洁。修改参数分为会话级和系统级静态/动态。会话级ALTER SESSION SET PARAMETER_NAME VALUE;只影响当前会话。系统级动态ALTER SYSTEM SET PARAMETER_NAME VALUE [MEMORY|BOTH|SPFILE];MEMORY只修改内存中的值立即生效但重启后失效。SPFILE只修改参数文件dm.ini中的值重启后生效。BOTH同时修改内存和参数文件默认。这是最常用的方式。 例如调整最大会话数ALTER SYSTEM SET MAX_SESSIONS 1000 BOTH;关键性能视图V$视图V$SESSIONS/V$PROCESSES查看会话和进程信息用于排查锁、杀会话。V$LOCK查看当前锁信息。结合V$SESSIONS可以找到谁持有锁谁在等待。V$SQL_HISTORY/V$SQL_PLAN查看历史 SQL 及其执行计划用于慢查询分析。V$SYSTEM_EVENT查看系统等待事件是性能瓶颈分析的重要入口。V$BUFFERPOOL/V$CACHEPLN查看缓冲池和 SQL 计划缓存情况。经验分享修改系统参数前最好先用SELECT * FROM V$PARAMETER WHERE NAMEYOUR_PARAM;查看当前值和描述。对于重要参数如内存相关、进程数建议先在测试环境验证。达梦有些参数是只读的只能在dm.ini文件中修改并重启生效。5. 备份恢复与数据迁移命令数据是核心备份恢复是生命线。达梦提供了逻辑备份dexp/dimp和物理备份RMAN两套工具。这里主要讲在disql环境内外常用的相关命令。5.1 逻辑导出与导入dexp/dimpdexp和dimp是独立的命令行工具不是disql内部命令但必须会。全库导出dexp USERIDSYSDBA/SYSDBAlocalhost:5236 DIRECTORY/backup FILEfull.dmp LOGfull_exp.log FULLYDIRECTORY导出文件存放目录达梦8以后支持早期版本用FILE指定全路径。FULLY表示全库导出。其他模式SCHEMAS按用户、TABLES按表、QUERY按条件查询导出。按用户导入dimp USERIDSYSDBA/SYSDBAlocalhost:5236 DIRECTORY/backup FILEschema.dmp LOGschema_imp.log SCHEMASHRTABLE_EXISTS_ACTION参数很重要当表存在时如何处理。SKIP跳过、APPEND追加数据、TRUNCATE清空后插入、REPLACE删除重建。根据场景选择。避坑指南字符集问题这是逻辑备份迁移中最常见的问题。如果源库和目标库的字符集不一致导入时可能出现乱码。务必在导出和导入前用SELECT SF_GET_UNICODE_FLAG();或查看V$PARAMETER中的UNICODE_FLAG确认字符集。建议源和目标保持一致或确保兼容。大对象LOB数据导出包含大字段CLOB, BLOB的表时速度可能会很慢且容易出错。可以考虑使用CLUSTERN参数不按簇导出或者对于超大的LOB采用物理备份或第三方工具分段迁移。空间不足导出文件可能很大确保DIRECTORY指向的磁盘有足够空间。导入时确保目标表空间有足够空间容纳数据。5.2 联机备份与恢复对于生产系统物理备份RMAN更高效、更可靠。达梦的RMAN工具dmrman也是命令行工具。执行联机全备需要在disql中开启归档和备份模式-- 1. 配置归档需提前准备归档目录 ALTER DATABASE MOUNT; ALTER DATABASE ADD ARCHIVELOG DEST/dmarch, TYPELOCAL, FILE_SIZE1024, SPACE_LIMIT10240; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 2. 执行备份以下为SQL命令在disql中执行 BACKUP DATABASE FULL BACKUPSET /backup/full_bak_20240515;备份集会生成在指定目录。也可以使用dmrman工具在外部执行备份命令。使用 dmrman 进行恢复 假设数据文件损坏需要从全备恢复。dmrman CTLSTMTRESTORE DATABASE /opt/dmdbms/data/DAMENG/dm.ini FROM BACKUPSET /backup/full_bak_20240515 dmrman CTLSTMTRECOVER DATABASE /opt/dmdbms/data/DAMENG/dm.ini FROM BACKUPSET /backup/full_bak_20240515 dmrman CTLSTMTRECOVER DATABASE /opt/dmdbms/data/DAMENG/dm.ini UPDATE DB_MAGIC恢复过程通常包括 RESTORE还原、RECOVER恢复、UPDATE DB_MAGIC更新魔数三步。核心要点物理备份必须开启归档日志。没有归档日志的物理备份是不完整的只能恢复到备份时间点相当于冷备。开启归档后结合全备和增量备份可以实现任意时间点的恢复PITR。务必定期测试备份集的有效性可以用dmrman的CHECK BACKUPSET命令检查。6. 性能诊断与 SQL 调优命令数据库慢了怎么办这些命令和视图是你的诊断工具箱。6.1 定位慢 SQL 与执行计划分析开启慢 SQL 日志首先确保数据库记录了慢 SQL。检查参数SELECT * FROM V$PARAMETER WHERE NAME IN (ENABLE_MONITOR, MONITOR_TIME, SQL_TRACE_MASK);MONITOR_TIME单位是毫秒设置一个阈值如 1000执行时间超过此值的 SQL 会被记录到$DM_HOME/log目录下的dmsql_实例名_日期.log文件中。实时查看正在执行的慢 SQLSELECT SESSID, SQL_TEXT, STATE, TIME_USED/1000 AS TIME_MS FROM V$SESSIONS WHERE STATEACTIVE AND TIME_USED 1000000 -- 超过1秒 ORDER BY TIME_USED DESC;结合V$SQL_HISTORY和V$SQL_PLAN可以查看历史 SQL 的执行计划和资源消耗。分析执行计划EXPLAIN SELECT a.*, b.dname FROM emp a JOIN dept b ON a.deptno b.deptno WHERE a.sal 5000;仔细阅读执行计划的输出关注COST估算成本。OPERATION操作类型NSET,PRJT,SLCT,JOIN等。TABLE和INDEX是否使用了索引用了哪个索引。CARDINALITY估算行数。如果估算值和实际值差异巨大说明统计信息可能过期。6.2 统计信息收集与索引维护优化器依赖统计信息来生成好的执行计划。统计信息不准SQL 就可能跑偏。收集表统计信息-- 收集单个表 DBMS_STATS.GATHER_TABLE_STATS(SYSDBA, EMPLOYEE); -- 收集整个模式用户 DBMS_STATS.GATHER_SCHEMA_STATS(HR);对于大表可以使用ESTIMATE_PERCENT参数采样如DBMS_STATS.GATHER_TABLE_STATS(SYSDBA, BIG_TABLE, ESTIMATE_PERCENT10);采样10%。检查索引状态SELECT TABLE_NAME, INDEX_NAME, STATUS FROM DBA_INDEXES WHERE STATUS ! VALID;无效的索引需要重建ALTER INDEX HR.EMP_NAME_IDX REBUILD;监控锁竞争SELECT l.SESS_ID as 持有会话, s1.SQL_TEXT as 持有SQL, w.SESS_ID as 等待会话, s2.SQL_TEXT as 等待SQL, l.TABLE_ID, l.TYPE FROM V$LOCK l JOIN V$LOCK w ON l.TABLE_ID w.TABLE_ID AND l.TRX_ID ! w.TRX_ID AND l.TYPE w.TYPE JOIN V$SESSIONS s1 ON l.SESS_ID s1.SESSID JOIN V$SESSIONS s2 ON w.SESS_ID w.SESSID WHERE w.BLOCKED 1;这个查询能帮你找到谁锁了谁以及他们分别在执行什么 SQL。调优心法性能问题八成在 SQL两成在资源。拿到慢 SQL先看执行计划重点关注全表扫描CSCN和嵌套循环NEST LOOP连接。优先考虑优化 SQL 写法如避免SELECT *减少子查询然后检查关联字段是否有索引最后再考虑调整参数如调大缓冲池BUFFER。不要一上来就动参数那往往是治标不治本。7. 日常运维脚本与自动化示例命令行最大的优势就是易于脚本化。下面分享几个我常用的脚本片段。7.1 健康检查脚本可以写一个 Shell 脚本Linux或批处理Windows定期运行以下disql命令检查数据库健康状态#!/bin/bash # 文件名dm_health_check.sh CHECK_SQL SET LINESHOW OFF SET FEEDBACK OFF SET HEADING OFF -- 检查实例状态 SELECT 实例状态: || STATUS$ FROM V\\\$INSTANCE; -- 检查表空间使用率 SELECT 表空间使用率 80%: || GROUP_CONCAT(TABLESPACE_NAME) FROM ( SELECT TABLESPACE_NAME, ROUND((TOTAL_SIZE-FREE_SIZE)*100/TOTAL_SIZE,2) AS USED_PCT FROM V\\\$TABLESPACE WHERE ROUND((TOTAL_SIZE-FREE_SIZE)*100/TOTAL_SIZE,2) 80 ); -- 检查无效对象 SELECT 无效对象数: || COUNT(*) FROM DBA_OBJECTS WHERE STATUS ! VALID; -- 检查长时间运行会话 SELECT 长时间会话: || COUNT(*) FROM V\\\$SESSIONS WHERE STATEACTIVE AND TIME_USED 300000000; -- 超过5分钟 echo $CHECK_SQL | disql SYSDBA/SYSDBAlocalhost:5236 | grep -v ^$ | tee /tmp/dm_health_$(date %Y%m%d).log这个脚本会检查实例状态、表空间使用率、无效对象和长事务输出到日志文件。你可以通过 crontab 定时执行它。7.2 自动备份脚本结合逻辑导出和物理备份编写自动化备份脚本。#!/bin/bash # 文件名dm_backup.sh BAK_DATE$(date %Y%m%d_%H%M%S) BAK_DIR/backup/dm LOG_DIR/backup/dm/log # 1. 逻辑备份每周日全备其他日期增量备份 if [ $(date %u) -eq 7 ]; then dexp USERIDSYSDBA/SYSDBAlocalhost:5236 DIRECTORY$BAK_DIR FILElogic_full_${BAK_DATE}.dmp LOG$LOG_DIR/exp_full_${BAK_DATE}.log FULLY COMPRESSY else # 这里简化处理实际增量备份需要基于之前的备份文件更复杂一些 dexp USERIDSYSDBA/SYSDBAlocalhost:5236 DIRECTORY$BAK_DIR FILElogic_incr_${BAK_DATE}.dmp LOG$LOG_DIR/exp_incr_${BAK_DATE}.log SCHEMASHR QUERY\WHERE CREATE_TIME\SYSDATE-1\ fi # 2. 物理备份调用RMAN或SQL命令 # 假设已配置归档这里通过disql执行备份SQL echo BACKUP DATABASE FULL BACKUPSET $BAK_DIR/physical_full_${BAK_DATE}; | disql SYSDBA/SYSDBAlocalhost:5236 $LOG_DIR/phy_bak_${BAK_DATE}.log 21 # 3. 清理旧备份保留30天 find $BAK_DIR -name *.dmp -mtime 30 -delete find $BAK_DIR -name *BACKUPSET* -type d -mtime 30 -exec rm -rf {} \;自动化关键脚本中密码明文存储是安全隐患。生产环境中可以考虑使用操作系统认证/ AS SYSDBA模式需配置dm.ini中的ENABLE_LOCAL_OSAUTH参数或者将密码存储在受保护的文件中通过脚本读取。同时备份日志一定要仔细查看确保每次备份都成功。8. 连接工具与第三方集成相关命令除了disql我们经常需要和其他工具交互。8.1 配置 ODBC/JDBC 连接达梦提供了 ODBC 和 JDBC 驱动供 Navicat、DBeaver、Java 应用等连接。ODBC 配置Linux安装达梦 ODBC 驱动包如unixODBC和dmodbc。编辑/etc/odbc.ini[DM8] Description DM ODBC Driver /opt/dmdbms/bin/libdodbc.so SERVER localhost PORT 5236 DATABASE DAMENG UID SYSDBA PWD SYSDBA使用isql DM8测试连接。JDBC 连接字符串 在 Java 应用或 Navicat 中连接字符串通常如下jdbc:dm://localhost:5236/DAMENG?schemaSYSDBAzeroDateTimeBehaviorconvertToNulluseUnicodetruecharacterEncodingutf-8驱动类名dm.jdbc.driver.DmDriver。Jar 包是DmJdbcDriver18.jar对应 JDK 1.8。Navicat 连接报错排查如果 Navicat 连不上常见原因有1) 驱动版本与数据库版本不匹配2) 连接字符串格式错误3) 数据库的dm.ini中ENABLE_ENCRYPT参数导致密码加密方式不兼容可尝试设置为0测试4) 防火墙或网络问题。优先使用达梦自带的“管理工具”测试连通性再排查第三方工具配置。8.2 与 Docker 集成现在很多环境用 Docker 部署达梦方便快捷。拉取官方镜像docker pull dameng/dm8:latest运行容器docker run -d -p 5236:5236 --name dm8 \ -v /opt/dmdata:/opt/dmdbms/data \ dameng/dm8:latest这里把容器内的数据目录挂载到宿主机/opt/dmdata防止数据丢失。进入容器执行命令docker exec -it dm8 /bin/bash cd /opt/dmdbms/bin ./disql SYSDBA/SYSDBAlocalhost:5236ARM 环境注意达梦也提供了 ARM 架构的 Docker 镜像如dameng/dm8:arm64。在 ARM 服务器如华为鲲鹏、苹果 M1上部署时务必指定正确的镜像标签否则会因架构不匹配而无法运行。命令的世界看似枯燥但却是掌控数据库的基石。从简单的查询到复杂的性能调优从手动备份到自动化运维每一步都离不开对这些命令的深刻理解和熟练运用。我建议你准备一个测试环境把本文提到的命令都亲手敲一遍观察输出理解其含义。遇到错误不要慌仔细阅读错误信息结合日志文件$DM_HOME/log目录下分析这才是最快的成长路径。记住最好的学习方式就是“动手”和“踩坑”而命令就是你最趁手的工具。