由于oracle官方没有docker的镜像(这点让人想不明白),因此我们只能选择个人的镜像,这里我们使用阿里云上一个个人的镜像,当然在使用之前我们可以先配置docker的国内镜像,用于加速下载,这里我们使用的是阿里云的docker加速,也可以选择如下的镜像
vi /etc/docker/daemon.json
# 选择任意一个镜像地址即可
#Docker中国官方镜像加速
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
# 网易163镜像加速
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 中科大镜像加速
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
首先我们将oracle的镜像下载下来:
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g;
#修改tag
docker tag registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g oracle_11g
#删除原来的镜像
docker rmi registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g;
接着我们创建一个创建volume以持久化db数据,然后启动oracle容器,挂载在这个volume上
docker volume create oracale-dev;
#启动容器,挂载当前volume
docker run -d -p 18080:8080 -p 11521:1521 --name oracle-dev -v oracle-dev:/data/oracle oracle_11g;
接着我们进入当前容器内,进行oracle的配置以及实例名称的修改
docker exec -it oracle-dev /bin/bash;
进入oracle内部的linux以后,切换当前账号为root,默认的密码为: helowin
su root;
#输入密码: helowin
#修改环境变量配置,添加oracle的启配置参数
vi /etc/profile;
#在unset -f pathmunge(默认的最后一行)的下一行添加如下内容
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export NLS_LANG="SIMPLIFIED CHINESE_CHINA".ZHS16GBK
export PATH=$ORACLE_HOME/bin:$PATH
#esc + :wq! 退出以后,刷新环境变量配置
source /etc/profile;
配置完毕以后,我们需要切换账号到oracle用户来配置和操作oracle
su oracle;
#刷新一下 bash环境变量
source ~/.bash_profile;
#连接oracle
sqlplus /nolog;
conn /as sysdba;
#修改默认的system和sys账号的密码,这里的默认密码是:helowin,然后创建一个我们开发使用的admin账号,赋予dba权限(需要注意的是从这里开始,只要是sql操作,命令结束必须有;否则回车不会生效)
alter user system identified by hearyou_system;
alter user sys identified by hearyou_sys;
create user dev_admin identified by 123456;
grant connect,resource,dba to dev_admin;
#设置密码永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
#查看当前的数据库sid实例,这个时候应该是我们在/etc/profile环境变量里面配置的默认sid名称(此名称不允许修改,必须是helowin)
select instance from v$thread;
#关闭数据库实例
shutdown immediate;
#退出sql连接
exit;
将数据库关闭以后,我们开始修改数据库的实例信息,这里的步骤非常复杂(不知道oracle为什么要搞这么复杂)
# 1.修改/etc/oratab文件
vi /etc/oratab;
#将 helowin 修改为 orcl,修改后的内容如下:
orcl/home/oracle/app/oracle/product/11.2.0/dbhome_2:Y
# 2.修改.bash_profile文件,将修改ORACLE_SID的修改为orcl
vi ~/.bash_profile;
# 使用vim快捷键快速修改 :%s/helowin/orcl/g
# 3.修改完,保存后退出,刷新环境变量
source ~/.bash_profile;
#再次查看当前环境变量,看是否已经生效
env|grep ORACLE
#如果生效,输出的内容应该如下:
ORACLE_SID=orcl
ORACLE_BASE=/home/oracle/app/oracle
ORACLE_TERM=xterm
ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
接着我们需要修改一堆文件里面的内容
#4.修改dbs目录下的文件名(dbs目录是用于存放数据库服务器端的参数文件Spfile、初始化文件init、还有密码文件orapwORACLESID在ORACLE_HOME目录下)
# 进入到 $ORACLE_HOME/dbs并对hc_helowin.dat, lkHELOWIN spfilehelowin.ora 进行重名名
cd $ORACLE_HOME/dbs;
mv hc_helowin.dat hc_orcl.dat;
mv lkHELOWIN lkORCL;
mv spfilehelowin.ora spfileorcl.ora;
# 重新生成密码文件,并将旧的密码文件删除
orapwd file=$ORACLE_HOME/dbs/oraw$ORACLE_SID password=root entries=5 force=y;
rm -rf orapwhelowin;
# 这个时候登录数据库,查看实例名称是否已经修改
sqlplus / as sysdba;
startup;
select instance from v$thread;
# 输出应该是 orcl 即可
#再次关闭数据库
shutdown immediate;
完成这一步以后,我们开始做数据库的备份
# 5.进入控制文件的备份目录,根据alter_orcl.log日志文件($ORACLE_BASE/diag/rdbms/原实例名/新实例名/trace)找到控制备份文件oracle的备份文件复制一份进行修改
cd $ORACLE_BASE/diag/rdbms/helowin/orcl/trace
#查看密码存放的目录
pwd;
#输入如下: /home/oracle/app/oracle/diag/rdbms/helowin/orcl/trace
# 进入alert_orcl.log 查找备份文件目录
cat alert_orcl.log |grep 'alter database backup controlfile to trace resetlogs'
# 将输出的目录cp改名为orcl.sql
cp /home/oracle/app/oracle/diag/rdbms/helowin/orcl/trace/orcl_ora_1110.trc orcl.sql;
#修改里面的sql语句
vi orcl.sql;
#删除 STARTUP NOMOUNT 之前的内容 /STARTUP NOMOUNT 查出位置 60dd 删除内容
#删除 -- End of tempfile additions. 之后的内容 /End of tempfile 查出位置后删除
#替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
#替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
#删掉以 -- 的行
#将CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG 中的 REUSE 改为 SET 变为了 CREATE CONTROLFILE SET DATABASE "ORCL" RESETLOGS NOARCHIVELOG
#将 RECOVER DATABASE USING BACKUP CONTROLFILE 注释掉改为 -- RECOVER DATABASE USING BACKUP CONTROLFILE
sqlplus / as sysdba;
#生成 文件
create pfile from spfile;
exit;
#最终生成的文件在$ORACLE_HOME/dbs目录下文件名为init$ORACLE_SID.ora
cd $ORACLE_HOME/dbs;
ll -ls;
#修改initorcl.ora文件
# 删除helowin. 开头的行
#替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
#替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
vi initorcl.ora;
#修改init.ora 文件
#替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
#替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
vi init.ora;
#spfileisdms.ora文件修改
#删除helowin. 开头的行
#替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
#替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
#删除 lkHELOWIN 文件
rm -rf lkHELOWIN;
# 6.修改$ORACLE_BASE/admin目录下的目录和文件内容
cd $ORACLE_BASE/admin;
mv helowin orcl;
cd orcl/pfile/;
#修改$ORACLE_BASE/admin/orcl/pfile目录下init.ora文件
vi init.ora.72320146402;
#替换所有的helowin为orcl 命令 :%s/helowin/orcl/g
#替换所有的HELOWIN为ORCL 命令 :%s/HELOWIN/ORCL/g
#7.修改$ORACLE_BASE/diag目录下的目录和文件内容
cd $ORACLE_BASE/diag;
cd rdbms/;
mv helowin orcl;
cd orcl/;
rm -rf helowin;
#8.修改$ORACLE_BASE/flash_recovery_area目录下的目录和文件内容
cd $ORACLE_BASE/flash_recovery_area;
mv helowin orcl;
mv HELOWIN ORCL;
#删除控制文件
rm -rf control02.ctl;
#9.修改$ORACLE_BASE/oradata目录下的目录和文件
cd $ORACLE_BASE/oradata;
mv helowin orcl;
cd orcl/;
rm -rf control01.ctl;
#10.修改监听的配置文件tnsnames.ora
cd $ORACLE_HOME/network/admin;
vi tnsnames.ora;
#将所有的HELOWIN修改为ORCL
LISTENER_ORCL =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
# 11.调用前面步骤修改好的orcl.sql,生成链接控制文件
cd $ORACLE_BASE/diag/rdbms/orcl/orcl/trace;
#查看文件的绝对路径,为执行sql做准备
pwd;
/home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace;
#连接数据库
sqlplus / as sysdba;
#执行修改好的sql,生成连接控制文件
@/home/oracle/app/oracle/diag/rdbms/orcl/orcl/trace/orcl.sql;
#查看数据库运行状态 read_write为可读写模式 READ WRITE
select open_mode from v$database;
#查看name 参数
show parameter name;
#查看实例名是否已经修改为orcl
select name from v$database;
#关闭数据库
shutdown immediate;
startup;
#退出数据库连接,开启sql监听,再去远程连接数据库即可(如果输出:TNS-01106: Listener using listener name LISTENER has already been started代表已经开启了监听)
exit;
lsnrctl start;
参考原文地址: