使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)

docker-compose安装oracle11g并进行数据迁移(保姆级教程)

1. 先不挂载宿主机目录启动oracle实例

编写docker-compose 启动实例
docker-compose.yml

version: '3.1'
services:
  master:
    image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
    container_name: oracle
    privileged: true
    ports:
      - 1521:1521

启动成功,进入容器

docker-compose up -d
docker exec -it oracle bash

配置环境,并创建用户

cd /home/oracle                                           # 进入到 oracle 用户目录
source .bash_profile                                      # 加载 oracle 环境变量
$PATH                                                     # 查看 oracle 环境变量是否生效
sqlplus / as sysdba                                       # 连接 oracle 数据库
alter user system identified by oracle;                   # 修改 DBA 账号的密码
alter user sys identified by oracle;                      # 修改 DBA 账号的密码
alter profile default limit password_life_time unlimited; # 设置密码为永不过期
create user test identified by oracle;                    # 创建一个 test 用户,密码 oracle
select * from dba_users t where t.username = 'TEST';      # 查询用户是否创建成功
grant connect, resource to test;                          # 给用户授予连接和数据权限

相关配置(可省略)

grant select on V_$session to test;
grant select on V_$sesstat to test;
grant select on V_$statname to test;
show parameter deferred_segment_creation;          -- 查看是否启用 true 为启动
alter system set deferred_segment_creation=false;  -- 修改为不启用
show parameter deferred_segment_creation;          -- 查看是否修改成功 false 未启用

plsql 连接
修改tnsnames.ora

find / -name tnsnames.ora
# /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora
# /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/samples/tnsnames.ora
vi /home/oracle/app/oracle/product/11.2.0/dbhome_2/network/admin/tnsnames.ora

将localhost修改成ip

oracle_11g =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.168.1.***)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = helowin)
    )
  )

数据持久化(将docker内容文件拷贝到宿主机中)

mkdir -p /usr/local/docker/oracle/
cd /usr/local/docker/oracle/

docker cp oracle:/home/oracle/app/oracle/oradata/helowin /usr/local/docker/oracle/helowin
cd /usr/local/docker/oracle
chown -R 500.500 ./helowin  # 500 500 是容器内 oracle 组合用户的 id

关闭容器
docker-compose down
修改docker-compose.yml
docker-compose.yml在/usr/local/docker/oracle目录下

version: '3.1'
services:
  master:
    image: registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
    container_name: oracle
    privileged: true
    ports:
      - 1521:1521
    # 新增以下信息
    volumes:
      - ./helowin:/home/oracle/app/oracle/oradata/helowin

数据迁移

  1. 将/usr/local/docker/oracle/helowin目录下的文件全部删除
