docker搭建oracle服务持久化数据

1. 抛出问题

前面我们用docker搭了一个oracle服务,
但是突然间想到了一个问题,如果把容器删除了,那新建的表空间,用户,表,等等的信息就一并消失了,我这里只是刚刚搭建,完全可以推倒重来,但是如多已经是在线跑了好久的数据库来说,简直是灾难啊,因为你的数据都随着容器的消失而消失.

2. 解决方法

虽然运行中的容器也可以进行动态进行关联volume,但是个人目前还没掌握,所以有需要的可以自行搜索
启动容器时,通过docker的volume使宿主机的目录与容器的目录进行关联.

1)创建本地目录

sudo mkdir -p -m 755 db/oracle

这里需要注意的是,创建之后需要将目录及其子文件的uidgid改为docker容器中的安装oracle的用户的uid及gid`否则关联后,在容器中是所属与root的.

sudo chown -R 440:200 db/oracle

2)拷贝数据库文件

将容器中,/opt/oracle/app目录拷贝到上面创建的目录中.

# linux命令下
sudo docker cp oracle11g:/opt/oracle/app /home/shuu/db/oracle/

文件很大5.4G,我这里还只是一个新的环境,拷贝之前请断开所有与数据库的连接.
在这里插入图片描述
在关掉容器之前我还特意解锁了scott用户,并且在emp表中添加了数据.

alter user scott account unlock;
alter user scott identified by tiger;
INSERT INTO SCOTT.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES 
(1,'test','CLERK',666,TIMESTAMP '1982-01-23 00:00:00.000000',66,6,10)
;

docker搭建oracle服务持久化数据_第1张图片

3)退出,关闭,并删除容器

# 退出oracle用户
exit
# 退出容器
exit
# 关闭容器
sudo docker stop oracle11g
sudo docker rm oracle11g

4)启动容器,并进行volume关联

docker run --rm -d --privileged --name <NAME> -p 1521:1521 -v <local_folder>:/<docker_folder> \
<image>

local_folder:
/home/shuu/db/oracle/app
docker_folder :
/opt/oracle/app
docker容器中oracle的目录,adminoradata等的父目录

docker搭建oracle服务持久化数据_第2张图片

sudo docker run --rm -d --privileged --name oracle11g -p 1521:1521 \
-v /home/shuu/db/oracle/app:/opt/oracle/app/ shuu/oracle11g

在这里插入图片描述
5)进入容器,观察结果

# 交互终端模式进入容器
sudo docker exec -it oracle11g /bin/bash
# 切换至oracle用户
su - oracle
# 以scott用户连接
sqlplus scott/tiger;
# 设置行长度数值看个人
set line 300;
# 查询emp表
select * from emp;

docker搭建oracle服务持久化数据_第3张图片
如上所示,scott用户是解锁状态,emp表中新添加的数据仍然存在,姑且算是成功.

3. 另一种解决思路(推荐)——在安装oracle时进行volume的关联.

由于/opt/oracle/app/flash_recovery_area文件夹的存在,短期内的数据都应该存在,如果是运行了很久的库了那就不清楚了,所以这里最好还是在我们安装oracle的步骤直接进行关联,这样比较稳妥,具体做法其实很简单

还记得我们由shuu/oracle11g:preinstall镜像到shuu/oracle11g的过程吗?就是下面的命令!

sudo docker run --name oracle11g --privileged -p 1521:1521 -v /home/shuu/install:/install \
shuu/oracle11g:preinstall

这里我们只进行了oracle11g安装文件目录的关联,现在我们要做的就是在本地创建一个目录,然后与容器中的/opt/oracle/app目录进行关联即可.

下面的内容是在/assets/setup.sh脚本中的方法,其实,早在Dockerfilebuild阶段就已经将opt/oracle/app目录在容器中创建好了,所以我们这里再在本地创建一个目录与之关联即可!

users () {
	echo "Configuring users"
	groupadd -g 200 oinstall
	groupadd -g 201 dba
	useradd -u 440 -g oinstall -G dba -d /opt/oracle oracle
	echo "oracle:install" | chpasswd
	echo "root:install" | chpasswd
	sed -i "s/pam_namespace.so/pam_namespace.so\nsession    required     pam_limits.so/g" \
	/etc/pam.d/login
	mkdir -p -m 755 /opt/oracle/app
	mkdir -p -m 755 /opt/oracle/oraInventory
	mkdir -p -m 755 /opt/oracle/dpdump
	chown -R oracle:oinstall /opt/oracle
	cat /assets/profile >> ~oracle/.bash_profile
	cat /assets/profile >> ~oracle/.bashrc
}

1)创建本地目录

sudo mkdir -p -m 755 db/oracle/app

这里需要注意的是,创建之后需要将目录及其子文件的uidgid改为docker容器中的安装oracle的用户的uid及gid`否则关联后,在容器中的owner和group都是root的,权限会有问题.

