cls_oracle_logs.sh脚本遭遇TNS-12508错误浅析

这篇具有很好参考价值的文章主要介绍了cls_oracle_logs.sh脚本遭遇TNS-12508错误浅析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

cls_oracle_logs.sh脚本的输出日志中有TNS-12508错误,具体如下所示

........................................................................
LSNRCTL> Current Listener is gsp
LSNRCTL> Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=gsp)))
TNS-12508: TNS:listener could not resolve the COMMAND given
LSNRCTL> LSNR_TRC_DIR: /opt/oracle19c/product/19.3.0/db_1/network/trace/
........................................................................

调试跟踪发现,脚本在切割监听日志时,执行命令set log_status off/set log_status on时报TNS-12508错误,部分脚本如下所示:

# Function used to cut log files.
f_cutlog(){
 
  # Set name of log file.
  LOG_FILE=$1
  CUT_FILE=${LOG_FILE}.${TODAY}
  FILESIZE=`ls -l $LOG_FILE | awk '{print $5}'`
 
  # Cut the log file if it has not been cut today.
  if [ -f $CUT_FILE ]; then
    echo "Log Already Cut Today: $CUT_FILE"
  elif [ ! -f $LOG_FILE ]; then
    echo "Log File Does Not Exist: $LOG_FILE"
  elif [ $FILESIZE -eq 0 ]; then
    echo "Log File Has Zero Size: $LOG_FILE"
  else
    # Cut file.
    echo "Cutting Log File: $LOG_FILE"
    $MV $LOG_FILE $CUT_FILE
    $TOUCH $LOG_FILE
  fi
}

  .....................................
  # See if the listener is logging.
  if [ -z "$LSNRLOG" ]; then
    echo "Listener Logging is OFF. Not rotating the listener log."
  # See if the listener log exists.
  elif  [ ! -r "$LSNRLOG" ]; then
    echo "Listener Log Does Not Exist: $LSNRLOG"
  # See if the listener log has been cut today.
  elif [ -f $LSNRLOG.$TODAY ]; then
    echo "Listener Log Already Cut Today: $LSNRLOG.$TODAY"
  # Cut the listener log if the previous two conditions were not met.
  else
  
    # Disable logging.
    $LSNRCTL <<EOF
    set current_listener $LSNRNAME
    set log_status off
EOF
 
    # Cut the listener log file.
    f_cutlog $LSNRLOG

    # Enable logging.
    $LSNRCTL <<EOF
    set current_listener $LSNRNAME
    set log_status on
EOF

    # Delete old listener logs.
    f_deletelog $LSNRLOG $NDAYS
 
  fi
  ...................................

如下测试所示

LSNRCTL> set current_listener  gsp
Current Listener is gsp
LSNRCTL> set log_status off
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=REGISTER_gsp)))
TNS-12508: TNS:listener could not resolve the COMMAND given

出现这个现象,是因为我们在监听参数文件listener.ora中设置了参数ADMIN_RESTRICTIONS_<listener_name>

ADMIN_RESTRICTIONS_GSP = ON

ADMIN_RESTRICTIONS_<listener_name>参数是一个重要的安全选项,在listener.ora文件中设置ADMIN_RESTRICTIONS_<listener_name>为ON时, 此后所有在运行时对监听器的修改都将会被阻止,所有对监听器的修改都必须通过手工修改listener.ora文件才能顺利完成。

Setting ADMIN_RESTRICTIONS_<listener_name> = ON disables the "runtime" modification of parameters in the listener.ora file.
In other words, the listener refuses to accept SET commands that alter its parameters and states that it cannot "resolve the COMMAND given."

