glogin.sql配置不当引起sqlplus hang的假象分析

简介: 不久前遇到的一个问题,"故障"现象如下:A主机上跑了两个单实例的数据库testa和testb,对testa实例进行例行重启时先shutdown immediate,然后再通过sqlplus '/as sysdba'连进去尝试重启时发现,sqlplus Ha...

不久前遇到的一个问题,"故障"现象如下:
A主机上跑了两个单实例的数据库testa和testb,对testa实例进行例行重启时先shutdown immediate,然后再通过sqlplus '/as sysdba'连进去尝试重启时发现,sqlplus Hang住不动了

sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.3.0 Production on Sat Feb 28 16:53:32 2015

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.    

此时使用sqlplus '/as sysdba'连接另一个实例testb是OK的,由于是测试环境于是将testb实例也shutdown immediate,准备重启主机,重启之前对于已经关闭的testb实例用sqlplus '/as sysdba'也无法连上去,现象同testa。主机重启势在必行了,但主机重启后现象依旧,两个实例都无法连接。使用"truss -dfaie -o /tmp/sched_trace.out.02271 sqlplus '/as sysdba'"命令对sqlplus '/as sysdba'的过程进行了跟踪,直奔sched_trace.out.02271文件结尾处发现了以下内容

2949918: 15664107: 0.8794:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 8
2425346:        14746339: 0.8891:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 6
2949918: 15664107: 0.8915:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 8
2949918: 15664107: 0.8960:        statx("/oracle/app/oracle/product/11.2.0/db_1/sqlplus/admin/glogin.sql", 0x0FFFFFFFFFFFDA40, 176, 010) = 0
2949918: 15664107: 0.8963:        statfs("/oracle/app/oracle/product/11.2.0/db_1/sqlplus/admin/glogin.sql", 0x0FFFFFFFFFFFD620) = 0
2949918: 15664107: 0.8979:        kopen("/oracle/app/oracle/product/11.2.0/db_1/sqlplus/admin/glogin.sql", O_RDONLY|O_LARGEFILE) = 8
2425346:        14746339: 0.9041:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 6
2949918: 15664107: 0.9065:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 11
2949918: 15664107: 0.9086:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/oraus.msb", O_RDONLY) = 11
2425346:        14746339: 906.0540:        kopen("/oracle/app/oracle/product/11.2.0/db_1/rdbms/mesg/diaus.msb", O_RDONLY) = 5
2425346:        14746339: 906.0565:        statx("/oracle/app/oracle", 0x0FFFFFFFFFFFDAF0, 176, 0) = 0

从后往前查,diaus.msb=>oraus.msb=>glogin.sql,前面两个文件的大小和权限与其他服务器上的同名文件相比较均一致,检查glogin.sql的时候发现该文件最近被修改过,其内容如下
set termout off
col newprom new_value newprom1
select user||'@'||sys_context('userenv','instance_name')||'-'||'SQL> ' newprom from dual;
set sqlprompt '&newprom1'
set termout on
set serveroutput on

当实例还未启动的时候这条sql是没有任何结果的
select user||'@'||sys_context('userenv','instance_name')||'-'||'SQL> ' newprom from dual;

导致接下来set sqlprompt '&newprom1'运行的时候变量newprom1值为空,从而会等待前台输入值给newprom1变量,这个等待的过程就会给用户造成sqlplus hang住的假象,按照一般用户的习惯发现sqlplus hang住时会频繁的敲回车,敲完回车后sqlplus还是hang那里。仔细分析一下敲回车后其实已经给newprom1变量赋值了,后续已经可以执行startup命令启动instance了,只不过此时newprom1变量值为空,没有回显我们熟悉的SQL>到屏幕上,所以让我们误以为sqlplus hang住了。以下测试验证上面的判断:

tstdb1@jq570322b:/home/tstdb1>sqlplus '/as sysdba'

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 2 10:35:36 2015

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

Connected to an idle instance.   

              
startup   
ORACLE instance started.                                 

Total System Global Area 6413680640 bytes
Fixed Size                  2233480 bytes
Variable Size            4060089208 bytes
Database Buffers         2332033024 bytes
Redo Buffers               19324928 bytes
Database mounted.
Database opened.                                              

quit      

tstdb1@jq570322b:/home/tstdb1>sqlplus '/as sysdba'   

