通常我们要在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 命令>"
----------------------------------------------------------------------------------------------------------------------