转shell不能执行su 后的脚本 in oracle and dameng

##感谢haoxiaoyu

https://www.cnblogs.com/haoxiaoyu/p/4302663.html

shell不能执行su 后的脚本

 
问题:在shell脚本中执行“su – 用户名”后,脚本终止执行,并且切换到su 中指定用户名的交互式界面 
现象:我在root中执行一个脚本,但是其中的一些命令或脚本必须用oracle用户来执行。,
复制代码
[root@HZ-ITF-01 cron.d]# vi /data/itf/app/oracle/sync/test.sh
 #!/bin/bash
set -x
su - oracle
sqlplus /nolog <<EOF
conn hxy/hxy
create table test1 as select * from dba_tables;
exit
EOF
复制代码

在root用户下执行sh /data/itf/app/oracle/sync/test.sh后,停止在oracle用户的交互界面不在往下执行 ,需要手动输入exit才能继续,但是在脚本中加入exit也不好使 

分析: 
a、su – 之后就直接切换环境并且等待用户的交互式访问了,不在继续执行脚本中的命令 
b、su后的bash是一个子shell,脚本里写exit没有用,这些都要等su这个进程结束后才会执行。 
解决方案: su – 用户 -c 命令 
     或者 
     sudo -u 用户 命令 参考示例: 参考资料: Shell 中切换用户
 
然后脚本修改成下面的方式
复制代码
#!/bin/bash
#set -x 
su - oracle -c sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
复制代码

 脚本顺利执行

或者改成:
复制代码
#!/bin/bash
set -x 
su - oracle <<! sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
!
复制代码

也可以顺利执行

 

shell不能执行su 后的脚本

 
问题:在shell脚本中执行“su – 用户名”后,脚本终止执行,并且切换到su 中指定用户名的交互式界面 
现象:我在root中执行一个脚本,但是其中的一些命令或脚本必须用oracle用户来执行。,
复制代码
[root@HZ-ITF-01 cron.d]# vi /data/itf/app/oracle/sync/test.sh
 #!/bin/bash
set -x
su - oracle
sqlplus /nolog <<EOF
conn hxy/hxy
create table test1 as select * from dba_tables;
exit
EOF
复制代码

在root用户下执行sh /data/itf/app/oracle/sync/test.sh后,停止在oracle用户的交互界面不在往下执行 ,需要手动输入exit才能继续,但是在脚本中加入exit也不好使 

分析: 
a、su – 之后就直接切换环境并且等待用户的交互式访问了,不在继续执行脚本中的命令 
b、su后的bash是一个子shell,脚本里写exit没有用,这些都要等su这个进程结束后才会执行。 
解决方案: su – 用户 -c 命令 
     或者 
     sudo -u 用户 命令 参考示例: 参考资料: Shell 中切换用户
 
然后脚本修改成下面的方式
复制代码
#!/bin/bash
#set -x 
su - oracle -c sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
复制代码

 脚本顺利执行

或者改成:
复制代码
#!/bin/bash
set -x 
su - oracle <<! sqlplus /nolog <<EOF conn hxy/hxy create table test1 as select * from dba_tables; exit EOF
!
复制代码

也可以顺利执行

 
 
sample 2  shell in dameng 达梦
 
气可鼓不可泄
 

达梦数据库-disql之SQL脚本使用

达梦disql调用sql语句
达梦数据库提供disql工具,我们可以通过disql工具使用命令行方式来查询SQL并将执行结果保留在指定文件中。对于达梦数据库内置的系统视图可以在达梦管理员手册的附录二

1、使用disql执行sql脚本
配置disql全局登录

vi ~/.bash_profile#编辑dmdba用户的环境变量
#添加如下内容
export DM_HOME="/home/dmdba/dmdbms"
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DM_HOME/bin
export PATH=$PATH:$DM_HOME/bin
1
2
3
4
5
编辑一个sql文件,用于记录登录信息和需要执行的sql语句

vim dmtest.sql
#添加如下内容
conn TEST/123456789@LOCALHOST:5236
select * from v$instance;
exit;
1
2
3
4
5
使用disql的相关命令就可以完成对指定sql的查询,