SQL*Plus: Release 11.2.0.3.0 Production on Mon Mar 2 10:38:37 2015

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SYS@tstdb1-SQL>                                                           

解决这个问题只要在glogin.sql里加入一行:为newprom1变量定义一个初始值(红色部分)

set termout off
col newprom new_value newprom1
define newprom1="SQL> "
select user||'@'||sys_context('userenv','instance_name')||'-'||'SQL> ' newprom from dual;
set sqlprompt '&newprom1'
set termout on
set serveroutput on

有了这个初始值,在instance未启动的情况下,sqlplus连接后就会出现我们熟悉的SQL> 提示符,sqlplus就不会再hang住了。
需要注意的是还有一个作用于glogin.sql类似的文件login.sql,执行sqlplus的时候会先去执行glogin.sql,然后会在当前目录下寻找login.sql文件,如果有的话执行login.sql;如果当前目录没有那么到SQLPATH环境变量定义的路径里进一步寻找login.sql文件如果找到的话执行login.sql内容。glogin.sql和login.sql的区别在于前者是全局有效的,后者属于每个用户的个性化设置。有点像shell里的.login和.profile的关系。
这个例子其实是glogin.sql给我们开了个小小的玩笑,提醒我们glogin.sql、login.sql是进入sqlplus的两道关口,做配置的时候要不要轻视它们

 

目录
相关文章
|
5月前
|
SQL 索引
19. 一个SQL语句执行很慢, 如何分析
该内容介绍了如何分析执行慢的SQL语句。首先启用慢查询日志或使用命令获取慢查询的SQL。然后利用`EXPLAIN`命令分析,关注其中的`select_type`, `type`, 和 `extra`字段。`select_type`涉及子查询和联合查询的类型,`type`表示查询优化器使用的访问类型,性能从上到下递减,`extra`字段提供额外信息,如是否使用索引等。
40 0
|
5月前
|
SQL 数据可视化 算法
SQL Server聚类数据挖掘信用卡客户可视化分析
SQL Server聚类数据挖掘信用卡客户可视化分析
|
1月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
30 1
|
2月前
|
SQL 数据采集 数据挖掘
为什么要使用 SQL 函数?详尽分析
【8月更文挑战第31天】
22 0
|
2月前
|
SQL 数据挖掘 BI
【超实用技巧】解锁SQL聚合函数的奥秘:从基础COUNT到高级多表分析,带你轻松玩转数据统计与挖掘的全过程!
【8月更文挑战第31天】SQL聚合函数是进行数据统计分析的强大工具,可轻松计算平均值、求和及查找极值等。本文通过具体示例,展示如何利用这些函数对`sales`表进行统计分析,包括使用`COUNT()`、`SUM()`、`AVG()`、`MIN()`、`MAX()`等函数,并结合`GROUP BY`和`HAVING`子句实现更复杂的数据挖掘需求。通过这些实践,你将学会如何高效地应用SQL聚合函数解决实际问题。
42 0
|
2月前
|
网络协议 NoSQL 网络安全
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
【Azure 应用服务】由Web App“无法连接数据库”而逐步分析到解析内网地址的办法(SQL和Redis开启private endpoint,只能通过内网访问,无法从公网访问的情况下)
|
3月前
|
SQL Java 数据库连接
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
idea中配置mybatis 映射文件模版及 mybatis plus 自定义sql
60 3
|
4月前
|
SQL 人工智能 Java
mybatis-plus配置sql拦截器实现完整sql打印
_shigen_ 博主分享了如何在MyBatis-Plus中打印完整SQL,包括更新和查询操作。默认日志打印的SQL用?代替参数,但通过自定义`SqlInterceptor`可以显示详细信息。代码示例展示了拦截器如何替换?以显示实际参数,并计算执行时间。配置中添加拦截器以启用此功能。文章提到了分页查询时的限制,以及对AI在编程辅助方面的思考。
323 5
mybatis-plus配置sql拦截器实现完整sql打印
|
3月前
|
SQL 分布式计算 关系型数据库
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
47 2
|
4月前
|
SQL DataWorks 关系型数据库
DataWorks产品使用合集之如何将硬编码的配置值(例如SQL查询中的固定值)更改为调度参数
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
70 7
下一篇
无影云桌面