效率翻倍!达梦数据库 disql 使用技巧全攻略

科技   2024-10-28 12:16   江苏  

大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。

社群交流

为了给大家提供一些技术交流的平台,目前已成立的技术交流群:

  • Oracle 数据库交流群
  • 国产数据库交流群
  • Linux 技术交流群
  • ChatGPT 4o 免费体验群

需要进群(均已超过 200 人,需要邀请)可以添加号主微信:Lucifer-0622,备注对应的群名即可。

前言

达梦数据库的 disql 等同于 Oracle 数据库的 sqlplus,都是 DBA 最常用的客户端连接工具,但是都有一个共同的问题:不咋好用

为什么不好用?根据我的使用经验,大致有以下几点原因:

  • 连接方式复杂:有很多连接参数,初学者很难记全;
  • 连接命令冗长:连接数据库需要输入一长串命令,费时费事;
  • 输出格式散乱:SQL 查询输出结果格式不整齐,容易造成阅读障碍;
  • 历史命令查看:不支持历史命令上下文翻页查看和修改,无法光标移动;
  • 连接信息显示:客户端连接后没有库和用户相关信息提示,可能会造成误操作;

针对以上痛点,我之前在 Oracle 数据库针对 sqlplus 有介绍过一系列优化方式以及提升效率的技巧:

同样的,在达梦数据库中,disql 可以照葫芦画瓢,拿来主义!

本文所有优化配置以及使用技巧,在达梦一键安装脚本中均以加入,一键安装以及优化配置:DMShellInstall 一键安装脚本[3]

 ███████   ████     ████  ████████ ██               ██  ██ ██                    ██              ██  ██
░██░░░░██ ░██░██   ██░██ ██░░░░░░ ░██              ░██ ░██░██                   ░██             ░██ ░██
░██    ░██░██░░██ ██ ░██░██       ░██       █████  ░██ ░██░██ ███████   ██████ ██████  ██████   ░██ ░██
░██    ░██░██ ░░███  ░██░█████████░██████  ██░░░██ ░██ ░██░██░░██░░░██ ██░░░░ ░░░██░  ░░░░░░██  ░██ ░██
░██    ░██░██  ░░█   ░██░░░░░░░░██░██░░░██░███████ ░██ ░██░██ ░██  ░██░░█████   ░██    ███████  ░██ ░██
░██    ██ ░██   ░    ░██       ░██░██  ░██░██░░░░  ░██ ░██░██ ░██  ░██ ░░░░░██  ░██   ██░░░░██  ░██ ░██
░███████  ░██        ░██ ████████ ░██  ░██░░██████ ███ ███░██ ███  ░██ ██████   ░░██ ░░████████ ███ ███
░░░░░░░   ░░         ░░ ░░░░░░░░  ░░   ░░  ░░░░░░ ░░░ ░░░ ░░ ░░░   ░░ ░░░░░░     ░░   ░░░░░░░░ ░░░ ░░░

目前还是免费使用,快来下载体验吧!

在下方公众号回复:DMShellInstall,也可以获取一键安装脚本源码!

快捷指令

首先解决连接不方便的问题,为了避免冗长复杂的连接命令,我们可以直接使用 alias 别名的方式来创建快捷指令。

📢 注意:在安全允许的情况下,建议大家在达梦数据库主机上配置操作系统免密认证:达梦如何开启免密登录[4],连接更方便。

alias 别名

开启了免密登录之后,可以直接使用 disql / as sysdba 的方式连接,使用 alias 别名就是:

## 直接使用 disql / as sysdba 命令连接
[dmdba@dm8:~]$ disql / as sysdba

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.773(ms)
disql V8
SQL>

## 配置别名 ds,直接使用 ds 命令连接,十分方便快捷
[dmdba@dm8:~]$ alias ds='disql / as sysdba'
[dmdba@dm8:~]$ ds

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.321(ms)
disql V8
SQL>

可以看到,每次连接数据库都只需要输入 ds 即可,不需要输入完整的连接命令。那就有人要说了,那你每次不都要输入 alias ds='disql / as sysdba' 这个别名命令吗?

配置环境变量

确实,正常是需要的,但是,可以通过配置环境变量的方式来实现自动配置别名,比如:

## 将别名 ds 写入到 dmdba 用户的环境变量中
[dmdba@dm8:~]$ cat<<-EOF>>~/.bash_profile
alias ds='disql / as sysdba'
EOF

