在重構過程當中,生產環境出現了訪問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,那麼也會遇到一些問題。