通常我们要在LINUX系统,进行DM达梦数据库维护的时候,最常用的方法就是使用disql 连接数据库,查询相关的系统系统和表的信息。

比如:


SQL>SELECT * FROM V$DATABASE;   --查询信息
NAME    CREATE_TIME    ARCH_MODE    LAST_CKPT_TIME    STATUS$    ROLE$    MAX_SIZE    TOTAL_SIZE    DSC_NODES    OPEN_COUNT    STARTUP_COUNT    LAST_STARTUP_TIME
 DAMENG    2022-02-24 23:56:31    N    2022-05-17 17:57:32    4    0    0    21120    1    20    17    2022-05-16 08:30:53

-------------------------------------------------------------------------------------------------------------------------

        但是,通常运维管理员在维护系统时最常用的方法,是在操作系统的命令行提示符下,执行命令或者脚本进行操作。

        比如正在操作系统命令行下修改某些配置文件内容,需要配置数据库的库名,实例名,端口等,需要连接数据库查看,然后还要再回到操作系统命令行。要么进入disql模式查询,要么再开一个窗口连接数据库后,查询后再另一个窗口继续操作,略显麻烦。

        把数据库操作脚本化,既符合操作使用习惯,又能为了完成特定的工作,把命令保存为常用脚本也能提高效率,比较方便。

        达梦数据库进行数据库系统维护时,可以采用命令行、和SHELL脚本的方式,通常可以有几种方式:

(1)在操作系统命令行,类似执行一个命令的操作形式;

dmdba> disql  sysdba/SYSDBA12345@localhost:52380<<!
 > SELECT * FROM V\$DATABASE;
 > !dmdba> disql  sysdba/SYSDBA12345@localhost:52380  -e "SELECT * FROM V\$DATABASE;"

        通常这种命令行的方式,用来在查询的信息不多的情况下,比如管理员只想知道数据库的某个状态,配置等,不适合查询很多数据结果要保存的情况。

        注意:这个执行的SQL语句,其中有$符号的时候,会被shell 直接默认为一个变量,因此要加反斜杠进行转义,达梦数据库的很多系统视图是使用V$开头的,要查询系统视图的信息,执行这种命令行的方式一定要写成 V\$开头的形式,比如:V\$INSTANCE ,V\$DM_INI 等。

(2)在操作系统命令行,,调用SQL文件的形式;

使用这个命令可以执行sql脚本

dmdba> disql sysdba/SYSDBA12345@localhost:52380  \`test.sql 
结果如下:
SQL> SELECT * FROM V$INSTANCE;
行号     NAME     INSTANCE_NAME INSTANCE_NUMBER HOST_NAME SVR_VERSION                DB_VERSION          START_TIME          STATUS$ MODE$  OGUID       DSC_SEQNO   DSC_ROLE
 ---------- -------- ------------- --------------- --------- -------------------------- ------------------- ------------------- ------- ------ ----------- ----------- --------
 1          DMSERVER DMSERVER      1               kong      DM Database Server x64 V8  DB Version: 0x7000c 2022-05-16 09:52:38 OPEN    NORMAL 0           0           NULL已用时间: 0.324(毫秒). 执行号:4000.
 SQL> SELECT * FROM V$DATABASE;行号     NAME   CREATE_TIME         ARCH_MODE LAST_CKPT_TIME      STATUS$     ROLE$       MAX_SIZE             TOTAL_SIZE           DSC_NODES   OPEN_COUNT  STARTUP_COUNT        LAST_STARTUP_TIME  
 ---------- ------ ------------------- --------- ------------------- ----------- ----------- -------------------- -------------------- ----------- ----------- -------------------- -------------------
 1          DAMENG 2022-01-10 00:39:28 Y         2022-05-17 19:37:18 4           0           0                    28928                1           50          46                   2022-05-16 09:52:39已用时间: 4.002(毫秒). 执行号:4001.
 SQL> EXIT;
 --------------------------------------------------------------------------------------------------------------------------------SQL文件的内容示例:
vi  test.sql 
SELECT * FROM V$INSTANCE;
 SELECT * FROM V$DATABASE;
 EXIT;

2、或者觉得disql 在命令行使用密码和端口等,显示输入密码不安全且输入太多,可以:

disql  /NOLOG  \`test.sql 
dmdba@kong:~> disql /NOLOG  \`test.sql
 disql V8
 SQL> CONN sysdba/Dameng123@localhost:5238

服务器[localhost:5238]:处于普通打开状态
登录使用时间 : 2.402(ms)

SQL> SELECT * FROM V$INSTANCE;
行号     NAME     INSTANCE_NAME INSTANCE_NUMBER HOST_NAME SVR_VERSION                DB_VERSION          START_TIME          STATUS$ MODE$  OGUID       DSC_SEQNO   DSC_ROLE
 ---------- -------- ------------- --------------- --------- -------------------------- ------------------- ------------------- ------- ------ ----------- ----------- --------
 1          DMSERVER DMSERVER      1               kong      DM Database Server x64 V8  DB Version: 0x7000c 2022-05-16 09:52:38 OPEN    NORMAL 0           0           NULL已用时间: 0.324(毫秒). 执行号:4000.
 SQL> SELECT * FROM V$DATABASE;行号     NAME   CREATE_TIME         ARCH_MODE LAST_CKPT_TIME      STATUS$     ROLE$       MAX_SIZE             TOTAL_SIZE           DSC_NODES   OPEN_COUNT  STARTUP_COUNT        LAST_STARTUP_TIME  
 ---------- ------ ------------------- --------- ------------------- ----------- ----------- -------------------- -------------------- ----------- ----------- -------------------- -------------------
 1          DAMENG 2022-01-10 00:39:28 Y         2022-05-17 19:37:18 4           0           0                    28928                1           50          46                   2022-05-16 09:52:39已用时间: 4.002(毫秒). 执行号:4001.
 SQL> EXIT;

 --------------------------------------------------------------------------------------------------------------------------------SQL文件的内容示例:
vi  test.sql 
CONN sysdba/SYSDBA123@localhost:52380
SELECT * FROM V$INSTANCE;
 SELECT * FROM V$DATABASE;
 EXIT;sysdba/SYSDBA12345@localhost:52380

但需注意

1、在命令行执行SQL文件,只能使用“`”,并且前面需要添加转义字符“\”。

