CentOS7.x docker安装Oracle11g并使用navicat连接

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

CentOS7.x docker安装Oracle11g并使用navicat连接_第1张图片

 9.2 会提示如下错误,是因为oracle的客户端不对

CentOS7.x docker安装Oracle11g并使用navicat连接_第2张图片

 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

CentOS7.x docker安装Oracle11g并使用navicat连接_第3张图片

         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所以下载了如下两个包

 CentOS7.x docker安装Oracle11g并使用navicat连接_第4张图片

         2.1 如果当时网络有问题下载不了,可以直接从我的博客中下载,地址是: 点击这里下载 ,

我的是已经解压好的,可以直接覆盖到Navicat安装目录的下instantclient_11_2

我的是: D:\Program Files\PremiumSoft\Navicat Premium 15\instantclient_11_2

CentOS7.x docker安装Oracle11g并使用navicat连接_第5张图片

 需要注意的是: 需要将2个压缩包的内容均解压到instantclient_11_2目录下,不能嵌套目录

9.4 设置Navicat

路径为: 工具->选项->环境

CentOS7.x docker安装Oracle11g并使用navicat连接_第6张图片

 1) SQL*Plus项: 选择刚解压到instantclient_11_2目录下的sqlplus.exe

 2)OCI library项: 选择刚解压到instantclient_11_2目录下的oci.dll

点击确定,然后关闭Navicat,再次打开,就可以连接上啦~

CentOS7.x docker安装Oracle11g并使用navicat连接_第7张图片

 10. 参考资料

  参考连接: Docker安装配置oracle详细教程https://www.cnblogs.com/blogof-fusu/p/16327293.html

使用Navicat连接oraclehttps://blog.csdn.net/aoshilang2249/article/details/125356964

 喜欢这篇文章的小伙伴点个赞和关注再走吧(* ̄︶ ̄)

你可能感兴趣的:(docker,运维,oracle,navicat)