写点什么

使用 Docker 运行 DataX 定时全量备份关键数据表

用户头像
白粥
关注
发布于: 2021 年 05 月 28 日
使用Docker运行DataX定时全量备份关键数据表

业务背景


我们的业务使用的是 Oracle 数据库,目前运维只做了 DG,将数据实时备份了一份。但是在特定情况下还是出现了严重的问题。


场景:数据有一个状态字段:关闭、开启。目前有部分记录是关闭状态,部分记录是开启状态。现在操作员将数据批量关闭,稍后又将数据批量开启,这样就导致之前关闭的数据也被开启,影响了正常的业务运行。


条件一:操作员在短时间内意识到了问题,可以使用 Oracle 的flashback功能,将数据恢复到指定时间点之前。但是该功能限制较多,比如:功能是否开启、恢复时间长短、数据量大小、UNDO_TABLESPACE 空间大小等,都限制了能否恢复。


条件二:操作员在较长时间后意识到了问题,且 flashback 功能不能恢复数据,该怎么办呢?


当然,全量定时备份数据库,或者延时同步数据库都是很好的解决方案,但是所需要的资源也是比较多的,为了实现花小钱办大事的目的,我尝试用 DataX 来解决这个问题。


DataX 简介


DataX 本身作为数据同步框架,将不同数据源的同步抽象为从源头数据源读取数据的 Reader 插件,以及向目标端写入数据的 Writer 插件,理论上 DataX 框架可以支持任意数据源类型的数据同步工作。同时 DataX 插件体系作为一套生态系统, 每接入一套新数据源该新加入的数据源即可实现和现有的数据源互通。


Github:https://github.com/alibaba/DataX


实现思路


  1. DataX 通过OracleReader读取数据库中指定表的数据;

  2. DataX 通过TxtFileReader将数据写入 txt 文档。



因为 DataX 官方推荐配置如下,为了减少生产环境的适配工作,下面我们用 Docker 来构建运行环境。


Docker 构建 DataX 运行环境


首先,我们来构建 Docker 镜像,Dockerfile 如下:


ARG ALPINE_VERS=3.8FROM alpine:${ALPINE_VERS}
ARG JAVA_VERS=8ARG PYTHON_VERS=2# 换成清华源RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories# 安装jdk和pythonRUN apk --no-cache add \ openjdk${JAVA_VERS}-jre \ python${PYTHON_VERS}# 时区(可选)RUN apk --no-cache add tzdata && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone \ && apk del tzdata# 挂载点VOLUME /datax
# 保持容器运行ENTRYPOINT ["tail", "-f", "/dev/null"]
复制代码


然后执行命令构建镜像,片刻即好。

docker build -t bz/datax-wrapper .
复制代码


我们来启动镜像,验证一下环境是否正常。

docker run  -d --name datax -v /your/path/datax:/datax bz/datax-wrapper
复制代码

在这里,我们挂载了一个本地目录,用来存放 datax 的项目文件,稍后再讲解。我们先来查看一下环境版本。

docker exec -it datax  python -VPython 2.7.15(base)
复制代码


docker exec -it datax  java -versionopenjdk version "1.8.0_275"OpenJDK Runtime Environment (IcedTea 3.17.1) (Alpine 8.275.01-r0)OpenJDK 64-Bit Server VM (build 25.275-b01, mixed mode)(base)
复制代码


Docker 运行 DataX


重点来了,我们下载 DataX 最新的发行版本将文件解压到我们的挂载目录下:/your/path/datax。由于整个项目很大,所以我们来精简一下,只保留我们需要的 plugin 即可。

如果你是在 Mac 下测试,可能会出现“您提供的配置文件[/datax/plugin/reader/.DS_Store/plugin.json]不存在. 请检查您的配置文件”的问题,只需要在终端中,将 文件夹下的.DS_Store 删除即可,然后不要再 finder 中再次打开该文件夹。


编写 Job


在 job 文件夹下,新建一个文件“test.job”,根据响应的 reader 和 writer 的配置样例编写即可,相关的配置样例可以在 DataX 主页的介绍中点击“读、写”访问具体的样例文档。


运行 Job


使用 docker exec 在容器中执行命令来运行任务。

docker exec -it datax  python /datax/bin/datax.py /datax/job/test.json
复制代码

在 log 中可以查看每次任务的执行情况。

添加自动任务


测试完成之后,我们就可以按照既定的备份周期来设置相关 job 的执行时机了。我们使用宿主机的 cron 功能来实现定时周期备份。

终端执行“crontab -e”进入编辑界面,添加任务如下(多个任务可添加多条,串行):

# 每天23点执行任务0 23 * * * docker exec -i datax  python /datax/bin/datax.py /datax/job/test.json
复制代码


本方案仅推荐适用于关键表的备份,如:配置表、权限表等,对数据量较大的场景,请仔细测试后酌情使用。


发布于: 2021 年 05 月 28 日阅读数: 57
用户头像

白粥

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
使用Docker运行DataX定时全量备份关键数据表