由于oracle官方没有docker的镜像(这点让人想不明白),因此我们只能选择个人的镜像,这里我们使用阿里云上一个个人的镜像,当然在使用之前我们可以先配置docker的国内镜像,用于加速下载,这里我们使用的是阿里云的docker加速,也可以选择如下的镜像

    1. vi /etc/docker/daemon.json
    2. # 选择任意一个镜像地址即可
    3. #Docker中国官方镜像加速
    4. {
    5. "registry-mirrors": ["https://registry.docker-cn.com"]
    6. }
    7. # 网易163镜像加速
    8. {
    9. "registry-mirrors": ["http://hub-mirror.c.163.com"]
    10. }
    11. # 中科大镜像加速
    12. {
    13. "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    14. }

    首先我们将oracle的镜像下载下来:

    1. docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g;
    2. #修改tag
    3. docker tag registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g oracle_11g
    4. #删除原来的镜像
    5. docker rmi registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g;

    接着我们创建一个创建volume以持久化db数据,然后启动oracle容器,挂载在这个volume上

    1. docker volume create oracale-dev;
    2. #启动容器,挂载当前volume
    3. docker run -d -p 18080:8080 -p 11521:1521 --name oracle-dev -v oracle-dev:/data/oracle oracle_11g;

    接着我们进入当前容器内,进行oracle的配置以及实例名称的修改

    1. docker exec -it oracle-dev /bin/bash;

    进入oracle内部的linux以后,切换当前账号为root,默认的密码为: helowin

    1. su root;
    2. #输入密码: helowin
    3. #修改环境变量配置,添加oracle的启配置参数
    4. vi /etc/profile;
    5. #在unset -f pathmunge(默认的最后一行)的下一行添加如下内容
    6. export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
    7. export ORACLE_SID=helowin
    8. export NLS_LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK
    9. export PATH=$ORACLE_HOME/bin:$PATH
    10. #esc + :wq! 退出以后,刷新环境变量配置
    11. source /etc/profile;

    配置完毕以后,我们需要切换账号到oracle用户来配置和操作oracle

    1. su oracle;
    2. #刷新一下 bash环境变量
    3. source ~/.bash_profile;
    4. #连接oracle
    5. sqlplus /nolog;
    6. conn /as sysdba;
    7. #修改默认的system和sys账号的密码,这里的默认密码是:helowin,然后创建一个我们开发使用的admin账号,赋予dba权限(需要注意的是从这里开始,只要是sql操作,命令结束必须有;否则回车不会生效)
    8. alter user system identified by hearyou_system;
    9. alter user sys identified by hearyou_sys;
    10. create user dev_admin identified by 123456;
    11. grant connect,resource,dba to dev_admin;
    12. #设置密码永不过期
    13. ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
    14. #查看当前的数据库sid实例,这个时候应该是我们在/etc/profile环境变量里面配置的默认sid名称(此名称不允许修改,必须是helowin)
    15. select instance from v$thread;
    16. #关闭数据库实例
    17. shutdown immediate;
    18. #退出sql连接
    19. exit;

    将数据库关闭以后,我们开始修改数据库的实例信息,这里的步骤非常复杂(不知道oracle为什么要搞这么复杂)

    1. # 1.修改/etc/oratab文件
    2. vi /etc/oratab;
    3. #将 helowin 修改为 orcl,修改后的内容如下:
    4. orcl/home/oracle/app/oracle/product/11.2.0/dbhome_2:Y
    5. # 2.修改.bash_profile文件,将修改ORACLE_SID的修改为orcl
    6. vi ~/.bash_profile;
    7. # 使用vim快捷键快速修改 :%s/helowin/orcl/g
    8. # 3.修改完,保存后退出,刷新环境变量
    9. source ~/.bash_profile;
    10. #再次查看当前环境变量,看是否已经生效
    11. env|grep ORACLE
    12. #如果生效,输出的内容应该如下:
    13. ORACLE_SID=orcl
    14. ORACLE_BASE=/home/oracle/app/oracle
    15. ORACLE_TERM=xterm
    16. ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2

    接着我们需要修改一堆文件里面的内容

    1. #4.修改dbs目录下的文件名(dbs目录是用于存放数据库服务器端的参数文件Spfile、初始化文件init、还有密码文件orapwORACLESID在ORACLE_HOME目录下)
    2. # 进入到 $ORACLE_HOME/dbs并对hc_helowin.dat, lkHELOWIN spfilehelowin.ora 进行重名名
    3. cd $ORACLE_HOME/dbs;
    4. mv hc_helowin.dat hc_orcl.dat;
    5. mv lkHELOWIN lkORCL;
    6. mv spfilehelowin.ora spfileorcl.ora;
    7. # 重新生成密码文件,并将旧的密码文件删除
    8. orapwd file=$ORACLE_HOME/dbs/oraw$ORACLE_SID password=root entries=5 force=y;
    9. rm -rf orapwhelowin;
    10. # 这个时候登录数据库,查看实例名称是否已经修改
    11. sqlplus / as sysdba;
    12. startup;
    13. select instance from v$thread;
    14. # 输出应该是 orcl 即可
    15. #再次关闭数据库
    16. shutdown immediate;

    完成这一步以后,我们开始做数据库的备份

    1. # 5.进入控制文件的备份目录,根据alter_orcl.log日志文件($ORACLE_BASE/diag/rdbms/原实例名/新实例名/trace)找到控制备份文件oracle的备份文件复制一份进行修改
    2. cd $ORACLE_BASE/diag/rdbms/helowin/orcl/trace
    3. #查看密码存放的目录
    4. pwd;
    5. #输入如下: /home/oracle/app/oracle/diag/rdbms/helowin/orcl/trace
    6. # 进入alert_orcl.log 查找备份文件目录
    7. cat alert_orcl.log |grep 'alter database backup controlfile to trace resetlogs'
    8. # 将输出的目录cp改名为orcl.sql
    9. cp /home/oracle/app/oracle/diag/rdbms/helowin/orcl/trace/orcl_ora_1110.trc orcl.sql;
    10. #修改里面的sql语句
    11. vi orcl.sql
    12. #删除 STARTUP NOMOUNT 之前的内容 /STARTUP NOMOUNT 查出位置 60dd 删除内容
    13. #删除 -- End of tempfile additions. 之后的内容 /End of tempfile 查出位置后删除
    14. #替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
    15. #替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
    16. #删掉以 -- 的行
    17. #将CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG 中的 REUSE 改为 SET 变为了 CREATE CONTROLFILE SET DATABASE "ORCL" RESETLOGS NOARCHIVELOG
    18. #将 RECOVER DATABASE USING BACKUP CONTROLFILE 注释掉改为 -- RECOVER DATABASE USING BACKUP CONTROLFILE
    19. sqlplus / as sysdba;
    20. #生成 文件
    21. create pfile from spfile;
    22. exit;
    23. #最终生成的文件在$ORACLE_HOME/dbs目录下文件名为init$ORACLE_SID.ora
    24. cd $ORACLE_HOME/dbs;
    25. ll -ls;
    26. #修改initorcl.ora文件
    27. # 删除helowin. 开头的行
    28. #替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
    29. #替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
    30. vi initorcl.ora;
    31. #修改init.ora 文件
    32. #替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
    33. #替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
    34. vi init.ora;
    35. #spfileisdms.ora文件修改
    36. #删除helowin. 开头的行
    37. #替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
    38. #替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
    39. #删除 lkHELOWIN 文件
    40. rm -rf lkHELOWIN;
    41. # 6.修改$ORACLE_BASE/admin目录下的目录和文件内容
    42. cd $ORACLE_BASE/admin;
    43. mv helowin orcl;
    44. cd orcl/pfile/;
    45. #修改$ORACLE_BASE/admin/orcl/pfile目录下init.ora文件
    46. vi init.ora.72320146402;
    47. #替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
    48. #替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
    49. #7.修改$ORACLE_BASE/diag目录下的目录和文件内容
    50. cd $ORACLE_BASE/diag;
    51. cd rdbms/;
    52. mv helowin orcl;
    53. cd orcl/;
    54. rm -rf helowin;
    55. #8.修改$ORACLE_BASE/flash_recovery_area目录下的目录和文件内容
    56. cd $ORACLE_BASE/flash_recovery_area;
    57. mv helowin orcl;
    58. mv HELOWIN ORCL;
    59. #删除控制文件
    60. rm -rf control02.ctl;
    61. #9.修改$ORACLE_BASE/oradata目录下的目录和文件
    62. cd $ORACLE_BASE/oradata;
    63. mv helowin orcl;
    64. cd orcl/;
    65. rm -rf control01.ctl;
    66. #10.修改监听的配置文件tnsnames.ora
    67. cd $ORACLE_HOME/network/admin;
    68. vi tnsnames.ora;
    69. #将所有的HELOWIN修改为ORCL
    70. LISTENER_ORCL =
    71. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    72. ORCL =
    73. (DESCRIPTION =
    74. (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    75. (CONNECT_DATA =
    76. (SERVER = DEDICATED)
    77. (SERVICE_NAME = orcl)
    78. )
    79. )
    80. # 11.调用前面步骤修改好的orcl.sql,生成链接控制文件
    81. cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace;
    82. #查看文件的绝对路径,为执行sql做准备
    83. pwd;
    84. /home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace;
    85. #连接数据库
    86. sqlplus / as sysdba;
    87. #执行修改好的sql,生成连接控制文件
    88. @/home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl.sql;
    89. #查看数据库运行状态 read_write为可读写模式 READ WRITE
    90. select open_mode from v$database;
    91. #查看name 参数
    92. show parameter name;
    93. #查看实例名是否已经修改为orcl
    94. select name from v$database;
    95. #关闭数据库
    96. shutdown immediate;
    97. startup;
    98. #退出数据库连接,开启sql监听,再去远程连接数据库即可(如果输出:TNS-01106: Listener using listener name LISTENER has already been started代表已经开启了监听)
    99. exit;
    100. lsnrctl start;

    参考原文地址:

    https://blog.csdn.net/Liveor_Die/article/details/105177966