脚本cls_oracle_logs.sh中,暂停监听器写入日志,完成监听日志的切换后,然后启用监听器写入日志。但是由于参数ADMIN_RESTRICTIONS_<listener_name>为ON的话 这里就会出现异常,那么我们修改脚本的逻辑,如果发现参数ADMIN_RESTRICTIONS_<listener_name>启用为ON的情况下,就将监听日志的内容拷贝到另外一个文件, 然后将当前的监听日志清空,具体代码如下所示:文章来源地址https://www.toymoban.com/news/detail-856677.html

# Function used to cut log files.
f_cutlog(){
 
  # Set name of log file.
  LOG_FILE=$1
  PAR_ADMIN_RESTRICTIONS=$2
  CUT_FILE=${LOG_FILE}.${TODAY}
  FILESIZE=`ls -l $LOG_FILE | awk '{print $5}'`
 
  # Cut the log file if it has not been cut today.
  if [ -f $CUT_FILE ]; then
    echo "Log Already Cut Today: $CUT_FILE"
  elif [ ! -f $LOG_FILE ]; then
    echo "Log File Does Not Exist: $LOG_FILE"
  elif [ $FILESIZE -eq 0 ]; then
    echo "Log File Has Zero Size: $LOG_FILE"
  else
    # Cut file.
    if [ [$PAR_ADMIN_RESTRICTIONS == 'ON' ]] || [[ $PAR_ADMIN_RESTRICTIONS == 'on' ]];then
        # Cut file.
        echo "Cutting Log File: $LOG_FILE"
        cat $LOG_FILE > $CUT_FILE
        cat /dev/null > $LOG_FILE
    else
        echo "Cutting Log File: $LOG_FILE"
        $MV $LOG_FILE $CUT_FILE
        $TOUCH $LOG_FILE
    fi
  fi
}


  ......................................................
  # See if the listener is logging.
  if [ -z "$LSNRLOG" ]; then
    echo "Listener Logging is OFF. Not rotating the listener log."
  # See if the listener log exists.
  elif  [ ! -r "$LSNRLOG" ]; then
    echo "Listener Log Does Not Exist: $LSNRLOG"
  # See if the listener log has been cut today.
  elif [ -f $LSNRLOG.$TODAY ]; then
    echo "Listener Log Already Cut Today: $LSNRLOG.$TODAY"
  # Cut the listener log if the previous two conditions were not met.
  else
    # 加上head -1 主要是防止出现两个名字很接近的监听,例如下面配置,就会得到两个值
    # ADMIN_RESTRICTIONS_gspprod = ON
    # ADMIN_RESTRICTIONS_gspprodro = ON
    LSN_ADMIN_RESTRICTIONS=`cat $LSNPARAM | grep -i "ADMIN_RESTRICTIONS_$LSNRNAME" | awk '{print $3}' |head -1`
  
    if [[ $LSN_ADMIN_RESTRICTIONS == "ON" ]] || [[ $LSN_ADMIN_RESTRICTIONS == "on" ]];then
      f_cutlog $LSNRLOG  $LSN_ADMIN_RESTRICTIONS
    else
      # Disable logging.
      $LSNRCTL <<EOF
    set current_listener $LSNRNAME
    set log_status off
EOF

      # Cut the listener log file.
      f_cutlog $LSNRLOG $LSN_ADMIN_RESTRICTIONS

      # Enable logging.
      $LSNRCTL <<EOF
    set current_listener $LSNRNAME
    set log_status on
EOF

   fi

    # Delete old listener logs.
    f_deletelog $LSNRLOG $NDAYS
 
  fi
   ......................................................

到了这里,关于cls_oracle_logs.sh脚本遭遇TNS-12508错误浅析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Navicate远程连接Centos-Oracle19c:ORA-12541: TNS: no listener 无监听错误 - tcping 1521端口关闭

    这个问题无比奇怪,因为半个月前安装oracle的时候,当场就能使用navicate连接远程的数据库。但是昨天晚上突然就连不上了。一直提示说没有监听,但是我在Centos上可以启动监听,并且连接sqlpus,查看用户修改密码都没有问题。 我在虚拟机本机 tcping 127.0.0.1 1521 ,端口是open的

    2024年02月03日
    浏览(33)
  • Java - sh 脚本启动 jar 包等服务 - sh 脚本模板 - 适用于任何类似的服务启动

    该模板,每次运行一次都会 kill 掉原来的服务,然后重新启动 jar 包服务 1. Linux重启Java进程的.sh脚本详解

    2024年02月15日
    浏览(36)
  • Windows 下 bat 脚本调用 Git bash 环境 sh 脚本

    D:InstallGit start.sh 脚本 双击 start.bat 我们下期见,拜拜!

    2024年04月25日
    浏览(35)
  • sh 脚本循环语句和正则表达式

    目录 1、循环语句 1、for 2、while 3、until 2、正则表达式 1、元字符 2、表示次数 3、位置锚定 4、分组 5、扩展正则表达式 循环含义 将某代码段重复运行多次,通常有进入循环的条件和退出循环的条件 重复运行次数 循环次数事先已知 循环次数事先未知 for 为 已知循环数 相对于

    2024年02月12日
    浏览(30)
  • 使用java执行bat、sh脚本文件

    在工作中,由于需求,需要完成让java去调用.bat文件和.sh文件的操作,接下来开始编码 此处用到了糊涂工具类 maven如下 由此代码来执行bat或sh脚本文件(PS:糊涂工具包用不用无所谓,只是用来判断是否为windows系统的)

    2024年02月12日
    浏览(37)
  • Linux开机自启.sh脚本(简单粗暴)

    1、创建脚本 (1)#切换到你将要存脚本的目录 (2)编写脚本autorun.sh 以下为脚本内容: (该执行脚本的意思是在/home目录下创建一个input.txt文件夹,并写入当前日期和hostname)  2、将该脚本添加到启动文件中 执行以下命令: 在最后一行添加你写的脚本(从根目录开始写)

    2024年02月12日
    浏览(37)
  • 【Git】Windows如何运行.sh脚本文件

    在Windows系统中运行.sh脚本需要借助第三方工具,比如Git Bash、Cygwin或WSL(Windows Subsystem for Linux)等。 以下是使用Git Bash运行.sh脚本的步骤: 安装Git Bash:从Git官方网站(https://git-scm.com/downloads)下载并安装Git。 打开Git Bash终端。 进入.sh脚本所在的目录,可以使用 cd 命令。 运

    2024年02月12日
    浏览(29)
  • nginx配置sh脚本远程执行一键安装

    本地多机重复操作某些shell指令,分步执行,很耗费时间, 需要远程一键部署,傻瓜化运维,更为通用安装。 即参考docker通用安装 总体思路: 1、容器化nginx部署; 2、准备好要访问的目录,这里是一个文件夹,映射到nginx里面; 3、修改nginx配置,默认映射到2中的目录; 4、

    2024年02月01日
    浏览(32)
  • Windows系统下如何运行.sh脚本文件

    前言: .sh文件是一种命令脚本文件,在Windows系统下可以通过命令行工具打开运行。通常可以使用Git工具来打开运行.sh脚本文件。不过很多第一次使用Git的人,可能对Git工具不熟悉。.sh文件在命令行运行时是有固定写法的,下面介绍详细步骤。 1.下载并安装Git 首先,建议先挂

    2024年02月11日
    浏览(30)
  • linux中编写.sh脚本并赋权限问题

    以项目启动、重启、终止脚本为例: 步骤: 首先 vi start.sh 、 vi restart.sh 、 vi stop.sh 或者使用 vim 编辑器; 编辑内容: 启动: vi start.sh 重启: vi restart.sh 关闭: vi stop.sh 保存并退出; chmod +x start.sh restart.sh stop.sh 赋予可执行权限; 输入 ./start.sh 、 ./restart.sh 、 ./stop.sh 执行脚

    2024年02月04日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包