双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 后的地址串必须单行编写,不要换行、缩进。

相关推荐
java_logo1 小时前
Docker 部署 Rocky Linux:轻松搭建 RHEL 兼容企业级基础镜像平台
linux·docker·容器·rocky linux·基础镜像·轩辕镜像·rhel 兼容
cloudfantasy2 小时前
docker直接二进制安装,非编译。KylinV10SP3 aarch64有效
运维·docker
M--Y5 小时前
Docker数据持久化与网络架构
网络·docker·架构
oradh7 小时前
Oracle enq: TX - index contention 锁等待事件问题排查总结
数据库·oracle·oracle enq tx·enq tx index
鹤落晴春7 小时前
【K8s】认识Kubernetes API:从CRD出发的一次梳理
云原生·容器·kubernetes
yanwumuxi9 小时前
Docker记录:误删宿主机挂载目录导致 PostgreSQL 数据丢失
docker·postgresql·容器
cui_hao_nan11 小时前
Docker 学习 5
docker·容器
A黄俊辉A11 小时前
两分钟上手docker
运维·docker·容器
程序员老赵12 小时前
Docker 部署 go2rtc:轻松搭建摄像头多协议流媒体平台
前端·docker·直播
努力努力再努力wz13 小时前
【Docker入门系列】:从架构演进到容器化:一文建立 Docker、虚拟化与 Namespace 的底层心智模型
运维·开发语言·数据结构·c++·docker·容器·架构