摘要:DIsql 是达梦数据库(DM8)自带的命令行交互工具,功能强大、灵活易用。本文基于 DM8 官方手册,全面讲解 DIsql 的启动登录、环境变量配置、核心命令、脚本执行等核心用法,并附有大量实战示例,是数据库管理员和开发工程师不可或缺的参考手册。


目录

  1. DIsql 简介
  2. 安装与启动
  3. 切换登录与退出
  4. 环境变量配置详解
  5. 核心操作命令
  6. 脚本执行
  7. 实用技巧汇总
  8. 常见问题与解决方案

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

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