1.拉取Oracle11g镜像
#因为国内访问docker官方镜像源速度很慢,所以这里使用阿里的
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
#名字太长,重新打标签
docker tag registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g:latest helowin/oracle_11g
2.启动测试容器用例
2.1 用以获取必要文件,为下面正式启动做文件映射
docker run -d --name test --restart unless-stopped -p 1521:1521 helowin/oracle_11g
2.2 设置目录及授权信息
#假设你Oracle工作目录在/data/oracle
#1. 创建数据目录
mkdir -p /data/oracle
#2. 进入/data/oracle目录
cd /data/oracle/
#3. 将oracle容器中的helowin复制到/data/oracle/目录下
docker cp test:/home/oracle/app/oracle/oradata/helowin/ .
#4. 删除如上启动的容器名称为test的oracle容器
docker rm -f test
#5. 授权
chown -R 500.500 helowin
3.启动容器
docker run -d --name oracle11g --restart=always \
-v /data/oracle/helowin:/home/oracle/app/oracle/oradata/helowin \
-p 1521:1521 helowin/oracle_11g
5.进入容器,新增Oracle环境变量
#1. 以root用户进入容器
docker exec -it -u root oracle11g bash
#2. 在/etc/profile文件最后追加如下内容
vi /etc/profile
------------------------------
# oracle home目录
export ORACLE_HOME=/home/oracle/app/oracle/prouct/11.2.0/dbhome_2
# oracle 服务名或者 SID名,要记住这个名字helowin,它是naivcat或者DBeaver登录的重要选项
export ORACLE_SID=helowin
# oracle环境变量
export PATH=$ORACLE_HOME/bin:$PATH
----------------------------------
#3. 刷新环境变量
source /etc/profile
#4. 创建软连接
ln -s $ORACLE_HOME/bin/sqlplus /usr/bin
6. 切换到oracle用户并修改超管密码
#1. 切换为oracle用户
su - oracle
#2. 使用sqlplus无密码登陆
sqlplus /nolog
#3. 连接到sysdba用户
conn /as sysdba
#4. 修改system用户账号密码;
alter user system identified by system;
#5. 修改sys用户账号密码;
alter user sys identified by system;
#6. 创建内部管理员账号密码;
create user test identified by test;
#7. 为新创建的test授权
grant connect,resource,dba to test;
#8. 修改密码规则策略为密码永不过期;(会出现坑,后面讲解)
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
#9. 修改数据库最大连接数
alter system set processes=1000 scope=spfile;
注意: 如果执行如上某些命令报错: ORA-01109: database not open 需要执行如下指令:
并且依旧需要保持如下操作是oracle用户
#1. 移除原默认配置文件
rm -rf /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl
#2. 将同目录下的control01.ctl复制为control02.ctl
cp /home/oracle/app/oracle/oradata/helowin/control01.ctl /home/oracle/app/oracle/flash_recovery_area/helowin/control02.ctl
#3. 以 dba 身份无密码连接 oracle 数据库
sqlplus / as sysdba
#4. 关闭数据库实例(这里会报错,不用管)
shutdown immediate
#5. 启动数据库实例
startup
7. 启动mount数据库并设置字符集
#1. 使用sqlplus 无密码登陆sysdba
sqlplus / as sysdba (要注意,这个地方/和as中间有个空格)
#注意:如下步骤2-9 所有命令都在登陆sysdba之后执行: SQL>xxx
#-------------------------------------------------------
#2. 关闭数据库
shutdown immediate;
#3. 调整字符集
#3.1启动数据库mount
startup mount
#3.2 按顺序执行如下操作
ALTER SYSTEM ENABLE RESTRICTED SESSION;
ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
ALTER SYSTEM SET AQ_TM_PROCESSES=0;
#4. 设置开启数据库
alter database open;
#5. 修改数据库字符集
#5.1 执行此步骤可能会报错,如此需要执行5.2操作,强制执行
ALTER DATABASE CHARACTER SET ZHS16GBK;
#5.2 强制执行设置字符集
ALTER DATABASE character set INTERNAL_USE ZHS16GBK;
#6. 关闭数据库
shutdown immediate;
7. 启动数据库
startup;
#8. 查询字符集(就可以看到已经将字符集设置为ZHS16GBK了)
select userenv ('language') from dual;
#9. 退出plsql
exit
#-------------------------------------------------------
8. 注意事项
1. listener.ora和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/listener.ora
2. 如果外部需要访问该oracle需要将上面两个文件中的localhost改为主机名或者为空
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
2.1 .方法一,设置主机名
查询容器中主机名:
#1. 输入hostname查询主机名,通常就是容器的ID
hostname
#2. 容器会自动在/etc/hosts中追加一行 192.168.xx.xx 容器ID的映射,例如如下
192.168.xx.xx 9879a88ff262
设置之后的地址为:
(ADDRESS = (PROTOCOL = TCP)(HOST = 9879a88ff262)(PORT = 1521))
2.2 方法二,设置空
(ADDRESS = (PROTOCOL = TCP)(HOST = )(PORT = 1521))
2.3 较新版本的镜像中该值均为空,可以直接连接无需此设置
3. 每次如果修改了 tnsnames.ora 或者 listener.ora 这两个文件,都需要执行如下操作,可以解决90%连接方面的问题
#1. 如果在oracle容器中,需要退出容器
exit
#2. 重启docker服务
systemctl restart docker
#3. 如果oracle没有设置restart=always,则需要手动启动,如果设置了就跳过这一步
docker start oracle11g(这是oracle容器的name,我的是oracle11g)
#4. 以bash方式并使用root用户进入容器操作系统
docker exec -it -u root oracle11g bash
#5. 切换到oracle账户横杠"-"的前后都有空格
su - oracle
#6. 登陆数据库,可以看到后面的操作都是如此: SQL> xxx
sqlplus / as sysdba
#7. 强制重新注册实例
SQL>alter system register;
#8. 退出数据库(如果是从root切换到oracle的,则需要输入两次quit,第一次是退出sqlplus应用,第二次是退出oracle用户)
SQL>quit
#9. 在容器中重启监听
lsnrctl reload
#10. 查看监听服务状态
lsnrctl status
9. 使用Navicat连接oracle11g数据库
9.1 新建oracle连接,并填写服务信息
注意: 这里的服务名必须是操作步骤5 所设置的ORACLE_SID=helowin
9.2 会提示如下错误,是因为oracle的客户端不对
9.3 解决方案如下
1. 查询安装的oracle大版本号是多少
#1. 以root用户进入oracle容器
docker exec -it -u root oracle11g bash
#1.1 切换到oracle用户
su - oracle
#2.使用sqlplus登陆sysdba
sqlplus / as sysdba
#3. 执行sql查询oracle版本
select * from v$version
执行sql后,结果如下,只需要看前面的大版本号,比如如下大版本号为: 11.2
2. 到Instant Client for Windows x64(<--可点击)地址去下载对应客户端包,一共有2个包需要下载,连接分别是:
Instant Client Package - Basichttps://download.oracle.com/otn/nt/instantclient/11204/instantclient-basic-windows.x64-11.2.0.4.0.zip,Instant Client Package - SQL*Plushttps://download.oracle.com/otn/nt/instantclient/11204/instantclient-sqlplus-windows.x64-11.2.0.4.0.zip
我的是11.2所以下载了如下两个包
2.1 如果当时网络有问题下载不了,可以直接从我的博客中下载,地址是: 点击这里下载 ,
我的是已经解压好的,可以直接覆盖到Navicat安装目录的下instantclient_11_2
我的是: D:\Program Files\PremiumSoft\Navicat Premium 15\instantclient_11_2
需要注意的是: 需要将2个压缩包的内容均解压到instantclient_11_2目录下,不能嵌套目录
9.4 设置Navicat
路径为: 工具->选项->环境
1) SQL*Plus项: 选择刚解压到instantclient_11_2目录下的sqlplus.exe
2)OCI library项: 选择刚解压到instantclient_11_2目录下的oci.dll
点击确定,然后关闭Navicat,再次打开,就可以连接上啦~
10. 参考资料
参考连接: Docker安装配置oracle详细教程https://www.cnblogs.com/blogof-fusu/p/16327293.html
使用Navicat连接oraclehttps://blog.csdn.net/aoshilang2249/article/details/125356964
喜欢这篇文章的小伙伴点个赞和关注再走吧(* ̄︶ ̄)