## 重新登录 dmdba 用户,就可以直接使用 ds 连接达梦数据库
[dmdba@dm8:~]$ exit
登出
[root@dm8:/root]# su - dmdba
[dmdba@dm8:~]$ ds

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.083(ms)
disql V8
SQL>

通过以上方式我们可以非常便捷得连接和使用达梦数据库。

花样玩法

如果熟练掌握 disql 的连接方式,还可以玩出很多种花样。

多实例自由切换

通过给每个实例指定不同的别名,比如使用端口号进行区分,5237 则别名为 ds5237:

## 指定连接端口号 5237 数据库的别名为 ds5237
alias ds5237="disql /:5237 as sysdba"

## 连接 5237 数据库
[dmdba@dm8:~]$ ds5237

服务器[LOCALHOST:5237]:处于普通打开状态
登录使用时间 : 3.948(ms)
disql V8
SQL>

一键调用 SQL 脚本

disql 调用 SQL 脚本是比较复杂的,需要十分了解才能运用自如,这里可以通过配置快捷命令来降低使用难度:

## 1、指定执行 SQL 的别名 dsql(增加格式化输出配置)
alias dsql="disql -S /:5236 as sysdba -C \\"set linesize 999 pagesize 999 long 1000 feed off\\" -E"

## 2、指定调用 SQL 脚本的别名 dssql
alias dssql="
disql -L -S /:5236 as sysdba \\\`"

使用方式:

## dsql 跟上需要执行的 SQL 语句即可
[dmdba@dm8:~]$ dsql "select name from v\$database;"

NAME
------
DAMENG

## dssql 跟上需要执行的 SQL 脚本即可
[dmdba@dm8:~]$ dssql dbname.sql

DAMENG

这里如果想写达梦巡检脚本的话,可以是一个很好的辅助,可以封装成函数来调用。

秒速连接数据库

如果再给 root 用户配上 sd 别名,那么连接达梦数据库只需要短短两个命令,1s 完成连接:

alias sd='su - dmdba'

## sd & ds,so easy,一个字:快!
[root@dm8:/root]# sd
[dmdba@dm8:~]$ ds

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.650(ms)
disql V8
SQL>

这里就介绍这么多,对于平常运维已经足够使用,更多玩法可以自行探索!

上下文切换

介绍完上面的快捷指令,其实对于 disql 的外部使用效率已经是翻天覆地了,接下来就得介绍 disql 的内部使用优化秘籍了。

熟悉的人看到上下文切换应该就猜到了,没错就是:rlwrap,堪称神器!!!

rlwrap 下载

rlwrap 是一款十分好用的 readline wrapper,在 disql 中可以解决我们的两个痛点:

  1. 历史命令无法查看修改
  2. 光标无法前后移动

rlwrap 下载地址:https://github.com/hanslub42/rlwrap/releases[5]

这个工具完美解决了困扰了很多 DBA 的问题,可以不用一次次的因为输错命令而重复输入,或者因为无法切换到上一条命令再次执行。

rlwrap 安装

rlwrap 依赖 readline 库,而 gcc 是一个编译器,由于官方提供的是源码安装包,所以建议使用源码编译来安装,也就需要提前安装这两个依赖软件包。

在 Linux 系统安装软件依赖包就需要配置软件源,这里参考我之前写过的:DBA 必备:Linux 软件源配置全攻略[6],选择对应系统以及版本,直接一键配置软件源:

## 挂载本地 ISO 镜像源
[root@dm8:/root]# mount /dev/cdrom /mnt/
mount: /dev/sr0 写保护,将以只读方式挂载

## 一键配置本地软件源
## 备份系统初始配置文件
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/* /etc/yum.repos.d/bak
## 一键配置软件源,默认 ISO 安装镜像挂载在 /mnt 目录下
cat<<-EOF>/etc/yum.repos.d/local.repo
[server]
name=server
baseurl=file:///mnt
enabled=1
gpgcheck=0
EOF
## 查看配置好的软件源
cat /etc/yum.repos.d/local.repo

安装 gcc 和 readline 软件:

## 安装过程省略
[root@dm8:/root]# yum install -y gcc readline-devel

## 检查是否安装成功,有输出则代表成功
[root@dm8:/root]# rpm -qa gcc readline
gcc-4.8.5-44.el7.x86_64
readline-6.2-11.el7.x86_64

安装完成后就可以编译安装 rlwrap 插件(这里我选用的是 0.42 版本,我比较常用,大家可以自行选择):

## 需要在 root 用户执行安装
[root@dm8:/soft]# tar -xf rlwrap-0.42.tar.gz
[root@dm8:/soft]# cd rlwrap-0.42

## 一键安装,安装过程太长,此处省略
[root@dm8:/soft/rlwrap-0.42]# ./configure && make && make install

## 检查是否安装成功
[root@dm8:/soft/rlwrap-0.42]# rlwrap -v
rlwrap 0.42

插件安装完成后就可以使用了,使用方式很简单:

## 只需要在执行的命令前加上 rlwrap 即可
[dmdba@dm8:~]$ rlwrap disql / as sysdba

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 4.923(ms)
disql V8
SQL> select name from v$database;

行号     NAME
---------- ------
1          DAMENG

这里没法具体演示上下文切换以及光标移动,大家可以自行安装体验。

配置环境变量

同样的,为了方便使用,可以通过配置环境变量➕ alias 别名的方式来实现调用:

cat<<-EOF>>/home/dmdba/.bash_profile
alias disql='rlwrap disql'
EOF

这里只需要针对 disql 进行配置 rlwrap,相对的 ds,ds5237 等别名都会自动生效,前提是 rlwrap 这个命令需要放到最前面确保最先生效!

glogin 优化

讲到这里,基本已经解决了大多数人使用 disql 的痛点,80% 的朋友已经可以愉快地使用了,剩下的少部分人可能更加注重细节以及使用体验。

虽然配置 glogin 在很多人眼里是有一些风险的,因为 glogin 文件是比较容易造成 SQL 注入的方式之一,所以不太熟悉的可以直接忽略这部分的配置。

这里我分享一下我常用的 glogin 配置,大家可以自行选配:

cat<<-\EOF>$DM_HOME/bin/disql_conf/glogin.sql
-- 显示密钥过期时间
column expired_date new_value _edate
select to_char(expired_date,'yyyy-mm-dd') expired_date from v$license;
host echo "密钥过期时间:&_edate"
-- 设置 dbms_output 输出缓冲区大小
set serveroutput on size 1000000
-- 设置输出格式
set long 200 linesize 500 pages 5000
-- 去除重定向输出每行拖尾空格
set trimspool on
-- 去除行号显示
set lineshow off
-- 显示当前连接信息
col name new_value _dname
select name from v$database;
col port_num new_value _port
select para_value port_num from v$dm_ini where para_name='PORT_NUM';
set SQLPROMPT "_USER'@'_dname':'_port SQL> "
-- 显示当前时间
set time on
EOF

重新登录 disql,效果如下:

[dmdba@dm8:~]$ ds

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 3.881(ms)
密钥过期时间:2025-07-03
disql V8
23:04:41 dmdba@DAMENG:5236 SQL> select name from v$database;

NAME
------
DAMENG

已用时间: 0.601(毫秒). 执行号:2805.

可以看到 disql 连接数据库后,比默认的 disql 连接多了很多信息:

  • 数据库连接用户:dmdba
  • 数据库名称:DAMENG
  • 数据库端口号:5236
  • 密钥过期时间:2025-07-03
  • 当前系统时间:23:04:41

这些信息对于 DBA 来说十分重要,可以很大程度上避免数据库误操作。

写在最后

disql 与 sqlplus 的设计理念十分相似,这种借鉴方式其实对 Oracle DBA 来说是十分友好的,使用起来基本可以算是无缝切换,值得点赞!文不在深,实用则灵!

希望看完本文之后,可以让你的达梦数据库运维效率直接翻倍! 如果有遗漏或者不足的地方,欢迎评论区补充或者投稿,感谢阅读!

往期精彩文章

达梦数据库安装最详细教程
一招教你学会达梦数据库的免密登录
一文讲透达梦数据库的大小写敏感
金仓数据库 KingbaseES V9 单机安装指南
KingbaseES KSQL 免密登录的几种方式
KingbaseES 控制文件冗余与恢复秘籍
南大通用 GBASE 8s V8.8 数据库最全安装指南
GBase 8s GDCA 认证课后练习题大全(题库)
GBase 8s 数据库巡检报告及一键巡检脚本
YashanDB 一键生成 AWR 报告
YashanDB 数据库安装部署

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
- END -

Lucifer三思而后行
不积跬步,无以至千里;不积小流,无以成江海。一位籍籍无名的数据库爱好者!
 最新文章