Files
dababase-etl-python/ORACLE_CONNECTION_GUIDE.md
2026-03-04 12:17:52 +08:00

186 lines
4.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Oracle数据库连接指南
## Oracle连接角色说明
### 什么是Oracle角色
Oracle数据库中的角色Role是一组权限的集合用于简化用户权限管理。角色不是连接参数而是数据库内部的权限管理机制。
### 常见的Oracle角色
1. **CONNECT** - 基本连接权限
- 允许用户连接到数据库
- 创建表、视图、序列等基本对象
2. **RESOURCE** - 资源使用权限
- 允许用户创建存储过程、触发器等
- 使用表空间资源
3. **DBA** - 数据库管理员权限
- 完全的数据库管理权限
- 可以管理所有数据库对象
4. **SELECT_CATALOG_ROLE** - 数据字典查询权限
- 允许查询数据字典视图
### 默认角色
对于普通用户(如 `bizuser`),通常会被授予以下默认角色:
- **CONNECT** - 基本连接权限
- **RESOURCE** - 资源使用权限
## Oracle连接参数说明
### 基本连接参数
- **主机地址 (host)**: Oracle数据库服务器的IP地址或主机名
- **端口 (port)**: Oracle监听器端口默认为1521
- **服务名称 (service_name)**: Oracle数据库的服务名称如ORCLPDB1
- **用户名 (username)**: 数据库用户名
- **密码 (password)**: 数据库密码
### 高级连接参数
- **mode**: 连接模式
- `SYSDBA`: 系统管理员模式
- `SYSOPER`: 系统操作员模式
- `NORMAL`: 普通用户模式(默认)
- **threaded**: 线程模式
- `true`: 启用线程模式(推荐)
- `false`: 禁用线程模式
## 连接字符串格式
### 标准格式
```
oracle+oracledb://username:password@host:port/service_name
```
### 带参数格式
```
oracle+oracledb://username:password@host:port/service_name?encoding=UTF-8&nencoding=UTF-8&threaded=true
```
## 用户提供的连接信息
根据您提供的Navicat连接信息
```
主机地址: 192.168.13.27
端口: 1521
服务名称: ORCLPDB1
用户名: bizuser
密码: MySecurePass123
角色: Default (CONNECT + RESOURCE)
```
## 连接测试
### 使用测试脚本
1. 启动API服务
```bash
python main.py
```
2. 运行Oracle连接测试
```bash
python test_oracle_connection.py
```
### 使用API接口
```json
{
"db_type": "oracle",
"host": "192.168.13.27",
"port": 1521,
"username": "bizuser",
"password": "MySecurePass123",
"database": "ORCLPDB1",
"threaded": true
}
```
## 常见连接问题及解决方案
### 1. TNS: 无法解析指定的连接标识符
**原因**: 服务名称不正确或Oracle监听器未启动
**解决方案**:
- 检查服务名称是否正确
- 确认Oracle监听器正在运行
- 使用 `lsnrctl status` 检查监听器状态
### 2. ORA-12541: TNS: 无监听程序
**原因**: Oracle监听器未启动或端口被占用
**解决方案**:
- 启动Oracle监听器: `lsnrctl start`
- 检查端口1521是否被占用
- 确认防火墙设置
### 3. ORA-01017: 用户名/口令无效
**原因**: 用户名或密码错误
**解决方案**:
- 验证用户名和密码
- 检查用户账户是否被锁定
- 确认用户是否存在
### 4. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务
**原因**: 服务名称不存在或未注册到监听器
**解决方案**:
- 检查服务名称是否正确
- 使用 `lsnrctl services` 查看可用服务
- 确认数据库实例正在运行
## 连接池配置
本项目为Oracle连接配置了专门的连接池参数
```python
engine_kwargs = {
"pool_size": 10, # 连接池大小
"max_overflow": 20, # 最大溢出连接数
"pool_timeout": 30, # 连接超时时间(秒)
"pool_recycle": 3600 # 连接回收时间(秒)
}
```
## 环境变量配置
可以通过环境变量配置Oracle连接参数
```bash
# .env文件
ORACLE_HOST=192.168.13.27
ORACLE_PORT=1521
ORACLE_USERNAME=bizuser
ORACLE_PASSWORD=MySecurePass123
ORACLE_SERVICE_NAME=ORCLPDB1
```
## 注意事项
1. **角色不是连接参数**: Oracle角色是数据库内部的权限管理机制不需要在连接字符串中指定
2. **服务名称 vs SID**: 现代Oracle推荐使用服务名称而不是SID
3. **字符编码**: 建议使用UTF-8编码以支持中文字符
4. **连接安全**: 在生产环境中建议使用SSL/TLS加密连接
5. **连接池**: 使用连接池可以提高性能和资源利用率
## 技术支持
如果连接仍然失败,请检查:
1. Oracle客户端库是否正确安装
2. 网络连接是否正常
3. Oracle数据库服务是否运行
4. 防火墙和安全组设置
5. 用户权限是否足够