Oracle 备份与恢复 (Docker部署版)

Oracle 备份与恢复 (Docker部署版)

一,宿主机设置定时备份脚本

1.检查Oracle容器是否正常运行

docker ps

image-20220817181211418

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

image-20220817171313544

#如果没有就执行安装命令
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

image-20220817173156272

#如果没有authorized_keys就新建一个
touch authorized_keys

切换到目标服务器,同样如果没有.ssh目录就执行ssh-keygen -t rsa,然后进入.ssh目录

#查询密钥
cat id_rsa.pub

image-20220817181308297

然后复制此处查询出的密钥,继续回到安装Oracle的服务器

#编辑authorized_keys,把刚才的密钥复制进去,然后保存
vi authorized_keys

回到目标服务器测试能否远程登录

ssh root@<Oracle服务器Ip>

image-20220817181355415

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 

image-20220817181454151

#创建表空间
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
posted @ 2022-08-17 18:17  山有扶苏QWQ  阅读(1436)  评论(7编辑  收藏  举报