达梦数据库 DIsql 使用及DIsql 增强神器 rlwrap 安装与配置
摘要:DIsql 是达梦数据库(DM8)自带的命令行交互工具,功能强大、灵活易用。本文基于 DM8 官方手册,全面讲解 DIsql 的启动登录、环境变量配置、核心命令、脚本执行等核心用法,并附有大量实战示例,是数据库管理员和开发工程师不可或缺的参考手册。
目录
1. DIsql 简介
DIsql(DM Interactive SQL)是达梦数据库 DM8 自带的命令行客户端工具,类似于 Oracle 的 SQL*Plus。它主要承担以下职责:
- 交互式 SQL 执行:将用户输入的 SQL 语句打包发送给 DM 数据库服务器执行,并展示结果
- DIsql 内部命令:支持一套专属命令(不发往服务器),用于环境设置、显示控制、脚本管理等
- 历史记录:执行完的 SQL 语句保存在内存中,可用上下键回调、修改并重新执行
SQL 语句 vs DIsql 命令
| 对比项 | SQL 语句 | DIsql 命令 |
|---|---|---|
| 标准 | ANSI 标准 | DM 内部标准 |
| 关键字缩写 | 不可缩写 | 可缩写 |
| 结束方式 | 分号 ; 或 / |
分号可有可无 |
| 能否更新数据 | 能 | 不能 |
| 是否保存到历史 | 是 | 否 |
📌 小技巧:在 DIsql 中,SQL 语句以
;结束;创建存储过程、触发器、函数、包等语句块以/结束。
2. 安装与启动
DIsql 无需单独安装,只要安装了 DM 数据库,就可以在以下位置找到:
- 程序菜单:开始菜单 → 达梦数据库 → DIsql
- 安装目录:
{安装路径}\bin\DIsql.exe(Windows)或{安装路径}/bin/disql(Linux)
2.1 Windows 环境启动
方式一:程序菜单启动
双击菜单中的 DIsql 快捷方式,在出现的界面中输入用户名、密码即可登录。
方式二:安装目录直接启动
D:\dmdbms\bin\DIsql.exe
双击后,依次输入用户名和密码(密码不回显),登录到本地 DM 数据库实例。
2.2 命令行启动与登录语法
命令行方式是最灵活的启动方式,适用于所有操作系统。
完整语法
disql [-h | help]
disql [[-L] [-S]] [<logon> | /NOLOG] [<start>]
<logon> ::= {<username>[/<password>] | /}[@<connect_identifier>][<logon_option>][<os_auth>]
<connect_identifier> ::= <svc_name> | <host>[:<port>] | <unixsocket_file>
<logon_option> ::= #{<extend_option>=<value>{,...}} 或 #"{...}"
<os_auth> ::= AS {SYSDBA | SYSSSO | SYSAUDITOR | USERS | AUTO}
常用登录示例
# 1. 本地数据库登录(默认端口 5236)
disql SYSDBA/Dmsys_123
# 2. 指定 IP 和端口登录
disql SYSDBA/Dmsys_123@192.168.1.64:5236
# 3. 使用服务名登录(需在 dm_svc.conf 中配置)
disql SYSDBA/Dmsys_123@dmsvc
# 4. 操作系统身份验证(无需用户名密码)
disql / AS SYSDBA
# 5. 静默模式启动(隐藏 SQL> 提示符)
disql -S SYSDBA/Dmsys_123
# 6. 只尝试登录一次(失败即退出)
disql -L SYSDBA/Dmsys_123@192.168.1.64:5236
# 7. 不连接数据库直接进入 DIsql
disql /NOLOG
# 8. 启动时直接执行 SQL 语句
disql SYSDBA/Dmsys_123 -E "SELECT TOP 1 * FROM SYSOBJECTS"
# 9. 启动时执行脚本文件
disql SYSDBA/Dmsys_123 @e:\init.sql
# 10. IPv6 地址登录
disql SYSDBA/Dmsys_123@[fe80::1e6f:65ff:fed1:3724%6]:5236
扩展选项(logon_option)
| 扩展选项 | 说明 | 示例值 |
|---|---|---|
inet_type |
网络协议类型 | TCP(默认)/ UDP / IPC / UNIXSOCKET / RDMA |
mpp_type |
MPP 登录属性 | GLOBAL(默认)/ LOCAL |
ssl_path |
SSL 证书路径 | /home/dmdbms/bin/client_ssl/SYSDBA |
ssl_pwd |
SSL 证书密码 | - |
proxy_client |
被代理用户名 | USER1 |
ukey_name |
UKEY 名称 | - |
ukey_pin |
UKEY 密钥 | - |
# 使用 TCP 协议,MPP 本地会话
disql SYSDBA/Dmsys_123@192.168.1.64:5236#"{mpp_type=local,inet_type=tcp}"
# SSL 加密连接
disql SYSDBA/Dmsys_123@192.168.1.64:5236#"{ssl_path=/home/dmdbms/bin/client_ssl/SYSDBA,ssl_pwd=Password01}"
# 代理用户登录
disql USER2/Password02@192.168.1.64:5236#"{inet_type=tcp,proxy_client=USER1}"
密码中含特殊字符的处理
| 场景 | Windows 写法 | Linux 写法 |
|---|---|---|
密码含 / |
disql user01/"""Pass/word01""" |
./disql user01/'"Pass/word01"' |
| 密码含空格 | disql user01/"Pass word01" |
./disql user01/"Pass word01" |
密码含 " |
disql user01/"""Pass""""word01""" |
./disql user01/'"Pass""\word01"' |
密码含 ' |
不适用 | ./disql user01/"Pass'word01" |
3. 切换登录与退出
3.1 LOGIN / LOGOUT
LOGIN 命令以交互方式重新登录,提示输入各项参数:
SQL> LOGIN
服务名:192.168.1.64:5236
用户名:SYSDBA
密码:(不回显)
SSL路径:(可为空)
MPP类型(GLOBAL/LOCAL):GLOBAL
协议类型(TCP/UDP/IPC...):TCP
LOGOUT 命令断开当前连接,但不退出 DIsql:
SQL> LOGOUT
3.2 CONN / DISCONN
CONN[ECT] 是更简洁的连接方式:
-- 连接到指定服务器
SQL> CONN SYSDBA/Dmsys_123@192.168.1.150
-- 操作系统身份验证
SQL> CONN / AS SYSDBA
-- 断开连接(不退出 DIsql)
SQL> DISCONN
注意:使用
CONN建立新会话时,会自动断开先前会话。
3.3 退出 DIsql
-- 语法
EXIT|QUIT [SUCCESS|FAILURE|WARNING|n] [COMMIT|ROLLBACK]
-- 常用示例
SQL> EXIT -- 提交并退出(默认)
SQL> EXIT ROLLBACK -- 回滚后退出
SQL> QUIT COMMIT -- 提交后退出
SQL> EXIT FAILURE -- 返回错误码 1 退出
4. 环境变量配置详解
DIsql 提供了 40+ 个环境变量,通过 SET 命令设置,通过 SHOW 命令查看。
4.1 SET 命令语法
SET <变量名> <值> [<变量名> <值> ...]
-- 示例:同时设置多个变量
SET HEADING ON TIMING ON LINESIZE 120
4.2 常用环境变量速查表
显示控制类
| 变量名 | 默认值 | 说明 | 常用设置 |
|---|---|---|---|
HEADING |
ON | 是否显示列标题 | SET HEADING OFF 隐藏标题 |
LINESHOW |
ON | 是否显示行号 | SET LINESHOW OFF 隐藏行号 |
FEEDBACK |
6 | 显示查询总行数的阈值 | SET FEEDBACK OFF 不显示 |
PAGESIZE |
14 | 每页显示行数 | SET PAGESIZE 0 不分页 |
LINESIZE |
屏幕宽度 | 每行显示宽度 | SET LINESIZE 200 |
TIMING |
ON | 显示 SQL 执行时间 | SET TIMING OFF |
TIME |
OFF | 显示系统当前时间 | SET TIME ON |
NULL_SHOW |
ON | 空值是否显示为 NULL | SET NULL_SHOW ON |
ISQL_MODE |
0 | 结果集打印格式 | 1=Oracle格式,3=MySQL格式 |
事务控制类
| 变量名 | 默认值 | 说明 |
|---|---|---|
AUTOCOMMIT |
OFF | 自动提交。生产环境通常保持 OFF |
-- 开启自动提交
SET AUTOCOMMIT ON
-- 关闭自动提交(默认,需手动 COMMIT)
SET AUTOCOMMIT OFF
大字段处理类
| 变量名 | 默认值 | 说明 |
|---|---|---|
LONG |
800 | BLOB/CLOB/VARCHAR 等显示的最大字节数 |
LOBCOMPLETE |
OFF | 是否从服务器全部取出大字段数据 |
-- 显示更多大字段内容(防止截断)
SET LONG 10000
SET LOBCOMPLETE ON
输出与脚本类
| 变量名 | 默认值 | 说明 |
|---|---|---|
ECHO |
ON | 执行脚本时是否回显 SQL |
VERIFY |
ON | 是否打印变量替换前后的语句 |
SERVEROUTPUT |
OFF | 是否打印 DBMS_OUTPUT 输出 |
COLSEP |
空格 | 列之间的分隔符 |
TRIMPSOOL |
OFF | SPOOL 文件中是否去除行尾空格 |
-- 开启 DBMS_OUTPUT 打印
SET SERVEROUTPUT ON SIZE 20000
-- 执行 PL/SQL 块查看输出
BEGIN
DBMS_OUTPUT.PUT_LINE('Hello DIsql!');
END;
/
性能诊断类
| 变量名 | 默认值 | 说明 |
|---|---|---|
AUTOTRACE |
OFF | 执行计划和统计信息跟踪 |
-- 查看执行计划(不执行语句)
SET AUTOTRACE INDEX
-- 执行语句并输出执行计划 + 统计信息
SET AUTOTRACE TRACE
SELECT COUNT(*) FROM SYSOBJECTS;
-- 只打印执行计划,不显示结果集
SET AUTOTRACE TRACEONLY
-- 关闭跟踪
SET AUTOTRACE OFF
AUTOTRACE TRACE 输出的统计信息含义:
| 统计项 | 说明 |
|---|---|
data pages changed |
更改的数据页数 |
logical reads |
逻辑读次数 |
physical reads |
物理读次数 |
redo size |
REDO 日志大小(字节) |
bytes sent to client |
发送给客户端的数据量 |
rows processed |
DML 操作影响的行数 |
exec time(ms) |
执行时间(毫秒) |
连接稳定性类
| 变量名 | 默认值 | 说明 |
|---|---|---|
AUTORECONN |
ON | 断线后是否自动重连 |
RETRY_CONN |
0 | 自动重连次数 |
RETRY_CONN_TIME |
0 | 自动重连时间间隔(秒) |
READ_ONLY |
OFF | 设置会话为只读模式 |
-- 设置断线自动重连 3 次,每次间隔 5 秒
SET RETRY_CONN 3
SET RETRY_CONN_TIME 5
-- 设置会话为只读(防止误操作)
SET READ_ONLY ON
4.3 SHOW 命令查看环境变量
-- 查看所有环境变量
SHOW ALL
-- 查看指定变量
SHOW AUTOCOMMIT
SHOW TIMING
SHOW LINESIZE
4.4 配置文件持久化设置
在 DIsql 安装目录的 glogin.sql(全局)或用户目录的 login.sql(用户级)中添加 SET 命令,可让 DIsql 每次启动时自动生效:
-- glogin.sql 示例
SET LINESIZE 200
SET PAGESIZE 50
SET TIMING ON
SET SERVEROUTPUT ON
SET NULL_SHOW ON
5. 核心操作命令
5.1 DESCRIBE — 查看对象结构
-- 基本用法
DESC[RIBE] <对象名>
-- 示例:查看表结构
SQL> DESC SYSOBJECTS;
-- 查看嵌套类型(最多显示 3 层)
SQL> SET DESCRIBE DEPTH 3
SQL> DESC <对象名>
5.2 SPOOL — 将输出保存到文件
-- 开始记录到文件
SPOOL <文件路径>
-- 停止记录
SPOOL OFF
-- 示例:将查询结果保存到文件
SQL> SPOOL D:\output\result.txt
SQL> SELECT * FROM SYSOBJECTS WHERE ROWNUM <= 10;
SQL> SPOOL OFF
5.3 DEFINE / UNDEFINE — 本地变量管理
-- 定义变量
DEFINE <变量名> = <值>
-- 在 SQL 中使用(默认前缀 &)
SQL> DEFINE tname = SYSOBJECTS
SQL> SELECT * FROM &tname;
-- 取消定义
UNDEFINE tname
-- 修改变量前缀为 #
SET DEFINE #
SQL> SELECT #tname FROM DUAL;
5.4 COLUMN — 格式化列输出
-- 设置列显示宽度
COLUMN <列名> FORMAT <格式>
-- 数值格式
SQL> COLUMN ID FORMAT 9999999
SQL> COLUMN SALARY FORMAT $99,999.99
-- 字符串截断宽度
SQL> COLUMN NAME FORMAT A30
-- 重置列格式
SQL> COLUMN NAME CLEAR
5.5 ACCEPT — 交互式接收用户输入
-- 语法
ACCEPT <变量名> [PROMPT '提示文本']
-- 示例
SQL> ACCEPT emp_name PROMPT '请输入员工姓名: '
SQL> SELECT * FROM EMPLOYEE WHERE NAME = '&emp_name';
5.6 WHENEVER — 异常处理
-- SQL 出错时退出 DIsql
WHENEVER SQLERROR EXIT FAILURE ROLLBACK
-- SQL 出错时继续执行
WHENEVER SQLERROR CONTINUE
-- 脚本执行完后退出
WHENEVER SQLERROR EXIT
5.7 CLEAR — 清理缓存
-- 清除屏幕缓冲区
CLEAR SCREEN
-- 清除所有列格式设置
CLEAR COLUMNS
-- 清除所有 DEFINE 变量
CLEAR DEFINES
5.8 LIST / APPEND — 查看和追加 SQL
-- 查看缓冲区中的 SQL
LIST
-- 向缓冲区末尾追加内容
APPEND WHERE ID = 1
-- 再次执行缓冲区的 SQL
/
5.9 MORE — 查看下一个结果集
在执行返回多个结果集的语句时,使用 MORE 命令显示下一个结果集:
SQL> CALL <存储过程>();
-- 显示第一个结果集后输入:
SQL> MORE
6. 脚本执行
6.1 运行 SQL 脚本文件
DIsql 支持 4 种方式运行脚本文件:
-- 方式一:使用反引号(启动时或交互中均可用)
disql SYSDBA/Dmsys_123 `e:\init.sql
SQL> `e:\init.sql
-- 方式二:使用 @ 符号
disql SYSDBA/Dmsys_123 @e:\init.sql
SQL> @e:\init.sql
-- 方式三:使用 @@ 符号(仅交互模式)
SQL> @@e:\init.sql
-- 方式四:使用 START 命令
SQL> START e:\init.sql
注意:
- 脚本文件大小上限为 2GB
- 路径含空格或特殊符号时,需用双引号包裹:
@"e:\my scripts\init.sql"
6.2 脚本参数传递
脚本中可使用 &1、&2… 作为参数占位符:
-- b.sql 内容
SELECT name, type FROM V$PARAMETER WHERE name='&1';
-- 传入参数执行
SQL> START E:\b.sql CTL_PATH
-- 执行结果(自动替换参数)
原值 1: SELECT name,type FROM V$PARAMETER WHERE name='&1';
新值 1: SELECT name,type FROM V$PARAMETER WHERE name='CTL_PATH';
6.3 EDIT — 编辑脚本
-- 打开系统默认编辑器编辑当前 SQL 缓冲区
EDIT
-- 编辑指定文件
EDIT e:\myscript.sql
6.4 一个完整的脚本示例
-- setup.sql:初始化脚本示例
SET ECHO ON
SET TIMING ON
SET SERVEROUTPUT ON
WHENEVER SQLERROR EXIT FAILURE ROLLBACK
-- 创建测试表
CREATE TABLE T_TEST (
ID INT PRIMARY KEY,
NAME VARCHAR(50),
CREATED TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入测试数据
INSERT INTO T_TEST (ID, NAME) VALUES (1, '达梦数据库');
INSERT INTO T_TEST (ID, NAME) VALUES (2, 'DIsql 工具');
COMMIT;
-- 查询验证
SELECT * FROM T_TEST;
-- 完成提示
BEGIN
DBMS_OUTPUT.PUT_LINE('初始化完成,共插入 2 条记录。');
END;
/
执行方式:
disql SYSDBA/Dmsys_123@localhost:5236 @setup.sql
7. 实用技巧汇总
7.1 快速查询模式(适合导出数据)
-- 关闭所有格式化输出,适合数据导出
SET HEADING OFF -- 不显示列标题
SET LINESHOW OFF -- 不显示行号
SET FEEDBACK OFF -- 不显示行数统计
SET TIMING OFF -- 不显示执行时间
SET PAGESIZE 0 -- 不分页
SET COLSEP ',' -- 使用逗号分隔(CSV 格式)
SPOOL D:\export.csv
SELECT ID, NAME, CREATED FROM T_TEST;
SPOOL OFF
7.2 开发调试模式(完整诊断)
-- 开启完整调试信息
SET TIMING ON
SET AUTOTRACE TRACE
SET SERVEROUTPUT ON SIZE 50000
SET ECHO ON
7.3 生产查询安全模式
-- 只读模式,防止误操作
SET READ_ONLY ON
SET AUTOCOMMIT OFF
7.4 兼容 Oracle 格式输出
-- 模拟 Oracle SQL*Plus 输出格式
SET ISQL_MODE 1
SET WRAP ON
7.5 分析慢 SQL
-- 步骤1:开启统计跟踪
SET AUTOTRACE TRACE
-- 步骤2:执行目标 SQL
SELECT t1.*, t2.name
FROM order_detail t1
JOIN customer t2 ON t1.cust_id = t2.id
WHERE t1.order_date >= '2024-01-01';
-- 步骤3:查看执行计划和统计信息(自动输出)
-- physical reads > 0 说明有磁盘 IO,需考虑加索引
-- exec time(ms) 是实际执行时间
7.6 批量执行 SQL 脚本
# Windows 批处理脚本
@echo off
set DM_BIN=D:\dmdbms\bin
set CONN_STR=SYSDBA/Dmsys_123@localhost:5236
%DM_BIN%\disql.exe %CONN_STR% @step1_create_tables.sql
%DM_BIN%\disql.exe %CONN_STR% @step2_insert_data.sql
%DM_BIN%\disql.exe %CONN_STR% @step3_create_indexes.sql
echo 所有脚本执行完毕
8.disql 增强神器 rlwrap 安装与配置
使用disql时你是否遇到过这种情况呢?不能使用backspace删除,不能使用上下键翻历史命令
在Linux环境下,这个问题可以通过安装rlwrap解决
rlwrap是什么呢?
rlwrap 是一个给命令行工具增加历史记录、上下翻页、光标移动的轻量级增强工具,基于 GNU Readline 库。它本身不执行命令,只包装其他程序(如 disql、sqlplus),让原生不支持上下键的命令行变得好用。
rlwrap下载地址
https://mirrors.aliyun.com/macports/distfiles/rlwrap/
下载压缩包后解压,并且安装好所需的依赖包,再编译安装即可
tar -zxvf rlwrap-0.48.tar.gz
yum install -y gcc*
yum install -y libtermcap-devel
yum install -y readline
yum install -y readline-devel
yum install -y make
./configure -q
make && make install
切换到dmdba用户,配置alias
su - dmdba
vim .bashrc
alias disql='rlwrap disql'
9. 常见问题与解决方案
Q1:连接失败,提示"无效的用户名/密码"
原因:密码包含特殊字符,未正确转义。
解决:
# Windows:特殊字符用三重双引号括起
disql user01/"""Pass/word01"""
# Linux:特殊字符用单引号+双引号组合
./disql user01/'"Pass/word01"'
Q2:查询大字段数据显示截断
原因:LONG 环境变量默认只显示 800 字节。
解决:
SET LONG 100000
SET LOBCOMPLETE ON
Q3:DBMS_OUTPUT 没有输出
原因:SERVEROUTPUT 默认关闭。
解决:
SET SERVEROUTPUT ON SIZE 1000000
Q4:脚本执行遇到错误继续执行后面的语句
原因:DIsql 默认遇到错误继续执行。
解决:在脚本开头加入:
WHENEVER SQLERROR EXIT FAILURE ROLLBACK
Q5:中文乱码
原因:客户端编码和数据库编码不一致。
解决:
-- 设置客户端字符集与数据库一致
SET CHAR_CODE UTF8 -- 或 GBK、GB18030
SET LOCAL_CODE UTF8
Q6:远程连接数据库超时断开
解决:设置自动重连:
SET AUTORECONN ON
SET RETRY_CONN 5
SET RETRY_CONN_TIME 3
Q7:如何查看 DIsql 版本信息
disql -h
# 或
disql help
总结
DIsql 是达梦数据库生态中最基础、也最强大的命令行工具。掌握好它,能让你在无图形界面的服务器环境下高效完成数据库管理工作。
核心要点回顾:
| 场景 | 关键命令 |
|---|---|
| 连接数据库 | disql user/pwd@host:port |
| 快速查看表结构 | DESC <表名> |
| 执行脚本 | @<脚本路径> 或 START <路径> |
| 查看执行计划 | SET AUTOTRACE TRACE |
| 输出到文件 | SPOOL <文件路径> → SQL → SPOOL OFF |
| 调试存储过程 | SET SERVEROUTPUT ON |
| 格式化输出 | SET PAGESIZE 0 LINESIZE 200 LINESHOW OFF |
达梦社区地址:https://eco.dameng.com
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)