Oracle 备份与恢复 (Docker部署版)
Oracle 备份与恢复 (Docker部署版)
一,宿主机设置定时备份脚本
1.检查Oracle容器是否正常运行
docker ps
2.进入容器,创建shell脚本
#oracle11g 是容器名
docker exec -it oracle11g bash
#创建数据库dump的目录
mkdir -p /home/oracle/dump/
cd /home/oracle/dump/
#编写脚本并插入如下内容
vi dump.sh
#!/bin/bash
whoami
su - oracle <<!
whoami
cd /home/oracle/dump
exp <用户名>/<密码> owner=<要导出的表格所属的用户名> file=exp_xxx.dmp log=exp_xxx.log buffer=6000000
!
#脚本保存后赋予可执行权限
chmod 777 dump.sh
3.在宿主机创建定时任务执行容器内脚本并拷贝至宿主机
#首先退出制宿主机,然后创建保存目录
mkdir -p /home/oracle/
cd /home/oracle/
#创建shell脚本
vi oracle.sh
#添加如下内容
#!/bin/bash
docker exec -u 0 oracle11g bash -c "cd /home/oracle/;./dump.sh"
docker cp oracle11g:/home/oracle/dump /home/oracle/
备注:bash -c 后面是需要在oracle容器内部执行的指令。分别指,是进入到脚本所在的目录,执行脚本。
4.设置定时任务
#首先查看是否安装crontab
service crond status
#如果没有就执行安装命令
yum install cronie
#启动服务
service crond start
crontab的其他命令
#重启服务
service crond restart
#关闭服务
service crond stop
#重新加载服务
service crond reload
#查看状态
service crond status
确定已经启动crontab后就创建定时任务
#执行后会出现一个可编辑的界面
crontab -e
#末尾添加定时任务指令,可以按需求调整执行时间
30 18 * * 5 bash /home/oracle/oracle.sh
#查看是否设置成功
crontab -l
备注:时间格式如下
f1 f2 f3 f4 f5 program
- 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
- 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
- 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
- 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
- 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,其馀类推
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
例:
周五每天下午 5:00执行脚本
0 17 * * 5 bash /home/oracle/oracle.sh
二,拷贝到目标服务器
1.配置ssh免密
#首先在安装Oracle的服务器上
cd /root/.ssh/
#如果没有该目录则执行
ssh-keygen -t rsa
#然后一直回车,重新进入该目录
cd /root/.ssh/
ll
#如果没有authorized_keys就新建一个
touch authorized_keys
切换到目标服务器,同样如果没有.ssh目录就执行ssh-keygen -t rsa,然后进入.ssh目录
#查询密钥
cat id_rsa.pub
然后复制此处查询出的密钥,继续回到安装Oracle的服务器
#编辑authorized_keys,把刚才的密钥复制进去,然后保存
vi authorized_keys
回到目标服务器测试能否远程登录
ssh root@<Oracle服务器Ip>
2.继续在目标服务器编写定时任务
#新建备份文件夹
mkdir -p /home/oracle/
vi scp.sh
#脚本内添加
#!/bin/bash
scp -r root@<Oracle宿主机IP>:/home/oracle/dump /home/test/oracle/
设置定时任务
crontab -e
#因为Oracle宿主机的备份任务是设置到星期五的晚上六点半,为防止数据库过大,所以scp的任务间隔时间要长一点
30 20 * * 5 bash /home/oracle/scp.sh
#查看是否设置成功
crontab -l
三,数据恢复
1.首先安装Oracle(教程)
2.创建Oracle表空间和用户,导入表结构
#进入安装oracle的服务器
docker exec -it -u root <服务名> bash
#进入容器后切换oracle用户
su - oracle
#进入oracle
sqlplus / as sysdba
#创建表空间
create tablespace <表空间名> 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);
#创建用户并分配表空间
create user <用户名> identified by <密码> default tablespace <表空间名> temporary tablespace TEMP;
#给用户赋权
grant connect,dba,exp_full_database,imp_full_database to <用户名> with admin option;
3.导入流程
首先把备份的数据库文件exp_xxx.dmp上传到新库服务器
#然后拷贝到容器内部
docker cp ./exp_xxx.dmp oracle_11g:/home
#进入oracle容器
docker exec -it oracle_11g bash
# 临时设置环境变量
export ORACLE_HOME=/home/oracle/app/oracle/product/11.2.0/dbhome_2
export ORACLE_SID=helowin
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"
cd ~
#需要根据实际调整账号密码 以及fromuser touser
imp <登录数据库的用户名>/<密码> fromuser=<dmp文件导出表格的所属用户名> touser=<需要导入的用户名> file=/home/exp_xxx.dmp log=imp.log ignore=y
rm -f /home/exp_xxx.dmp