1. 达梦数据库:从入门到精通的命令行世界
如果你刚接触达梦数据库,或者从Oracle、MySQL这类更常见的数据库转过来,可能会觉得图形化工具更直观。但我要告诉你,真正想玩转达梦,尤其是做运维、性能调优或者自动化脚本,命令行工具disql和DIsql(是的,大小写有区别,后面会细说)才是你的“瑞士军刀”。图形界面点几下鼠标固然方便,但命令行能让你更精准、更高效地控制数据库,尤其是在批量操作、远程管理和故障排查时,那种掌控感是图形界面无法比拟的。这篇文章,我就结合自己这些年踩过的坑和积累的经验,把达梦数据库那些最常用、最核心的命令给你掰开揉碎了讲清楚,让你从“会用”升级到“精通”。
2. 核心命令行工具:disql 与 DIsql 的异同与使用
很多新手一开始就懵了:达梦的命令行工具怎么有两个名字?disql和DIsql到底有啥区别?其实,这恰恰是达梦兼容性和灵活性的一个体现。
2.1 工具定位与启动方式
简单来说,disql是达梦数据库自带的、功能最强大的交互式命令行工具。它类似于 Oracle 的sqlplus,是进行数据库操作、SQL执行、脚本运行的主力。而DIsql(注意首字母大写)通常指的是达梦数据库管理工具(DM Management Tool)中集成的命令行窗口,其内核也是disql,但提供了一个更友好的、带历史记录和部分图形辅助的界面。
启动 disql:最经典的方式是在操作系统的命令行中直接调用。假设你的达梦安装目录是/opt/dmdbms(Linux)或D:\dmdbms(Windows),并且bin目录已加入系统 PATH 环境变量,你可以这样登录:
# Linux/Windows 通用基本格式 disql username/password@host:port # 示例:以 SYSDBA 身份登录本地数据库的 5236 端口 disql SYSDBA/SYSDBA@localhost: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/password@service_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/\"Your@Pass123\"@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 ID=100;。达梦也支持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 NAME='YOUR_PARAM';查看当前值和描述。对于重要参数(如内存相关、进程数),建议先在测试环境验证。达梦有些参数是只读的,只能在dm.ini文件中修改并重启生效。
5. 备份恢复与数据迁移命令
数据是核心,备份恢复是生命线。达梦提供了逻辑备份(dexp/dimp)和物理备份(RMAN)两套工具。这里主要讲在disql环境内外常用的相关命令。
5.1 逻辑导出与导入(dexp/dimp)
dexp和dimp是独立的命令行工具,不是disql内部命令,但必须会。
全库导出:
dexp USERID=SYSDBA/SYSDBA@localhost:5236 DIRECTORY=/backup FILE=full.dmp LOG=full_exp.log FULL=YDIRECTORY:导出文件存放目录(达梦8以后支持,早期版本用FILE指定全路径)。FULL=Y:表示全库导出。- 其他模式:
SCHEMAS(按用户)、TABLES(按表)、QUERY(按条件查询导出)。
按用户导入:
dimp USERID=SYSDBA/SYSDBA@localhost:5236 DIRECTORY=/backup FILE=schema.dmp LOG=schema_imp.log SCHEMAS=HRTABLE_EXISTS_ACTION参数很重要:当表存在时如何处理。SKIP(跳过)、APPEND(追加数据)、TRUNCATE(清空后插入)、REPLACE(删除重建)。根据场景选择。
避坑指南:
- 字符集问题:这是逻辑备份迁移中最常见的问题。如果源库和目标库的字符集不一致,导入时可能出现乱码。务必在导出和导入前,用
SELECT SF_GET_UNICODE_FLAG();或查看V$PARAMETER中的UNICODE_FLAG确认字符集。建议源和目标保持一致,或确保兼容。 - 大对象(LOB)数据:导出包含大字段(CLOB, BLOB)的表时,速度可能会很慢,且容易出错。可以考虑使用
CLUSTER=N参数(不按簇导出),或者对于超大的LOB,采用物理备份或第三方工具分段迁移。 - 空间不足:导出文件可能很大,确保
DIRECTORY指向的磁盘有足够空间。导入时,确保目标表空间有足够空间容纳数据。
5.2 联机备份与恢复
对于生产系统,物理备份(RMAN)更高效、更可靠。达梦的RMAN工具(dmrman)也是命令行工具。
执行联机全备(需要在
disql中开启归档和备份模式):-- 1. 配置归档(需提前准备归档目录) ALTER DATABASE MOUNT; ALTER DATABASE ADD ARCHIVELOG 'DEST=/dmarch, TYPE=LOCAL, FILE_SIZE=1024, SPACE_LIMIT=10240'; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN; -- 2. 执行备份(以下为SQL命令,在disql中执行) BACKUP DATABASE FULL BACKUPSET '/backup/full_bak_20240515';备份集会生成在指定目录。也可以使用
dmrman工具在外部执行备份命令。使用 dmrman 进行恢复: 假设数据文件损坏,需要从全备恢复。
dmrman CTLSTMT="RESTORE DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/backup/full_bak_20240515'" dmrman CTLSTMT="RECOVER DATABASE '/opt/dmdbms/data/DAMENG/dm.ini' FROM BACKUPSET '/backup/full_bak_20240515'" dmrman CTLSTMT="RECOVER 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文件中。实时查看正在执行的慢 SQL:
SELECT SESSID, SQL_TEXT, STATE, TIME_USED/1000 AS TIME_MS FROM V$SESSIONS WHERE STATE='ACTIVE' 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_PERCENT=>10);采样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 STATE='ACTIVE' AND TIME_USED > 300000000; -- 超过5分钟 " echo "$CHECK_SQL" | disql SYSDBA/SYSDBA@localhost: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 USERID=SYSDBA/SYSDBA@localhost:5236 DIRECTORY=$BAK_DIR FILE=logic_full_${BAK_DATE}.dmp LOG=$LOG_DIR/exp_full_${BAK_DATE}.log FULL=Y COMPRESS=Y else # 这里简化处理,实际增量备份需要基于之前的备份文件,更复杂一些 dexp USERID=SYSDBA/SYSDBA@localhost:5236 DIRECTORY=$BAK_DIR FILE=logic_incr_${BAK_DATE}.dmp LOG=$LOG_DIR/exp_incr_${BAK_DATE}.log SCHEMAS=HR 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/SYSDBA@localhost:5236 > $LOG_DIR/phy_bak_${BAK_DATE}.log 2>&1 # 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测试连接。
- 安装达梦 ODBC 驱动包(如
JDBC 连接字符串: 在 Java 应用或 Navicat 中,连接字符串通常如下:
jdbc:dm://localhost:5236/DAMENG?schema=SYSDBA&zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-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/SYSDBA@localhost:5236
ARM 环境注意:达梦也提供了 ARM 架构的 Docker 镜像(如dameng/dm8:arm64)。在 ARM 服务器(如华为鲲鹏、苹果 M1)上部署时,务必指定正确的镜像标签,否则会因架构不匹配而无法运行。
命令的世界看似枯燥,但却是掌控数据库的基石。从简单的查询到复杂的性能调优,从手动备份到自动化运维,每一步都离不开对这些命令的深刻理解和熟练运用。我建议你准备一个测试环境,把本文提到的命令都亲手敲一遍,观察输出,理解其含义。遇到错误不要慌,仔细阅读错误信息,结合日志文件($DM_HOME/log目录下)分析,这才是最快的成长路径。记住,最好的学习方式就是“动手”和“踩坑”,而命令就是你最趁手的工具。