141 lines
4.9 KiB
Python
141 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
快速Oracle连接测试脚本
|
|
用于快速诊断Oracle连接问题
|
|
"""
|
|
|
|
import oracledb
|
|
import logging
|
|
from config import DatabaseConfig
|
|
|
|
# 配置日志
|
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
logger = logging.getLogger(__name__)
|
|
|
|
def test_oracle_connection():
|
|
"""
|
|
测试Oracle连接的多种方式
|
|
"""
|
|
# 获取Oracle配置
|
|
config = DatabaseConfig.get_config("oracle")
|
|
|
|
print("=" * 60)
|
|
print("快速Oracle连接测试")
|
|
print("=" * 60)
|
|
print(f"配置信息:")
|
|
print(f" 主机: {config['host']}")
|
|
print(f" 端口: {config['port']}")
|
|
print(f" 用户名: {config['username']}")
|
|
print(f" 服务名: {config['service_name']}")
|
|
print("=" * 60)
|
|
|
|
# 测试方式列表
|
|
test_methods = [
|
|
{
|
|
'name': '方式1: Easy Connect字符串',
|
|
'params': {
|
|
'user': config['username'],
|
|
'password': config['password'],
|
|
'dsn': f"{config['host']}:{config['port']}/{config['service_name']}"
|
|
}
|
|
},
|
|
{
|
|
'name': '方式2: 分离参数 (service_name)',
|
|
'params': {
|
|
'user': config['username'],
|
|
'password': config['password'],
|
|
'host': config['host'],
|
|
'port': config['port'],
|
|
'service_name': config['service_name']
|
|
}
|
|
},
|
|
{
|
|
'name': '方式3: makedsn (service_name)',
|
|
'params': {
|
|
'user': config['username'],
|
|
'password': config['password'],
|
|
'dsn': oracledb.makedsn(config['host'], config['port'], service_name=config['service_name'])
|
|
}
|
|
},
|
|
{
|
|
'name': '方式4: makedsn (SID)',
|
|
'params': {
|
|
'user': config['username'],
|
|
'password': config['password'],
|
|
'dsn': oracledb.makedsn(config['host'], config['port'], sid=config['service_name'])
|
|
}
|
|
}
|
|
]
|
|
|
|
success_count = 0
|
|
|
|
for i, method in enumerate(test_methods, 1):
|
|
print(f"\n🔍 测试 {method['name']}...")
|
|
|
|
try:
|
|
# 显示连接参数
|
|
if 'dsn' in method['params']:
|
|
print(f" DSN: {method['params']['dsn']}")
|
|
else:
|
|
print(f" Host: {method['params']['host']}:{method['params']['port']}")
|
|
if 'service_name' in method['params']:
|
|
print(f" Service Name: {method['params']['service_name']}")
|
|
|
|
# 尝试连接
|
|
connection = oracledb.connect(**method['params'])
|
|
|
|
# 测试查询
|
|
cursor = connection.cursor()
|
|
cursor.execute("SELECT 1 FROM DUAL")
|
|
result = cursor.fetchone()
|
|
|
|
# 获取数据库信息
|
|
cursor.execute("SELECT BANNER FROM V$VERSION WHERE ROWNUM = 1")
|
|
version = cursor.fetchone()
|
|
|
|
cursor.close()
|
|
connection.close()
|
|
|
|
print(f" ✅ 连接成功!")
|
|
print(f" 📊 查询结果: {result}")
|
|
print(f" 🔖 数据库版本: {version[0] if version else 'Unknown'}")
|
|
|
|
success_count += 1
|
|
|
|
except Exception as e:
|
|
print(f" ❌ 连接失败: {str(e)}")
|
|
|
|
# 分析常见错误
|
|
error_str = str(e).lower()
|
|
if 'ora-12514' in error_str:
|
|
print(f" 💡 提示: ORA-12514错误通常表示服务名不存在或未注册")
|
|
elif 'ora-12541' in error_str:
|
|
print(f" 💡 提示: ORA-12541错误通常表示监听器未运行")
|
|
elif 'ora-01017' in error_str:
|
|
print(f" 💡 提示: ORA-01017错误表示用户名或密码无效")
|
|
elif 'ora-12170' in error_str:
|
|
print(f" 💡 提示: ORA-12170错误表示连接超时")
|
|
|
|
print("\n" + "=" * 60)
|
|
print(f"测试结果: {success_count}/{len(test_methods)} 种方式成功")
|
|
|
|
if success_count == 0:
|
|
print("\n🔧 所有连接方式都失败,可能的解决方案:")
|
|
print("1. 检查Oracle数据库服务是否正在运行")
|
|
print("2. 检查监听器状态: lsnrctl status")
|
|
print("3. 验证服务名是否正确注册")
|
|
print("4. 检查网络连接和防火墙设置")
|
|
print("5. 确认用户名和密码正确")
|
|
print("6. 尝试使用Oracle SQL Developer或其他客户端工具测试连接")
|
|
elif success_count < len(test_methods):
|
|
print("\n⚠️ 部分连接方式成功,建议使用成功的连接方式")
|
|
else:
|
|
print("\n🎉 所有连接方式都成功!")
|
|
|
|
print("=" * 60)
|
|
|
|
return success_count > 0
|
|
|
|
if __name__ == "__main__":
|
|
test_oracle_connection() |