disql /nolog \`dmtest.sql
1


2、调用disql
使用disql调用sql脚本可以完成不输入sql的情况下对指定sql进行查询,那么否有更加便捷的方法让每次的查询结果都保存在指定的文件中呢?

先写一个shell脚本,通过脚本调用disql

vim dmtest.sh
#添加以下内容
#/bin/bash
disql /nolog \`dmtest.sql
1
2
3
4
目前disql的执行都是前台显示的,让它输入到指定文件中

vim dmtest.sh
#添加以下内容
#/bin/bash
dmdate=$(date "+%Y%m%d%H%M%S")
disql /nolog \`dmtest.sql >dmtest_${dmdate}.log
#如果需要前台显示,请增加以下内容
cat dmtst_${dmdate}.log
1
2
3
4
5
6
7
这样我们就完成后台执行sql脚本并将执行结果写到指定文件中

3、更加优雅的使用方式
选择更加优雅的方式调用disql,并增加具体的中文解释。将查询sql的结果赋值给变量,这样就可以增加个性化的定制

#! /bin/bash
#设置dmdbms/bin全局路径
export PATH=$PATH:/home/dmdba/dmdbms/bin
export LD_LIBRARY_PATH=/home/dmdba/dmdbms/bin:$LD_LIBRARY_PATH

#设置用户名和密码、端口
DB_USER=SYSDBA
DB_PASS=SYSDBA
DB_PORT=5248
dt=`date +"%Y_%m_%d_%H_%M"`
v_date=$(date)
echo 执行时间:$v_date >dmtest_${dmdate}.log

db_instance_name=$(disql -s ${DB_USER}/\"${DB_PASS}\"@LOCALHOST:${DB_PORT} <<"EOF"
SET ECHO OFF;
SET FEED OFF;
SET HEA OFF;
SET LINESHOW OFF;
SET NEWP 0;
SET PAGES 0;
SET TIMING OFF;
select INSTANCE_NAME from v$instance;
exit
EOF
)
echo 数据库实例名:$db_instance_name >dmtest_${dmdate}.log
cat dmtest_${dmdate}.log
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
运行结果,获取数据的实例名

 

disql的环境变量详细说明见达梦disql手册。

更多资讯请上达梦技术社区了解: https://eco.dameng.com
————————————————
版权声明:本文为CSDN博主「气可鼓不可泄」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_33965675/article/details/118294209

 

 

##达梦如何开启AWR 报告

达梦数据库的AWR功能默认是关闭的,如果要使用AWR功能,需要相关配置来开启该功能

1 、检查数据库DBMS_WORKLOAD_REPOSITORY系统包的启用状态(0:未启用;1:已启用)以及awr快照信息和表空间信息
select sf_check_awr_sys;
select * from sys.wrm$_snapshot;
select tablespace_name from dba_tablespaces;

2 、创建数据库DBMS_WORKLOAD_REPOSITORY系统包,如果已创建,则可省略。
SP_INIT_AWR_SYS(1);
select sf_check_awr_sys;
select tablespace_name from dba_tablespaces;
select * from sys.wrm$_snapshot;

注意:SP_INIT_AWR_SYS(1)为创建DBMS_WORKLOAD_REPOSITORY,SP_INIT_AWR_SYS(0)则为关闭。达梦数据库在创建DBMS_WORKLOAD_REPOSITORY包时,默认会创建一个名为SYSAUX的表空间,对应的数据文件为SYSAWR.DBF,用来存放该包生成的快照数据。同样,该包被删除时,SYSAUX表空间及数据文件也响应的会删除。达梦MPP环境不支持该包。

3 、开启AWR功能
DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL(10);

(只能用10,不能用30分钟)

注意:达梦数据库开启AWR功能,调用DBMS_WORKLOAD_REPOSITORY.AWR_SET_INTERVAL过程设置快照间隔时间即可,快照间隔时间的有效范围为【10,525600】,默认为60,单位为分钟。关闭快照间隔值设定0即可。

4 、创建awr报告(可以手动创建,也可以等待,数据库会按照间隔时间自动创建)
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();
SELECT * FROM SYS.WRM$_SNAPSHOT;

可以看到,快照已经生成了。

5 、生成awr报告,快照范围1-2,格式html

SELECT * FROM TABLE (DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_HTML(1,2));
或者

SYS.AWR_REPORT_HTML(1,2,‘/home/dmdba/’,‘AWR1_2.HTML’);

如果需要这个报错 [-6108]:String truncated,html 改成text

SET ECHO OFF;
SET FEED OFF;
SET HEA OFF;
SET LINESHOW OFF;
SET NEWP 0;
SET PAGES 0;
SET TIMING OFF;

Spool awr.txt

 

SELECT * FROM TABLE (DBMS_WORKLOAD_REPOSITORY.AWR_REPORT_TEXT(99,100));

Spool OFF

 

或者

SET ECHO OFF;
SET FEED OFF;
SET HEA OFF;
SET LINESHOW OFF;
SET NEWP 0;
SET PAGES 0;
SET TIMING OFF;

Spool awr.txt

 

SYS.AWR_REPORT_TEXT(1,2,‘/home/dmdba/’,‘AWR1_2.TEXT’);

Spool OFF

 

注意:达梦数据库的awr报告需要复制到文本文件中,保存成 html 格式即可查看。

6 、打开生成的awr报告
/home/dmdba/AWR1_2.HTML文件下载到本地,用浏览器打开

社区地址:https://eco.dameng.com

 

1是性能影响;

2是稳定性上的,最近有项目上因为awr的影响导致实例夯住的情况;

3是awr能查看的信息也很有限,作用不大;所有不建议开启

 

posted @ 2020-06-17 18:04  feiyun8616  阅读(927)  评论(0编辑  收藏  举报