安装Docker Oracle 11g镜像

硬件配置: 1台CentOS 8服务器

安装

在服务器上安装SSH Server,客户机SSH登录到服务器上后,安装Docker。拉取Oracle 11g的配置镜像, 仓库地址

从Oracle官网下下载11g版本的安装包,下载页,下载

  • linux.x64_11gR2_database_1of2.zip
  • linux.x64_11gR2_database_2of2.zip

两个压缩包。按顺序解压到用户目录下

1
2
3
4
cd ~
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
# should have directory ~/database

产生database/文件夹。

指定

  • install_folder包含database的目录,如/home/user
  • local_dpdump为包含恢复文件的目录

运行

1
docker run --privileged --name oracle11g -p 1521:1521 -v <install_folder>:/install -v <local_dpdump>:/opt/oracle/dpdump jaspeen/oracle-11g

jaspeen/oracle-11g镜像启动一个容器,安装一份Oracle数据库到容器中。安装过程需要需要一定时间,安装无误之后,数据库会自行启动。

最好保存此时的容器状态(安装数据库之后的容器)作为一个新的Image,方便以后如果要重新创建数据库时,可以直接从此镜像创建容器,不需要再次等待安装,oracle-installed镜像大小约为6G。

docker commit oracle11g oracle11g-installed

进入容器中,用sqlplus登录数据库配置用户和创建新的Service,

1
2
3
4
5
6
docker exec -it oracle11g /bin/bash
su - oracle
sqlplus / as sysdba
CREATER user <username> identified by <password>;
# 赋予用户DBA权限
GRANT DBA TO <username>;

创建名称为’xl’的Service之后,启动Service

1
2
3
4
5
6
BEGIN
DBMS_SERVICE.start_service(
service_name => 'xl'
);
END;
/

恢复备份

恢复备份文件到容器数据库

1
imp <username>/<password>@127.0.0.1/xl file=/opt/oracle/dpdump/20211223.dmp full=y

恢复过程中出现了问题:中文会显示乱码,VARCHAR类型字段显示长度超限。原因是数据库的字符集和备份文件的字符集不符合,需要修改数据库字符集为GBK。

这里不推荐使用GBK字符集,Linux Oracle默认的AL32UTF8 UTF-8字符集即可,可以正常显示多国文字。遇到GBK字符集多数 情况下,是因为备份文件是在一台安装了简体中文的系统的Windows机器上生成。

1
select * from nls_database_parameters;

确认NLS_CHARACTERSET的值,如果不是ZHS16GBK,则修改为ZHS16GBK

Log in to database as DBA

1
2
3
4
5
6
7
8
9
SHUTDOWN IMMEDIATE;

STARTUP RESTRICT;

ALTER DATABASE CHARACTER SET INTERNAL_USE ZHS16GBK;

ALTER SYSTEM DISABLE RESTRICTED SESSION;

select value from NLS_DATABASE_PARAMETERS where PARAMETER = 'NLS_CHARACTERSET';

参考

重启数据库容器

1
docker restart oracle11g

注意重启后xl Service不会自动启动,需要sqlplus登录数据库手动启动。

重置用户数据

如果.dmp文件恢复中失败,往数据库中写入了不正确的数据,那么我们希望在下次导入前数据库再次清空。遗憾的是Oracle 11g并没有提供清除用户下的全部对象功能。最方便的办法是删除用户然后重新创建。

1
DROP USER <username> CASCADE;

提供CASCADE参数以删除该用户Schema下的全部对象,如果该用户有未关闭的Session,DROP是无法成功的,docker restart oracle11g重启数据库即可断开全部连接。