一、Oracle网络组件概述
1.1 Oracle网络组件组成
Oracle网络配置主要涉及三个组件:
- Oracle Listener(监听器):负责接收客户端连接请求
- TNS(Transparent Network Substrate):透明网络层
- Oracle Net Manager:网络管理工具
# 查看监听器状态
lsnrctl status
# 查看Oracle进程
ps -ef | grep ora_
1.2 网络连接类型
Oracle支持多种连接类型:
- Dedicated Server(专用服务器):每个客户端独占一个服务器进程
- Shared Server(共享服务器):多个客户端共享服务器进程池
- Oracle Connection Manager:连接管理器
二、Oracle Listener配置
2.1 Listener简介
Oracle Listener是Oracle网络通信的核心组件,负责监听客户端连接请求。
# 1. 查看监听器配置位置
echo $ORACLE_HOME/network/admin
# 2. 查看listener.ora文件
cat $ORACLE_HOME/network/admin/listener.ora
# 3. 查看监听器日志
tail -f $ORACLE_HOME/network/log/listener.log
2.2 配置Listener
# 1. 编辑listener.ora
nano $ORACLE_HOME/network/admin/listener.ora
# 添加以下内容:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCL)
)
)
2.3 启动和停止Listener
# 1. 启动监听器
lsnrctl start
# 2. 停止监听器
lsnrctl stop
# 3. 重启监听器
lsnrctl reload
# 4. 查看监听器状态
lsnrctl status
# 5. 测试连接
tnsping ORCL
三、TNS配置
3.1 TNS简介
TNS(Transparent Network Substrate)是Oracle的网络层协议。
# 查看TNS配置
cat $ORACLE_HOME/network/admin/tnsnames.ora
3.2 配置TNS
# 1. 编辑tnsnames.ora
nano $ORACLE_HOME/network/admin/tnsnames.ora
# 添加以下内容(根据实际情况修改):
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
PDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = pdb1)
)
)
3.3 测试TNS连接
# 1. 使用tnsping测试
tnsping ORCL
# 2. 使用SQLPlus连接
sqlplus system/password@ORCL
# 3. 使用EZCONNECT
sqlplus system/password@//192.168.1.100:1521/orcl
四、连接字符串配置
4.1 基本连接字符串
# 1. 基本格式
username/password@//host:port/service_name
# 2. 示例
sqlplus system/password@//localhost:1521/orcl
sqlplus system/password@//192.168.1.100:1521/orcl
4.2 JDBC连接字符串
// JDBC Thin驱动
String url = "jdbc:oracle:thin:@//192.168.1.100:1521/orcl";
// PDB连接
String url = "jdbc:oracle:thin:@//192.168.1.100:1521/pdb1";
// TCPS加密连接
String url = "jdbc:oracle:thin:@//192.168.1.100:1521/orcl";
Properties props = new Properties();
props.setProperty("oracle.net.ssl_server_dn_match", "true");
4.3 Python连接字符串
# 使用cx_Oracle
import cx_Oracle
# 基本连接
conn = cx_Oracle.connect("system", "password", "192.168.1.100:1521/orcl")
# 使用TNS别名
conn = cx_Oracle.connect("system", "password", "ORCL")
五、网络安全配置
5.1 限制监听器访问
# 1. 编辑sqlnet.ora
nano $ORACLE_HOME/network/admin/sqlnet.ora
# 添加以下内容:
# 允许特定IP
tcp.validnode_checking = yes
tcp.invited_nodes = (192.168.1.10, 192.168.1.20)
# 拒绝特定IP
tcp.excluded_nodes = (192.168.1.100)
5.2 使用SSL/TLS加密
# 1. 配置SSL
# 编辑sqlnet.ora
nano $ORACLE_HOME/network/admin/sqlnet.ora
# 添加:
SQLNET.AUTHENTICATION_SERVICES = (TCPS)
SQLNET.ENCRYPTION_CLIENT = REQUESTED
SQLNET.ENCRYPTION_SERVER = REQUIRED
# 2. 配置监听器SSL
# 编辑listener.ora
nano $ORACLE_HOME/network/admin/listener.ora
# 添加:
SECURE_REGISTER_LISTENER = (TCP)
5.3 防火墙配置
# 1. 开放Oracle端口
firewall-cmd --permanent --add-port=1521/tcp
firewall-cmd --reload
# 2. 限制特定IP访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="1521" protocol="tcp" accept'
firewall-cmd --reload
# 3. 查看规则
firewall-cmd --list-all
5.4 使用Oracle Wall
# 1. 创建Wallet
mkstore -wrl $ORACLE_HOME/wallet -create
# 2. 添加凭证
mkstore -wrl $ORACLE_HOME/wallet -createCredential ORCL system password
# 3. 配置sqlnet.ora
echo "WALLET_LOCATION=(SOURCE=(METHOD=FILE)(METHOD_DATA=(DIRECTORY=$ORACLE_HOME/wallet)))" >> $ORACLE_HOME/network/admin/sqlnet.ora
echo "SQLNET.WALLET_OVERRIDE=TRUE" >> $ORACLE_HOME/network/admin/sqlnet.ora
# 4. 使用Wallet连接(无需密码)
sqlplus /@ORCL
六、连接问题排查
6.1 ORA-12154错误
# 错误:TNS:无法解析指定的连接标识符
# 解决方案:
# 1. 检查tnsnames.ora
cat $ORACLE_HOME/network/admin/tnsnames.ora
# 2. 设置TNS_ADMIN
export TNS_ADMIN=$ORACLE_HOME/network/admin
# 3. 测试TNS解析
tnsping ORCL
# 4. 使用EZCONNECT代替
sqlplus system/password@//192.168.1.100:1521/orcl
6.2 ORA-12541错误
# 错误:TNS:无监听程序
# 解决方案:
# 1. 检查监听器状态
lsnrctl status
# 2. 启动监听器
lsnrctl start
# 3. 检查端口
netstat -tulnp | grep 1521
# 4. 检查防火墙
firewall-cmd --list-all
6.3 ORA-12514错误
# 错误:TNS:监听程序当前无法识别连接描述符中请求的服务
# 解决方案:
# 1. 检查SERVICE_NAME
lsnrctl services
# 2. 在listener.ora中添加服务名
nano $ORACLE_HOME/network/admin/listener.ora
# 添加:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCL)
)
)
# 3. 重启监听器
lsnrctl reload
6.4 ORA-12505错误
# 错误:TNS:监听程序无法识别连接描述符中给出的SID
# 解决方案:
# 1. 检查SID
lsnrctl services
# 2. 确认数据库实例名
select instance_name from v$instance;
# 3. 在listener.ora中添加正确的SID
七、性能优化
7.1 连接池配置
# 1. 配置Shared Server
# 编辑init.ora参数
shared_servers = 5
max_shared_servers = 20
dispatchers = "(PROTOCOL=TCP)(LISTENER=1521)(POOL=ON)(TICKETS=20)"
# 2. 重启数据库
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
STARTUP;
7.2 连接超时配置
# 1. 配置SQLNET.EXPIRE_TIME
# 在sqlnet.ora中添加
SQLNET.EXPIRE_TIME = 10
# 2. 配置INBOUND_CONNECT_TIMEOUT
INBOUND_CONNECT_TIMEOUT = 60
# 3. 配置OUTBOUND_CONNECT_TIMEOUT
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 120
7.3 优化网络参数
# 在sqlnet.ora中优化:
# 禁用DNS解析
SQLNET.INBOUND_CONNECT_TIMEOUT = 60
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 120
# 启用连接验证
SQLNET.RECV_TIMEOUT = 30
SQLNET.SEND_TIMEOUT = 30
八、远程连接配置
8.1 配置静态监听
# 1. 编辑listener.ora添加静态监听
nano $ORACLE_HOME/network/admin/listener.ora
# 添加:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCL)
),
(SID_DESC =
(GLOBAL_DBNAME = ORCL_DG)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(SID_NAME = ORCL)
)
)
# 2. 重启监听器
lsnrctl reload
8.2 配置多个监听器
# 1. 创建第二个监听器
nano $ORACLE_HOME/network/admin/listener2.ora
# 添加:
LISTENER2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1522))
)
# 2. 启动第二个监听器
lsnrctl start listener2
8.3 配置VIP和SCAN IP
# 1. 配置VIP(在Clusterware中)
# 使用srvctl添加VIP
srvctl add vip -node racnode1 -ip 192.168.1.201 -netmask 255.255.255.0
# 2. 配置SCAN IP
srvctl add scan -scanname rac-scan -ip 192.168.1.200
九、监控和日志
9.1 监听器日志
# 1. 查看监听器日志
tail -f $ORACLE_HOME/network/log/listener.log
# 2. 启用监听器跟踪
lsnrctl set trace on
lsnrctl set trace_level admin
# 3. 关闭跟踪
lsnrctl set trace off
9.2 连接日志
# 1. 启用SQLNET日志
# 在sqlnet.ora中添加
LOG_DIRECTORY_CLIENT = /var/log/oracle
LOG_FILE_CLIENT = sqlnet.log
# 2. 查看日志
tail -f /var/log/oracle/sqlnet.log
9.3 性能监控
# 1. 查看连接统计
lsnrctl services
# 2. 查看监听器状态
lsnrctl status
# 3. 使用v$session监控
SELECT username, program, module
FROM v$session
WHERE username IS NOT NULL;
十、总结
CentOS上的Oracle网络配置是数据库运维的核心技能,主要包括:
- Listener配置:监听器是连接的核心
- TNS配置:连接字符串的解析
- 连接字符串:多种连接方式
- 安全配置:防火墙、SSL、Wallet
- 问题排查:常见错误的解决方案
- 性能优化:连接池、超时配置
- 远程连接:静态监听、VIP/SCAN
- 监控日志:问题诊断
核心要点:
– 使用EZCONNECT简化连接配置
– 配置防火墙开放1521端口
– 使用Oracle Wallet保护密码
– 定期检查监听器状态
– 配置连接池提升性能
– 启用SSL/TLS加密敏感连接
通过本文的指南,你可以在CentOS上顺利配置Oracle网络连接。
注:本文基于CentOS 7/8和Oracle 19c编写,具体配置可能因版本差异而略有不同。