sudo chown -R 440:200 db/oracle/app

2)启动容器,进行oracle的自动化安装.

由于上面进行过容器内文件夹的拷贝,所以这里我先将db/oracle/app目录清空,磁盘空间有限,之前的安装过oracle的镜像我也删除了.
在这里插入图片描述

sudo docker run --rm --name oracle11g --privileged -p 1521:1521 -v /home/shuu/install:/install \
-v /home/shuu/db/oracle/app:/opt/oracle/app shuu/oracle11g:preinstall

3)制作新的镜像

# 容器创建成功后进入容器
sudo docker exec -it oracle11g /bin/bash
# 切换用户
su - oracle
# 连接数据库
sqlplus system/system

解锁scott用户,向emp表添加数据

alter user scott account unlock;
alter user scott identified by tiger;
INSERT INTO SCOTT.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) VALUES 
(1024,'oracle11g','CLERK',666,TIMESTAMP '1982-01-23 00:00:00.000000',66,6,10)
;

退出容器,并进行镜像制作

# 退出sqlplus
exit
# 落盘 sync * N
sync
sync
sync
...
sudo docker commit -m "oracle11g" oracle11g shuu/oracle11g

在这里插入图片描述
这次的镜像都小了很多,说明volume并不被打包进镜像文件.

4)退出,删除容器,基于新的镜像重新创建,进行验证

# 停止容器,由于启动时指定了--rm会自动删除
sudo docker stop oracle11g
# 查看容器进程
sudo docker ps -a

在这里插入图片描述

# 这一次不需要进行 install 目录的关联
sudo docker run --rm -d --name oracle11g --privileged -p 1521:1521  \
-v /home/shuu/db/oracle/app:/opt/oracle/app shuu/oracle11g

在这里插入图片描述
容器启动成功了,这次我用DBeaver远程连接下试试.
docker搭建oracle服务持久化数据_第4张图片
ok,大功告成.

4. 关于dmp文件的导入

1)目录结构的准备

由于上边的操作,宿主机已经与容器有了共享volume,所以我们可以在volume中创建一个目录,专门用来存放dmp文件.
比如这里我放到了oradata目录下,具体目录结构如下:
#1 宿主机:

/home/shuu/db/oracle/app/oradata/dmps

#2 Docker容器:

/opt/oracle/app/oradata/dmps

记得修改owner和group

sudo chown -R 440:200 /home/shuu/db/oracle/app/oradata/dmps

我们还可以用不同的文件夹来存放表空间的物理文件,比如这里使用与dmps同级的目录tblspaces

mkdir -p -m 755 tblspaces/
chown -R 440:200 tblspaces/

在这里插入图片描述

2)创建表空间和用户

  1. 首先,以dba登录并创建表空间.
CREATE TABLESPACE <tablespace_name>
  DATAFILE '/opt/oracle/app/oradata/tblspaces/.dbf' SIZE 50M
  AUTOEXTEND ON NEXT 150M MAXSIZE UNLIMITED
  DEFAULT STORAGE(INITIAL 50M NEXT 25M
  MINEXTENTS 1 MAXEXTENTS 100 PCTINCREASE 0);
  1. 创建用户并授权
CREATE USER <user_name> IDENTIFIED BY <user_password>
  DEFAULT TABLESPACE <tablespace_name>;
GRANT CONNECT,RESOURCE,IMP_FULL_DATABASE,EXP_FULL_DATABASE,ALL PRIVILEGES TO <user_name>;

3)导入数据

需要退出sqlplus,在shell命令行执行,具体参数根据实际需求来.

imp <user_name>/<user_password> file=/opt/oracle/app/oradata/dmps/<sub_folder>/<dmp_name>.dmp \
log=/opt/oracle/app/oradata/dmps/<sub_folder>/<dmp_name>.log touser=<user_name> \
fromuser=<from_user> commit=y;

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