docker安装oracle

背景

公司用的数据库是oracle,家里装的是mysql,start with递归查询的sql只能用oracle处理,所以需要再装一个oracle,docker肯定是最方便的。

环境信息

docker-compose

为了方便这里用docker-compose。考虑用sudo -i切到root用户会方便很多

参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
version: "3"
services:
oracle_db:
image: wnameless/oracle-xe-11g-r2
ports:
- 15210:1521
environment:
- ORACLE_SID=ORCLCDB
- ORACLE_PDB=ORCLPDB1
volumes:
# 这里用命名卷不要用挂载点
- oracle_vol:/u01/app/oracle

volumes:
oracle_vol:

一些解释

  1. 把端口重新映射到15210是为了减少一些密码爆破

  2. 这里只能用命名卷进行挂载,挂载点会报错

可能的报错

cp: cannot stat ‘/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora.tmpl’: No such file or directory

docker主要有两种挂载方式,命名卷和挂载点,内部实现不同,如果是这个报错说明你可能是用的挂载点这种卷使用方式,改成上面yml里的命名卷就行。根因的话,需要深入研究两种挂载方式的实现原理。

连接说明

  1. database(serviceName)是XE
  2. 初始用户名密码是system/oracle

修改密码

参考

初始用户名密码是system/oracle,最好是需要改一下的。另密码貌似只能字母数字,常用的特殊字符都不行,解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 找到oracle镜像id
docker ps

# 进入镜像
docker exec -it 镜像id bash

# 切换用户
su - oracle

# 连接
sqlplus /nolog

# 用户名密码
connect system/oracle as sysdba

# 修改system用户密码为123456,注意这是sql有;号
alter user system identified by 123456;

# sys用户也要改一下密码
# connect sys/oracle as sysdba
alter user sys identified by 123456;

# 退出
quit

数据备份与恢复

备份

  1. 这里要备份的docker卷一般在/var/lib/docker/volumes/目录下,而且卷名称可能和你在yml里命名不一样,可以看下日志看看具体名称,需要自己判别一下。
  2. 备份的时候容器需要关掉
  3. 如果cpu很烂就仅打包不压缩
  4. docker volume相关命令可以看卷信息
1
2
3
4
5
# 打包并压缩
tar cvzf /path/on/host/backup/oracle_vol_backup.tar.gz -C /path/to/your/docker/volume/target/_data .

# 或者只打包,如果cpu很烂的话
tar cvf /path/on/host/backup/oracle_vol_backup.tar -C /var/lib/docker/volumes/oracle_oracle_vol/_data .

恢复

  1. 运行相同的compose配置文件
  2. 将备份文件解压覆盖新的卷
1
2
3
4
5
# 解包解压缩
tar xvzf /path/on/host/backup/oracle_vol_backup.tar.gz -C /path/to/your/docker/volume/target/_data

# 或仅解包
tar xvf /path/on/host/backup/oracle_vol_backup.tar -C /var/lib/docker/volumes/oracle_oracle_vol/_data