1.拉取oracle 11g 的镜像:
用root登陆服务器,输入下面的命令,拉取oracle 11g的镜像,有点大,6.8G多;
docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g #注意,这个镜像的底层操作系统版本是centos6.5
2. 镜像下载完成后,创建容器:
*在创建容器之前首先要在服务器或者虚拟机上创建一个data_temp的目录(当然这个名字可以随便取,看个人喜好),并且赋予可读写权限,为了下面运行容器做映射:
mkdir /usr/local/data_temp chown -R 500.500 /usr/local/data_temp
创建一个文件目录,用于挂载到容器内,做oracle数据备份时数据存放的位置,保证备份数据不丢失。并将文件的权限给到 500.500 这个是在容器内的oracle用户的sid。不用管,后面会用到
docker run -d --name oracle_11g -p 1521:1521 -v /usr/local/data_temp:/home/oracle/data_temp registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g
其中,oracle_11g是名称,-p是端口映射,-v是将宿主机的/usr/local/data_temp 目录映射到容器内的 /home/oracle/data_temp内。
3. 进入容器:
docker ps ## 查看容器的id号,复制一下 docker exec -it xxxxxxxx /bin/bash ## xxxxxxx就是上一部查看的id号
4 . 查看oracle状态,修改system用户密码:
source ~/.bash_profile ## 加载一下用户环境变量,进入容器后,自动是oracle用户
sqlplus /nolog ## 使用sqlplus 工具,进去命令行
SQL> connect /as sysdba ## 使用sysdba 连接oracle,最大权限,os认证,只能在本机上登陆使用。
SQL> select status from v$instance; ## 查看oracle现在的状态 ,状态为 OPEN 则正常,表示已开启状态。 SQL> alter user system identified by oracle; ## 修改用户 system 的密码为 oracle ,可以自定义
5. 修改oracle数据库编码为 中国编码(常用编码)。 默认的是美国的UTF8编码(一般不修改):
SQL> select * from nls_database_parameters where parameter ='NLS_CHARACTERSET'; ## 查看数据库编码,结果最下面一行则是目前编码 SQL> shutdown immediate; ## 关闭数据库 SQL> startup mount; ## 启动到 mount状态,oracle分为4个状态,详情请百度 SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION; ## 设置session ,下同 SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0; SQL> alter database open; ## 打开oracle到 open状态 SQL> ALTER DATABASE character set INTERNAL_USE ZHS16GBK; ## 修改编码为 ZHS16GBK SQL> shutdown immediate; ## 重启oracle ,先关闭,再启动 SQL> startup;
6. 创建自定义的 directory ,用于存放备份数据(很重要):
SQL> create or replace directory DATA_TEMP as '/home/oracle/data_temp'; ## 将挂载进来的目录/home/oracle/data_temp创建到oracle的directoy中。
创建之后,导出的数据可以指定导出到这个目录,那么数据可以直接在宿主机上的对应目录中拿到,持久化保存。另外需要导入的数据文件也是直接放到这个目录,在容器中则可以调用impdp命令进行导入;至此,基础的操作配置已完成,你可以重新提交这个容器作为新的镜像以保存修改。
7. 然后就是创建表空间,创建用户,并授权:
创建表空间核用户,这个可以使用工具连接到oracle数据库上进行创建,也可以手动命令行进行创建。注意依然是在sysdba权限下操作,命令如下:
SQL> select name from v$tempfile; ## 查询临时表空间的路径 ## 下面这句,创建表空间,名:tets ,数据文件路径复制临时表空间数据文件路径然后改一下文件名就行了,大小:1G, 自动增长:50M 。 参数根据自己的需求自行修改 SQL> create tablespace test datafile '/home/oracle/app/oracle/oradata/helowin/tets02.dbf' size 1G reuse autoextend on next 50M maxsize unlimited default storage(initial 128k next 128k minextents 2 maxextents unlimited); SQL> select tablespace_name from dba_tablespaces ## 查看所有表空间,看看是否有刚才创建的 SQL> create user test01 identified by testpasswd default tablespace TEST temporary tablespace TEMP; ## 创建用户,test01,密码:testpass,设置默认表空间为刚才创建的 test, 临时表空间设为默认的 TEMP。 SQL> select username from dba_users ## 查看用户名,可以看到是否有刚才我们创建的用户名 SQL> grant connect,dba,exp_full_database,imp_full_database to test01 with admin option; ## 授权用户 test01,拥有连接,管理员,导入,导出权限,并可以传递权限。(根据需求自己定义权限)
8. 导入数据,导出数据:
还记得之前自定义的directory文件目录吗?第6步中设置的。 只需要将需要导入的数据文件,放入这个目录。就可以使用 impdp命令导入数据了。用expdp命令导出的数据,也可以设置放在此文件目录中,由于这个目录是最初从宿主机上挂载来的,所以,这些导入导出的数据,将不会随容器关闭而丢失,可以持久化保存数据。
导出命令如下,注意这里操作的时候要退出sqlplus,回到oracle用户下操作:
## 导入数据,登陆用户为刚才创建的用户,实例为镜像的实例helowin,数据文件为第6步创建的DATA_TEMP,导入文件为BPM.EXPDP,用户为test01到test01,这些需要自行修改,导入的用户和当时导出的用户最好保持一直。
impdp test01/testpasswd@helowin table_exists_action=replace directory=DATA_TEMP dumpfile=BPM.EXPDP logfile=BPM_20180124.log REMAP_SCHEMA=test01:test01 schemas=test01
## 导出数据,导出文件名为:BPM.EXPDP, 路径为: DATA_TEMP, 用户为test01 expdp test01/testpasswd@helowin dumpfile=BPM.EXPDP directory=DATA_TEMP schemas=test01 reuse_dumpfiles=y version=11.2.0.1.0
9. 了解了导入导出后,就可以写一个简单的导出数据的脚本,设置定时任务,作为数据备份。
简单的备份数据的脚本如下:
#! /usr/bin/python import datetime import os import re back_dir = '/home/oracle/data_temp' today = datetime.datetime.today().strftime('%Y-%m-%d') command = 'source /home/oracle/.bash_profile && expdp bpm/bpm@helowin dumpfile=bb pmxk_%s.expdp directory=DATA_TEMP schemas=bpm reuse_dumpfiles=y version=11.2.0.11 .0' %today os.system(command) dirlist = os.listdir(back_dir) for dirname in dirlist: if 'bpmxk' in dirname: time1 = re.findall('bpmxk_(.*?).expdp',dirname)[0] time2 = datetime.datetime.strptime(time1,'%Y-%m-%d') time_diff = datetime.datetime.today() - time2 if time_diff.days > 20: os.remove(back_dir+'\\'+dirname)
然后设置定时任务,进入root账号操作,此镜像的root密码为:helowin。
vi /etc/crontab ## 编辑定时任务配置文件,添加下面一行 * 3 * * * root /home/oracle/oracle_backup.sh ## 每天凌晨3点自行备份脚本 chmod 777 /home/oracle/oracle_backup.sh ## 给备份脚本可执行授权 service crond start ## 启动crond服务,默认是没有启动的。
OK。到此。便全部完成了。此只是做了一个简单的备份,如何需要将所有数据文件都持久化,就需要在创建容器的时候,挂载一个存放表空间数据文件的目录到容器内,然后在创建表空间的时候,再创建一个临时表空间,将数据文件都放入挂载的目录。这样存放的数据文件就能可以持久化了。避免数据的丢失。
如果有什么写错的,或者不明白的地方,欢迎指正