双Docker Oracle XE 跨库查询操作文档

一、架构说明

同一宿主机运行两个 Oracle XE 21c 容器,通过 Docker 内网 + Oracle DBLINK 实现跨库联合查询。

  • oracle-db1:主查询库,宿主机端口 1521
  • oracle-db2:数据源库,宿主机端口 1522
  • 限制:Oracle XE 单库数据上限 12GB,仅查询、不新建物理表,结果导出至本地。

二、配置Docker网络(容器互通)

bash 复制代码
# 创建自定义网桥网络
docker network create orcl-network

# 将两个容器加入同一网络
docker network connect orcl-network oracle-db1
docker network connect orcl-network oracle-db2

查看 db2 容器内网IP

bash 复制代码
docker inspect oracle-db2 | grep IPAddress

记录输出的内网 IP(例:172.17.0.5),后续配置使用。

1. 登录 db1 业务用户

bash 复制代码
docker exec -it oracle-db1 bash
sqlplus XZ_EHR/"Oracle123"@XEPDB1

2. 新建数据库链接

替换 172.17.0.5 为实际查到的 db2 内网IP,端口固定使用容器内部 1521

sql 复制代码
-- 删除旧链路(存在时执行)
DROP DATABASE LINK link_db2;

-- 创建DBLINK(单行书写,避免语法报错)
CREATE DATABASE LINK link_db2 
CONNECT TO XZ_EHR IDENTIFIED BY "Oracle123"
USING '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.17.0.5)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=XEPDB1)))';

3. 连通性测试

sql 复制代码
SELECT 1 FROM DUAL@link_db2;

返回 1 代表跨库连接正常。

四、血脂相关数据跨库查询

最终查询 SQL

sql 复制代码
SELECT DISTINCT
t1.CARDNO,t1.OP_EM_NO,t1.RPT_CAT_NAME,t1.RPT_CAT_CODE,
t2.NO_RPT,t2.SEX,t2.BIRTHDAY
FROM (
SELECT CARDNO,OP_EM_NO,RPT_CAT_NAME,RPT_CAT_CODE 
FROM V_EMR_TEST_DOCUMENT_RECORD
WHERE RPT_CAT_NAME IN (
'血脂分析',
'甘油三酯',
'低密度脂蛋白胆固醇',
'高密度脂蛋白胆固醇'
))t1
INNER JOIN V_TEST_RESULT_RECORD@link_db2 t2 
ON t1.CARDNO=t2.CARDNO AND t1.OP_EM_NO=t2.OP_EM_NO;

语句说明

  1. 数据源
    • V_EMR_TEST_DOCUMENT_RECORD:db1 检验项目视图
    • V_TEST_RESULT_RECORD@link_db2:db2 患者信息视图,@link_db2 表示访问远端库表
  2. 数据筛选:仅查询血脂类检验项目
  3. 关联条件:CARDNO 卡号 + OP_EM_NO 就诊流水号

扩展用法

  • 需保留 db1 全部数据(无匹配字段置空),将 INNER JOIN 改为 LEFT JOIN
  • 查询完成后,在客户端右键结果集,导出为 CSV/Excel 保存到本地。

五、常见问题处理

  1. ORA-12543 目标主机不可达

    容器未加入同一网络,重新执行 docker network connect 命令。

  2. ORA-01017/ORA-28000 密码错误/账号锁定

    进入 db2 容器解锁并重置密码:

    sql 复制代码
    ALTER SESSION SET CONTAINER=XEPDB1;
    ALTER USER XZ_EHR ACCOUNT UNLOCK;
    ALTER USER XZ_EHR IDENTIFIED BY "Oracle123";
  3. ORA-12954 超出12GB容量限制

    XE 版本硬性容量限制,禁止执行建表语句,仅做查询并导出本地文件。

  4. ORA-12533 TNS参数非法

    DBLINK 中 USING 后的地址串必须单行编写,不要换行、缩进。

相关推荐
Patrick_Wilson4 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
Suroy4 天前
DockerView-Go:用 Go 写一个终端 Docker 监控工具,顺便做了个 Web 仪表盘
docker
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
ClouGence5 天前
Oracle 数据同步为什么会出现数据不一致?长事务是常被忽略的原因
数据库·后端·oracle
宋均浩5 天前
# Docker 镜像瘦身实战:从 1.2G 到 80MB 的五个优化步骤
ci/cd·docker
程序员老赵6 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程
WangMingHua1116 天前
LM Studio Docker 部署——本地大模型一键启动
docker
曲幽7 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
武子康9 天前
调查研究-183 Apple container:Mac 上用轻量 VM 跑 Linux 容器,Swift 会改写本地容器体验吗?
docker·容器·apple
ClouGence11 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle