使用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资源在线。
相关推荐
藥瓿亭2 小时前
K8S认证|CKS题库+答案| 3. 默认网络策略
运维·ubuntu·docker·云原生·容器·kubernetes·cks
背太阳的牧羊人3 小时前
sudo docker exec -it backend bash 以交互方式(interactive)进入正在运行的 Docker 容器的命令行环境
docker·容器·bash
寒山李白4 小时前
MySQL安装与配置详细讲解
数据库·mysql·配置安装
gsls2008084 小时前
ocrapi服务docker镜像使用
运维·docker·容器
文牧之4 小时前
PostgreSQL 的扩展pg_freespacemap
运维·数据库·postgresql
deriva4 小时前
某水表量每15分钟一报,然后某天示数清0了,重新报示值了 ,如何写sql 计算每日水量
数据库·sql
爱宇阳5 小时前
使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
docker·postgresql·容器
whp4045 小时前
windows server2019 不成功的部署docker经历
运维·docker·容器
Leo.yuan6 小时前
数据库同步是什么意思?数据库架构有哪些?
大数据·数据库·oracle·数据分析·数据库架构
Kookoos6 小时前
ABP VNext 与 Neo4j:构建基于图数据库的高效关系查询
数据库·c#·.net·neo4j·abp vnext