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

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

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

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

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

启动成功,进入容器

powershell 复制代码
docker-compose up -d
docker exec -it oracle bash

配置环境,并创建用户

powershell 复制代码
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;                          # 给用户授予连接和数据权限

相关配置(可省略)

powershell 复制代码
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

powershell 复制代码
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

shell 复制代码
oracle_11g =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 10.168.1.***)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = helowin)
    )
  )

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

powershell 复制代码
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目录下

powershell 复制代码
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目录下的文件全部删除
powershell 复制代码
cd /usr/local/docker/oracle/helowin
rm -rf ./*
  1. 将原来的Oracle数据helowin下的文件,全部移到/home/oracle/app/oracle/oradata/helowin下
powershell 复制代码
mv data(原来的数据) /usr/local/docker/oracle/helowin
  1. 给Oracle用户赋予权限
powershell 复制代码
chown -R 500.500 ./helowin  # 500 500 是容器内 oracle 组合用户的 id
  1. 启动docker-compose
powershell 复制代码
docker-compose up -d
  1. 查看日志:docker logs -f oracle,我们发现了一个错误,这是由于 oracle 为了数据安全,添加的版本验证
powershell 复制代码
/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. 进入容器内,解决错误,每次重启都需要此部操作!!!
powershell 复制代码
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的错误
    解决办法:
powershell 复制代码
    > sqlplus / as sysdba 
    SQL>startup 
    ERROR at line 1: 
    ORA-01113: file * needs media recovery 
    ORA-01110: data file *: 'xxx.dbf'
  • 单机系统
powershell 复制代码
    su - oracle 
    sqlplus / as sysdba 
    recover database; 
    shutdown immediate 
    startup 
    exit
  • 高可用性系统
  1. 在root用户下使用命令hares -state Netlsnr -sys $(hostname) 查看执行结果是否为"online",确保Netlsnr资源在线。
  2. 执行如下命令登录Oracle
powershell 复制代码
		su - oracle
		sqlplus commonuser/网管数据库密码 as sysdba;
  1. 登录成功之后,执行如下命令恢复数据文件
powershell 复制代码
       recover database; 
      exit
  1. 在root用户下执行命令hares -offline Oracle -sys $(hostname) 使Oracle资源离线,然后再执行命令hares -online Oracle -sys $(hostname)使Oracle资源在线。
相关推荐
Karoku06620 分钟前
【CI/CD】CI/CD环境搭建流程和持续集成环境配置
运维·ci/cd·docker·容器·kubernetes·prometheus
夜泉_ly23 分钟前
MySQL -安装与初识
数据库·mysql
qq_529835351 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New4 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6754 小时前
数据库基础1
数据库
我爱松子鱼4 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo4 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser5 小时前
【SQL】多表查询案例
数据库·sql
Galeoto5 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
人间打气筒(Ada)6 小时前
MySQL主从架构
服务器·数据库·mysql