使用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 小时前
如何使用 Python 连接 MySQL 数据库?
数据库·python·mysql
新手小袁_J3 小时前
实现Python将csv数据导入到Neo4j
数据库·python·neo4j·《我是刑警》·python连接neo4j·python导入csv·csv数据集导入neo4j
シ風箏3 小时前
Neo4j【环境部署 02】图形数据库Neo4j在Linux系统ARM架构下的安装使用
linux·数据库·arm·neo4j
张声录13 小时前
【ETCD】【实操篇(四)】etcd常见问题快问快答FAQ
数据库·etcd
CherishTaoTao5 小时前
sqlite基础
数据库·oracle·sqlite
筏镜6 小时前
调整docker bridge地址冲突,通过bip调整 bridge地址
java·docker·eureka
嶔某6 小时前
MySql:基本查询
数据库·mysql
开心工作室_kaic7 小时前
springboot461学生成绩分析和弱项辅助系统设计(论文+源码)_kaic
开发语言·数据库·vue.js·php·apache
毕设资源大全8 小时前
基于SpringBoot+html+vue实现的林业产品推荐系统【源码+文档+数据库文件+包部署成功+答疑解惑问到会为止】
java·数据库·vue.js·spring boot·后端·mysql·html
weisian1518 小时前
Redis篇--常见问题篇3--缓存击穿(数据查询上锁,异步操作,熔断降级,三种缓存问题综合优化策略)
数据库·redis·缓存