cd /usr/local/docker/oracle/helowin
rm -rf ./*
  1. 将原来的Oracle数据helowin下的文件,全部移到/home/oracle/app/oracle/oradata/helowin下
mv data(原来的数据) /usr/local/docker/oracle/helowin
  1. 给Oracle用户赋予权限
chown -R 500.500 ./helowin  # 500 500 是容器内 oracle 组合用户的 id
  1. 启动docker-compose
docker-compose up -d
  1. 查看日志:docker logs -f oracle,我们发现了一个错误,这是由于 oracle 为了数据安全,添加的版本验证
/home/oracle/app/oracle/product/11.2.0/dbhome_2
Processing Database instance "helowin": log file /home/oracle/app/oracle/product/11.2.0/dbhome_2/startup.log
Redo Buffers		   24137728 bytes
ORA-00214: control file '/home/oracle/app/oracle/oradata/helowin/control01.ctl'
version 877 inconsistent with file
'/home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl' version 841

SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

/home/oracle/app/oracle/product/11.2.0/dbhome_2/bin/dbstart: Database instance "helowin" warm started.

  1. 进入容器内,解决错误,每次重启都需要此部操作!!!
docker exec -it oracle bash
cd /home/oracle              # 进入到 oracle 用户目录
source .bash_profile         # 加载 oracle 环境变量(每次进入容器都要加载配置文件)
 
# 删除新生成的版本控制文件,将数据卷中的版本控制文件复制为新生成的版本控制文件
rm -rf /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl
cp /home/oracle/app/oracle/oradata/helowin/control01.ctl /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl
 
sqlplus / as sysdba          # 以 dba 身份连接 oracle 数据库
shutdown immediate           # 关闭数据库实例(这里会报错,不用管)
startup                      # 启动实例

  1. 如果出现ORA-01113: file * needs media recovery的错误
    解决办法:
    > sqlplus / as sysdba 
    SQL>startup 
    ERROR at line 1: 
    ORA-01113: file * needs media recovery 
    ORA-01110: data file *: 'xxx.dbf'
  • 单机系统
    su - oracle 
    sqlplus / as sysdba 
    recover database; 
    shutdown immediate 
    startup 
    exit
  • 高可用性系统
  1. 在root用户下使用命令hares -state Netlsnr -sys $(hostname) 查看执行结果是否为“online”,确保Netlsnr资源在线。
  2. 执行如下命令登录Oracle
		su - oracle
		sqlplus commonuser/网管数据库密码 as sysdba;
  1. 登录成功之后,执行如下命令恢复数据文件
       recover database; 
      exit
  1. 在root用户下执行命令hares -offline Oracle -sys $(hostname) 使Oracle资源离线,然后再执行命令hares -online Oracle -sys $(hostname)使Oracle资源在线。
<think>嗯,用户想迁移运行Oracle 11g的Docker容器到新服务器。首先,我得回忆一下Docker迁移的一般步骤。根据引用[2]提到的,可能需要用docker inspect查看容器参数,然后打包数据和配置。不过Oracle数据库比较特殊,数据持久化很重要,用户之前用了volumes挂载,这点要注意。 首先,检查原服务器的容器配置。用户之前的docker-compose.yml里挂载了两个目录到宿主机,分别是/data/oracle/oradata下的test_data和flash_recovery_area。所以在迁移时,这些数据目录必须完整地复制到新服务器,否则数据库数据会丢失。 然后,容器本身可能有一些运行时参数,比如端口映射是15211:1521。通过docker inspect可以获取这些信息,确保新服务器上的配置一致。不过用户已经用了docker-compose,可能直接迁移这个文件更方便。 接下来,数据迁移部分。用户之前提到用cp命令拷贝容器内目录到宿主机,但现在需要把宿主机的数据目录迁移到新服务器。可以使用rsync或者scp将/data/oracle/oradata整个传输过去。注意权限问题,Oracle在容器里可能有特定的用户权限,所以新服务器上的目录权限要设置正确。 然后是新服务器的环境准备。安装Dockerdocker-compose,版本要和原服务器一致,避免兼容问题。把docker-compose.yml复制过去,调整路径如果有必要,比如确保新服务器的/data目录存在,或者修改挂载路径到其他位置。 启动容器的时候,可能需要重新构建或者直接启动。因为镜像来自阿里云的registry,新服务器需要能够拉取这个镜像,或者提前导出镜像再导入到新服务器,以防拉取失败。 另外,Oracle的配置文件或者环境变量是否需要特殊处理?比如字符集、内存参数等,可能在docker-compose.yml里有设置,需要检查。如果容器有特定的启动参数,也要在新环境里保持一致。 测试阶段很重要,启动容器后,检查日志是否有错误,进入容器内部确认数据库是否正常,用sqlplus连接测试。如果有问题,可能需要查看Oracle的日志文件,比如alert log,排查原因。 最后,用户可能需要修改应用连接的数据库地址,指向新服务器的IP和端口15211。确保防火墙开放这个端口,避免连接问题。 总结步骤应该是:备份数据、迁移数据、迁移配置文件、安装Docker环境、启动容器、测试验证。需要详细说明每一步的操作命令和注意事项,尤其是数据完整性和权限问题,避免迁移数据库无法启动。</think>### 运行Oracle 11g的Docker容器迁移步骤 #### 1. **备份容器配置与数据** - **查看容器配置** 使用`docker inspect og`查看当前容器的详细信息,包括卷映射、端口绑定等参数[^2]。 示例输出关键字段: ```bash "Mounts": [ { "Source": "/data/oracle/oradata/test_data", "Destination": "/home/oracle/app/oracle/oradata/helowin" }, ... ] "Ports": { "1521/tcp": [{"HostPort": "15211"}] } ``` - **持久化数据备份** 用户已通过卷映射将数据存储在宿主机目录`/data/oracle/oradata`下,需将此目录完整打包迁移: ```bash tar -czvf oracle_data.tar.gz /data/oracle/oradata ``` #### 2. **迁移到新服务器** - **传输数据与配置** 将`oracle_data.tar.gz`和`docker-compose.yml`复制到新服务器: ```bash scp oracle_data.tar.gz user@new_server:/target_path/ scp docker-compose.yml user@new_server:/target_path/ ``` - **解压数据并恢复目录结构** 在新服务器上解压并确保目录路径与原服务器一致: ```bash tar -xzvf oracle_data.tar.gz -C / chown -R 1000:1000 /data/oracle/oradata # 根据容器内Oracle用户UID/GID调整权限 ``` #### 3. **新服务器环境准备** - **安装Docker及依赖** 确保新服务器已安装Dockerdocker-compose,版本需与原服务器一致: ```bash yum install docker docker-compose -y systemctl start docker ``` - **拉取Oracle 11g镜像** 若镜像未公开,需提前从原服务器导出镜像并导入新服务器: ```bash docker save helowin/oracle_11g > oracle11g.tar scp oracle11g.tar user@new_server:/target_path/ docker load -i oracle11g.tar ``` #### 4. **启动容器并验证** - **通过docker-compose启动** 确保新服务器的`docker-compose.yml`中卷路径和端口映射正确: ```yaml volumes: - "/data/oracle/oradata/test_data:/home/oracle/app/oracle/oradata/helowin" - "/data/oracle/oradata/flash_recovery_area:/home/oracle/app/oracle/flash_recovery_area/helowin" ports: - "15211:1521" ``` 启动容器: ```bash docker-compose up -d ``` - **验证数据库状态** 进入容器检查监听服务和数据库连接: ```bash docker exec -it og bash su - oracle lsnrctl status # 查看监听状态 sqlplus / as sysdba # 登录数据库 SELECT status FROM v$instance; # 应返回"OPEN" ``` #### 5. **故障排查** - **常见问题** - **权限错误**:检查宿主机目录权限是否与容器内Oracle用户匹配(UID/GID可通过`docker exec og id oracle`获取)。 - **端口冲突**:确保新服务器15211端口未被占用。 - **数据损坏**:从备份恢复数据,避免直接操作容器内数据库文件。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值