在项目部署实施阶段,需要给现场实施人员准备数据库执行脚本,但需要进行隔离操作,避免误操作修改了sql,出现一些不可控的问题。达梦数据库在网上的资料真是少之又少,但是发现大多数达梦语法描述为同oracle,嗯??……

使用shell脚本执行sql

1. 先找到达梦数据库安装位置吧

[root@localhost ~]# ss -nlp |grep 5236
tcp    LISTEN     0      128    [::]:5236               [::]:*                   users:(("dmserver",pid=103380,fd=4))
[root@localhost ~]# ps -ef|grep dmserver
root      85093  66993  0 17:56 pts/6    00:00:00 grep --color=auto dmserver
dmdba    103380      1  8 13:36 ?        00:23:18 /home/dmdba/dmdbms/bin/dmserver /home/dmdba/dmdbms/data/DAMENG_JW/dm.ini -noconsole

2. 直接在linux上执行shell命令执行sql脚本

2.1 # disql username/password:port

使用这个命令可以进入sql控制台

[root@localhost sql]# /home/dmdba/dmdbms/bin/disql cpuser/cpuser123:5236

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

进入SQL>后:

  1. 直接输入sql语句,使用英文分号结尾,回车执行。
  2. 使用“`sql文件路径”,可以执行sql脚本文件,注意前面有一个小撇(esc和tab中间的键)
  3. 使用“start sql文件路径”,可以执行sql脚本文件。
2.2 # disql username/password:port `sql文件位置

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

[root@localhost sql]# /home/dmdba/dmdbms/bin/disql cpuser/cpuser123:5236 \`sql/test.sql
[root@localhost sql]# 

但需注意

  1. 这个脚本执行完sql会停留在sql执行行,如需执行完返回到shell命令行,则需要在sql文件结尾添加:exit; 。
  2. 这个shell语句不能用start执行sql文件,只能使用“`”,并且前面需要添加转义字符“\”。
2.3 达梦sql脚本注意事项
目前发现-创建schema语句以及执行过程结尾,都需要添加“/”结束

例如执行以下语句,回车执行,一直在输出数字,直到输入“/”,再回车执行,才执行成功。

[root@localhost sql]# /home/dmdba/dmdbms/bin/disql cpuser/cpuser123:5236

服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 6.121(ms)
disql V8
SQL> create schema test;
2   
3   /
操作已执行
已用时间: 26.698(毫秒). 执行号:700604.
SQL> 

sql脚本示例:

-- 创建schema
CREATE SCHEMA DB_ZFBA_MOBILE;
/
-- 执行过程
begin
 if exists(select 1 from DBA_TAB_COLUMNS where OWNER='DB_ZFBA_MOBILE' AND TABLE_NAME='T_ZJTQD') then
  EXECUTE immediate 'drop table DB_ZFBA_MOBILE.T_ZJTQD'; 
 end if; 
end;
/
create table DB_ZFBA_MOBILE.T_ZJTQD
(
    "C_BH"                char(32)                             NOT NULL,    -- 主键
    "C_BH_AJ"             varchar2(32)                         NULL,        -- 案件编号
 	……
    "DT_ZHXGSJ"           datetime                             NULL,        -- 最后修改时间
constraint PK_T_ZJTQD primary key( C_BH )
);
sql文件结尾添加exit;,保证多个sql文件执行不会中断

3. 编写shell脚本

注意:shell脚本一定在linux中编写,windows编写的有些语句执行不成功
例如: a=a b=b c=$a$b echo $c 在windows下编写,linux中执行完会输出b

#!/bin/bash


# 请先配置数据库连接信息,再执行此脚本
DM_PATH=/home/dmdba/dmdbms            #达梦数据库的安装位置
USERNAME=cpuser                       #达梦数据库连接用户名
PASSWORD=cpuser123                    #达梦数据库连接密码
PORT=5236                             #达梦数据库连接端口号


# 下面的信息请不要随意修改
CONNECT_INFO=$USERNAME/$PASSWORD:$PORT
echo "连接信息:"$CONNECT_INFO
# STEP 1
echo "【开始执行】---- sql/02_创建数据库对象/00.CS_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/02_创建数据库对象/00.CS_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/02_创建数据库对象/00.CS_GSYS.sql"

# STEP 2
echo "【开始执行】---- sql/02_创建数据库对象/01.CT_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/02_创建数据库对象/01.CT_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/02_创建数据库对象/01.CT_GSYS.sql"

# STEP 3
echo "【开始执行】---- sql/02_创建数据库对象/02.CC_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/02_创建数据库对象/02.CC_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/02_创建数据库对象/02.CC_GSYS.sql"

# STEP 4
echo "【开始执行】---- sql/02_创建数据库对象/03.CI_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/02_创建数据库对象/03.CI_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/02_创建数据库对象/03.CI_GSYS.sql"

# STEP 5
echo "【开始执行】---- sql/03_初始化数据/02.I_T_Aty_CodeType_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/03_初始化数据/02.I_T_Aty_CodeType_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/03_初始化数据/02.I_T_Aty_CodeType_GSYS.sql"

# STEP 6
echo "【开始执行】---- sql/03_初始化数据/02.I_T_Aty_Code_GSYS.sql"
$DM_PATH/bin/disql $CONNECT_INFO \`sql/03_初始化数据/02.I_T_Aty_Code_GSYS.sql >> DB_DM.log
echo "【执行完成】---- sql/03_初始化数据/02.I_T_Aty_Code_GSYS.sql"

# Complete
echo "【SQL全部执行完成】---- 日志请查看DB_DM.log"

执行完成后,通过shell控制台和DB_DM.log日志可以分析sql脚本是否执行成功。