前面我们用docker搭了一个oracle服务,
但是突然间想到了一个问题,如果把容器删除了,那新建的表空间,用户,表,等等的信息就一并消失了,我这里只是刚刚搭建,完全可以推倒重来,但是如多已经是在线跑了好久的数据库来说,简直是灾难啊,因为你的数据都随着容器的消失而消失.
虽然运行中的容器也可以进行动态进行关联volume,但是个人目前还没掌握,所以有需要的可以自行搜索
启动容器时,通过docker的volume使宿主机的目录与容器的目录进行关联.
sudo mkdir -p -m 755 db/oracle
这里需要注意的是,创建之后需要将目录及其子文件的uid
及gid
改为docker容器中的安装oracle的用户的uid及
gid`否则关联后,在容器中是所属与root的.
sudo chown -R 440:200 db/oracle
将容器中,/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)
;
# 退出oracle用户
exit
# 退出容器
exit
# 关闭容器
sudo docker stop oracle11g
sudo docker rm oracle11g
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的目录,admin
,oradata
等的父目录
sudo docker run --rm -d --privileged --name oracle11g -p 1521:1521 \
-v /home/shuu/db/oracle/app:/opt/oracle/app/ shuu/oracle11g
# 交互终端模式进入容器
sudo docker exec -it oracle11g /bin/bash
# 切换至oracle用户
su - oracle
# 以scott用户连接
sqlplus scott/tiger;
# 设置行长度数值看个人
set line 300;
# 查询emp表
select * from emp;
如上所示,scott用户是解锁状态,emp表中新添加的数据仍然存在,姑且算是成功.
由于/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
脚本中的方法,其实,早在Dockerfile
的build
阶段就已经将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
}
sudo mkdir -p -m 755 db/oracle/app
这里需要注意的是,创建之后需要将目录及其子文件的uid
及gid
改为docker容器中的安装oracle的用户的uid及
gid`否则关联后,在容器中的owner和group都是root的,权限会有问题.
sudo chown -R 440:200 db/oracle/app
由于上面进行过容器内文件夹的拷贝,所以这里我先将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
# 容器创建成功后进入容器
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并不被打包进镜像文件.
# 停止容器,由于启动时指定了--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远程连接下试试.
ok,大功告成.
由于上边的操作,宿主机已经与容器有了共享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/
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);
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>;
需要退出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;