文章目录
介绍
刚开始使用的Oracle
的时候,是公司提供的win10
安装包,版本是11gr2
。使用一年后,会变的卡顿,而且安装目大小也比较大,重新安装还让人望而却步(这才是让人头疼的地方)。所以才有了使用docker
进行安装的想法,再加上开发中需要的其他软件——如redis
等——也可以考虑使用docker
进行安装,关键是简单,就算有问题,重新安装也方便,只是一句命令的事情。
开始在dockerhub
上找的时候,好多镜像是不能用的。相对来说,国内阿里云上有一个镜像(度娘基本就是这个,不断的转载),但是试着运行了一个实例,运行都是问题。想解决,也没用找到什么太好的办法,所以就继续在dockerhub
上寻找可以的镜像文件。最终我找到了jonemark/oracle11gr2:11.2.0.4
——这个文件有8G多,小的基本都用不了。简单的运行容器实例后,等待一会让其自动初始化,使用PLSQL Developer
管理工具或者Navicat for Oracle
管理工具都可以直接连接上Oracle
容器的默认实例,完美。
Oracle镜像默认设置
Oracle
镜像运行容器后默认的访问配置如下:
- hostname: localhost
- port: 1521
- sid: EE
- service name: EE.oracle.docker
- username: system
- password: oracle
具体实现
运行Orcale容器实例
通过以下命令进行Oracle
容器的创建。
docker run -d -p 8080:8080 -p 1521:1521 --restart always --privileged=true --name myoracle -v E:/Docker/Volume/oracle:/u01/app/oracle jonemark/oracle11gr2:11.2.0.4
简单的解释以下:
- 8080端口:镜像中默认带的,是可以通过网页访问并的登录使用的。具体登录密码忘记了,本来是可以通过dockerhub官网访问查看的,但是其对国内有限制。(有条件的可通过官网查看)
- 1521端口:
Oracle
的默认访问端口,宿主机可随便定义端口和其进行映射 - 数据卷:这里的
E:/Docker/Volume/oracle
是我们本地定义的目录,以将容器的Oracle
目录映射出来,这个后面有用的 - 初始化容器:这个需要一些时间,具体看看你电脑的配置,可以查看容器运行日志了解
PLSQL Developer管理工具的连接配置
我使用的PLSQL Developer
版本是PLSQL Developer11.0.5_64bit
绿色版,无需安装,解压后可点击文件夹下的plsqldev.exe
文件直接打开使用。第一次打开的时候,估计会有一些提示/报错,忽略并不登录打开,因为第一次打开,我们是需要进行一些配置的。
如上图,点击菜单【工具】=>【首选项】即可打开。其中“Oracle主目录(自动检测为空)”下填入上面生成容器中的宿主的目录,这里是“E:/Docker/Volume/oracle
”。
接下来我们需要填写“OCI库(自动检测为空)”,要填写这个库,我们需要下载两个文件夹,分别是instantclient-basic-windows.x64-21.9.0.0.0dbru.zip和instantclient-sqlplus-windows.x64-21.9.0.0.0dbru.zip。第一个压缩文件中包含oci.dll
的文件夹,可以直接解压到PLSQL Developer
的文件夹下;而第二个压缩文件中包含sqlplus
的相关文件,将其解压后复制到instantclient
的文件夹下即可。当这两个内容填写完毕后,确定后重启软件即可登录了。
Navicat for Oracle管理工具的连接配置
和上面的PLSQL Developer
管理工具差不多,第一次打开都是要配置的,然后才可以使用。通过点击菜单【工具】=>【选项】可以打开如下界面。
可以看到,在我下载的Navicat for Oracle
文件夹下就有instantclient
文件夹,所以直接选择保存即可。之后重新打开,创建【连接】,即可打开。
如何创建自己的Oracle服务实例
首先说明,这里介绍的创建Oracle
服务实例,是通过执行数据库脚本来统一创建的(即用户、角色、权限、表和初始化数据等等)。如果是想要手动一点点的创建,可以通过上面的两个工具,选择一个喜欢的在界面中创建。具体的步骤这里就不细说了,不知道可以度娘。
文本默认你已经准好了创建所需要的sql
脚本,本文所需的文件都放在db_install
文件夹下。
1、通过docker exec
命令进到容器内部。
docker exec -it myoracle bash
2、为了每次重启此Oracle
容器后不会出错,需要执行以下命令
cp /u01/app/oracle/admin/EE/pfile/init.ora /u01/app/oracle/product/11.2.0/EE/dbs/initEE.ora
3、将我们准备好的脚本文件夹,即db_install
拷贝到数据卷文件夹下,这里是E:/Docker/Volume/oracle
。这样在容器内部的路径就是/u01/app/oracle/db_install
。
同样的,执行脚本的入口文件也需要调整,因为在window
下和linux
下执行时,其路径是不同的。
简单解释:
-
变量SysPath的路径是
/u01/app/oracle/db_install
,而如果是window
系统下,可能是C:/db_install
-
变量SystemConn是
Oracle
镜像提供的默认用户和密码,在上面的“Oracle镜像默认设置”部分已经有过介绍 -
变量DestUser是最终创建的数据库的连接字符串,其中
testuser
是用户名,123
是密码,而@
符号后面的是变量的引用,即数据库的名称
4、最后只需要在容器中执行以下命令,即可完成数据库自动的创建工作。
# 如果已经在此目录下,可不执行此句
cd /u01/app/oracle/db_install
# 最终脚本的执行命令
sqlplus /nolog @./install.sql
关于初始化数据中文乱码的解决方案
如果你在创建数据库和相关表的脚本中,加入了数据的初始化脚本,那么就有可能存在插入的中文数据乱码的问题。经过一段时间的摸索,现有一个简单的解决方案。
注意:我使用的vs code编写及修改的脚本,所以此解决方案相关编码的表述以此为参考。
1、插入数据的脚本文件,默认一般采用的是UTF8
的编码格式,所以只有在此格式下的中文不是乱码,那么导入数据库的内容就不会乱码。如果需要转到GBK
格式下,中文才正常显示,那么需要调整一下。
提示:可以在
GBK
格式下,中文正常显示的时候复制全文内容,然后转到UTF8
格式下粘贴,这样就可以快速的在UTF8
格式下正常显示中文了。
2、在上面的步骤3中,进入容器内部并进入/u01/app/oracle/db_install
目录后,执行以下命令(也可进入容器就执行此命令)。
# 定义环境变量,此变量内容为Oracle服务端默认的编码格式
export NLS_LANG="AMERICAN_AMERICA.AL32UTF8"
# 打印命令,查看是否设置正确
echo $NLS_LANG
在执行此操作之前,确保本机系统的环境变量中添加了’NLS_LANG’环境变量,值为:‘AMERICAN_AMERICA.AL32UTF8’。
通过上面的命令后,正常按上面的步骤4执行即可。
通过bat脚本管理Oracle实例的创建及配置
本节即把上面需要手动完成的步骤,通过bat
脚本的形式,一键完成。也可以通过此文了解批处理的相关知识。
1、定义一些变量,如容器名称,端口号等等。同时可以考虑定义数据卷路径变量,并且如果此路径不存在,则通过脚本创建此目录。
:: Custom variable
set OracleContainerName=mbm-oracle
set OracleOutPort=1521
set OracleOutWebPort=8080
set IntiMinute=5
set /a IntiSecond= %IntiMinute% * 60
:: run bat file passing param
set IsPause=%1
set VolumeFolder=%2
:: if no param passed, set default path
if "%VolumeFolder%"=="" set VolumeFolder=D:\Docker\Volume\
set OracleVolumeFolder=%VolumeFolder%%OracleContainerName%
:: create folder if not exist
if exist "%OracleVolumeFolder%" (
echo "%OracleVolumeFolder%" Folder already exists.
) else (
mkdir "%OracleVolumeFolder%"
echo "%OracleVolumeFolder%" Folder created successfully.
)
注意:上面代码中,变量后使用
%1,%2
,表示此变量是调用此bat
文件时传递的参数,同时可以设置默认值。
2、将db_install
文件夹拷贝到定义的数据卷目录下。
xcopy .\db_install\*.* %OracleVolumeFolder%\db_install\*.* /S
3、运行命令,创建Oracle
容器实例。
:: run container
docker run -d -p %OracleOutWebPort%:8080 -p %OracleOutPort%:1521 --restart always --privileged=true --name %OracleContainerName% -v %OracleVolumeFolder%:/u01/app/oracle jonemark/oracle11gr2:11.2.0.4
4、执行等待指定时间的命令,让容器完成Oracle
服务的初始化工作。
timeout /t %IntiSecond% >nul
5、创建bat
脚本文件,将执行数据库创建的脚本配置都放入此文件中。
:: call oracle config
docker exec -it mbm-oracle bash -c "cp /u01/app/oracle/admin/EE/pfile/init.ora /u01/app/oracle/product/11.2.0/EE/dbs/initEE.ora&&export NLS_LANG='AMERICAN_AMERICA.AL32UTF8'&&echo $NLS_LANG&&cd /u01/app/oracle/&&cd ./db_install&&sqlplus /nolog @./install.sql"
将上面的文件命名为BuildOracleConfig.bat
。然后执行在等待时间解释后,执行此文件即可。
call .\BuildOracleConfig.bat
6、完成的容器创建脚本如下。
@echo off
:: Custom variable
set OracleContainerName=mbm-oracle
set OracleOutPort=1521
set OracleOutWebPort=8080
set IntiMinute=5
set /a IntiSecond= %IntiMinute% * 60
:: run bat file passing param
set IsPause=%1
set VolumeFolder=%2
:: if no param passed, it value default path
if "%VolumeFolder%"=="" set VolumeFolder=D:\Docker\Volume\
set OracleVolumeFolder=%VolumeFolder%%OracleContainerName%
:: create folder if not exist
if exist "%OracleVolumeFolder%" (
echo "%OracleVolumeFolder%" Folder already exists.
) else (
mkdir "%OracleVolumeFolder%"
echo "%OracleVolumeFolder%" Folder created successfully.
)
echo start copy db_install folder to container.
xcopy .\db_install\*.* %OracleVolumeFolder%\db_install\*.* /S
echo start run oracle container instance.
:: run container
docker run -d -p %OracleOutWebPort%:8080 -p %OracleOutPort%:1521 --restart always --privileged=true --name %OracleContainerName% -v %OracleVolumeFolder%:/u01/app/oracle jonemark/oracle11gr2:11.2.0.4
echo please waiting %IntiMinute% minute for initial oracle instance.
:: waitign five minute
timeout /t %IntiSecond% >nul
call .\BuildOracleConfig.bat
:: if no param passed, it value default 2
if "%IsPause%"=="" set IsPause=2
if %IsPause%==1 (
echo finish run file 'BuildOracle.bat'.
) else (
echo all command is runned.
pause
)
而对于此脚本文件的调用,我们可以通过cmd
或者powshell
打开控制台,然后使用以下命令调用。
.\BuildOracle.bat 1 D:\temp
# 或者以下命令,将使用文件中的默认值来执行脚本文件
.\BuildOracle.bat
总结
Oracle
容器化基本就介绍完毕了,不仅介绍了手动创建Orcale容器化的方式,也介绍了两种常用的编辑软件;最后还介绍了如何通过脚本自动化的完成容器实例化及数据库的创建工作。通过此文既是一种对自己平时工作、学习的总结,也希望对别人有所帮助吧。