2、在sql文件内容的结尾处必须添加:exit;

 否则这个脚本执行完sql语句,会停留在sql执行,加上exit 执行完成返回命令行。

3、进入disql交互命令行下,可以使用start调用脚本,但是不是在操作系统命令行下,使用方法较为简单,这里不做介绍;

3、执行SHELL脚本访问数据库;

使用shell脚本查询库信息是比较快捷和效率的方法,编写访问数据库的脚本和普通脚本一样,都是使用#!/bin/sh开头,脚本可以批量执行查询命令和操作系统命令,并保存查询结果和执行日志。

比如脚本的名称是: dm_testshell.sh

使用方法:sh dm_testshell.sh>dm_testshell.sh.log 2>dm_testshell.err

脚本的内容如下:

cat   dm_testshell.sh  查看:
!/bin/sh
############################################
export V_dmuser="sysdba"
export V_dmpasswd="SYSDBA23"
export V_dmip="127.0.0.1"
export V_dmport="52380"
disql ${V_dmuser}/${V_dmpasswd}@${V_dmip}:${V_dmport} <<InptOver
SET LINESIZE 1000
SET PAGESIZE 1000
SET TIMING OFF
select * from v\$instance;
select * from v\$database;
SELECT * FROM V\$OPTION;
exit;
InptOver
####以下可以使用操作系统命令
date
pwd
whoami
df -h
########################

####################

总结:

在命令行查询数据库信息的方法:

1、disql命令,直接查询;

2、disql命令,配合SQL文件执行查询;

3、shell脚本,执行查询;

方式:

方法1、适合只进行一次简单查询

disql  sysdba/SYSDBA12345@localhost:52380  -e "SELECT * FROM V\$DATABASE;"

disql  sysdba/SYSDBA12345@localhost:52380<<!
 > SELECT * FROM V\$DATABASE;
 > !

方法2、利于批量输出DM数据库信息;

disql  /NOLOG  \`test.sql    

方法3、脚本利于配合操作系统命令,和DM数据库信息,综合实现复杂维护功能;

sh dm_testshell.sh >dm_testshell.sh.log

提醒:

如果要想在操作系统命令行下,执行将disql作为一个命令执行,那么就要配置PATH变量,以及LD_LIBRARY_PATH变量; 以下是dm软件安装在/dm 目录下的一个示例。配置完后,就可以像使用其他命令一样使用disql 命令了。

export DM_HOME="/dm8"
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$DM_HOME/bin"
export PATH=$PATH:$DM_HOME/bin
以上变量通常保存在 .bash_profile  文件中。

参考 : disql 命令语法说明:

显示disql版本信息和帮助信息的命令: disql -h  , 或者  disql help  

DISQL 用法:  
disql     [    [<option>]      [{<logon> | /NOLOG}]       [<start>]           ]

----------------------------------------------------------------------------------------------------------------------

<option> 为: [-L]  [-S]

  -L 只尝试登录一次
  -S 隐藏模式,隐藏<SQL>标识符

----------------------------------------------------------------------------------------------------------------------

 /NOLOG , 选项能在未登录DM服务器的情况下,启动disql

<logon> 为:
{<username> [/<password>]  [*<MPP_TYPE>]  [@<connect_identifier>]} | 
 {/[:<port>] AS <SYSDBA|SYSSSO|SYSAUDITOR|USERS|AUTO>}
  --<connect_identifier>为
{[<server>][:<port>][?{UDP|TCP|IPC|RDMA|UNIXSOCKET}][#<sslpath>@<sslpwd>]}

----------- <server>如果是IPv6的地址,需要用[]指明是IPv6地址,例如[fe80::1e6f:65ff:fed1:3724%6]
 -<server>如果是UNIXSOCKET类型,需要指明是unixsocket地址,例:/data/sdb/DAMENG/foo.sock

----------------------------------------------------------------------------------------------------------------------

<start> : `<filename>[<parameter> ...]   <direct cmd>   <direct sql>   ,运行disql脚本
 <direct sql>:-e "<SQL语句>[;<SQL语句>]"
 <direct cmd>:-c "<set 命令>"

----------------------------------------------------------------------------------------------------------------------