Linux 鏈接 Oracle 緩慢問題

在重構過程當中,生產環境出現了訪問Oracle緩慢的狀況,通過排查,最終發現並解決了問題。sql

問題解決
將Liunx服務器的Hostname修改成localhost。數據庫

擴展閱讀
以下所示,服務器/etc/hosts 與/etc/sysconfig/network的原始配置信息以下:bash

[root@test ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1            localhost6.localdomain6 localhost6
127.0.0.1       localhost.localdomain localhost
192.168.27.134  test test
 
[root@test ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=test
GATEWAY=192.168.27.1
[root@test ~]#

 

首先假設有個需求,須要修改hostname,使之變成test.edution.com(加上域名部分), 那麼此時是否有問題呢?咱們先修改/etc/sysconfig/network下的HOSTNAME,而後重啓服務器:服務器

[root@test ~]# more  /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=test.eduction.com
GATEWAY=192.168.27.1
  
[root@test ~]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1            localhost6.localdomain6 localhost6
127.0.0.1       localhost.localdomain localhost
192.168.27.134  test test

而後咱們重啓數據庫實例後,並無任何問題,可是重啓監聽的時候遇到下面錯誤:oracle

[oracle@test ~]$ sqlplus / as sysdba
  
SQL*Plus: Release 10.2.0.5.0 - Production on Sat Jun 18 16:42:21 2016
  
Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.
  
Connected to an idle instance.
  
SQL> startup
ORACLE instance started.
  
Total System Global Area 1509949440 bytes
Fixed Size                  2096472 bytes
Variable Size            1392509608 bytes
Database Buffers           67108864 bytes
Redo Buffers               48234496 bytes
Database mounted.
Database opened.
SQL> exit
Disconnected from Oracle Database 10g Release 10.2.0.5.0 - 64bit Production
[oracle@test ~]$ lsnrctl start
  
LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 18-JUN-2016 16:42:47
  
Copyright (c) 1991, 2010, Oracle.  All rights reserved.
  
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
  
TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test.eduction.com)(PORT=1521)))
  
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNS-12535: TNS:operation timed out
 TNS-12560: TNS:protocol adapter error
  TNS-00505: Operation timed out
   Linux Error: 110: Connection timed out
[oracle@test ~]$

出現這個問題時,必須修改/etc/hosts下主機名的部分,使之與/etc/sysconfig/network下的HOSTNAME一致,上面錯誤就能解決:app

[root@test ~]# more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=test.eduction.com
GATEWAY=192.168.27.1
[root@test ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1 localhost6.localdomain6 localhost6
127.0.0.1 localhost.localdomain localhost
192.168.27.134 test.eduction.com test 
[root@test ~]#

因爲這裏測試,我修改了域名,若是服務器真實域名部分跟/etc/resolv.conf一致,那麼數據庫實例啓動過程當中,監控告警日誌,就會發現告警日誌裏面會出現大量ORA-07445 & ORA-00108錯誤。dom

修改/etc/sysconfig/network下的hostname並使之生效,以下所示:async

[oracle@kerry ~]$ more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1            localhost6.localdomain6 localhost6
127.0.0.1       localhost.localdomain localhost
192.168.27.134  test.eduction.com  test
[oracle@kerry ~]$ more /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=kerry.eduction.com
GATEWAY=192.168.27.1

數據庫實例啓動並無任何問題,可是監聽啓動出現上面同樣的錯誤。 若是域名使用真實的域名,則會遇到另一種狀況,告警日誌裏面也會出現下面錯誤:tcp

Errors in file /u01/app/oracle/admin/SCM2/bdump/scm2_ora_4494.trc:
 
ORA-07445: exception encountered: core dump [kslgetl()+120] [SIGSEGV] [Address not mapped to object] [0x000000210] [] []
ORA-00108: failed to set up dispatcher to accept connection asynchronously

關於這個,能夠參考官方文檔ORA-07445: [kslgetl()+80] Followed by ORA-108: failed to set up dispatcher to accept connection asynchronously (文檔 ID 1298804.1)。
若是屏蔽/etc/hosts下的localhost部分,以下所示,此時有可能會影響監聽:測試

[root@kerry ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1            localhost6.localdomain6 localhost6
#127.0.0.1       localhost.localdomain localhost
192.168.27.134  kerry.eduction.com  kerry
[root@kerry ~]#

[oracle@kerry ~]$ lsnrctl start
  
LSNRCTL for Linux: Version 10.2.0.5.0 - Production on 18-JUN-2016 17:45:37
  
Copyright (c) 1991, 2010, Oracle.  All rights reserved.
  
Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...
  
TNSLSNR for Linux: Version 10.2.0.5.0 - Production
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=kerry.eduction.com)(PORT=1521)))
  
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
TNS-12547: TNS:lost contact
TNS-12560: TNS:protocol adapter error
TNS-00517: Lost contact
Linux Error: 104: Connection reset by peer

這是由於我沒有在$ORACLE_HOME/network/admin下配置listener.ora,因此在註釋或刪除了/etc/hosts下localhost部分後就會出現這個錯誤,由於在沒有listener.ora下的狀況下,都會使用默認值(以下官方文檔描述),監聽進程會使用本機配置127.0.0.1註冊監聽服務,因此會出現上面錯誤信息,官方文檔關於這方面的描述以下所示:

Oracle Net Listener Configuration Overview
Note:
Oracle Database 10g and later databases require a version 10 or later listener. Earlier versions of the listener are not supported for use with Oracle Database 10g and later databases. However, you can use a version 10 listener with previous versions of Oracle Database.
A listener is configured with one or more listening protocol addresses, information about supported services, and parameters that control its runtime behavior. The listener configuration is stored in a configuration file named listener.ora.
Because all of the configuration parameters have default values, it is possible to start and use a listener with no configuration. This default listener has a name of LISTENER, supports no services on startup, and listens on the following TCP/IP protocol address:
(ADDRESS=(PROTOCOL=tcp)(HOST=host_name)(PORT=1521))
Supported services, that is, the services to which the listener forwards client requests, can be configured in the listener.ora file or this information can be dynamically registered with the listener. This dynamic registration feature is called service registration. The registration is performed by the PMON process—an instance background process—of each database instance that has the necessary configuration in the database initialization parameter file. Dynamic service registration does not require any configuration in the listener.ora file.

解決方案兩種:
1)在$ORACLE_HOME/network/admin/下配置listener.ora文件。則屏蔽或刪除/etc/hosts下127.0.0.1後,監聽不會有任何問題。
2)在配置文件/etc/hosts下增長localhost(紅色部分所示)也能解決這個問題。

[root@kerry ~]# more /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
#::1 localhost6.localdomain6 localhost6
#127.0.0.1 localhost.localdomain localhost
192.168.27.134 kerry.eduction.com kerry localhost
[root@kerry ~]#

具體能夠參考官方文檔Starting TNS Listener or LSNRCTL Start Yields TNS-12541, Linux Error: 111: Connection Refused (文檔 ID 343295.1)。

另外,咱們這裏也忽略了lisnter.ora裏面的配置,若是該配置文件使用的是hostname而不是IP,那麼也會遇到一些問題。

相關文章
相關標籤/搜索