一、背景
目标:两个环境的数据库要定期同步数据库中的配置表数据需要使用定时任务去做
环境:基于容器环境,使用K8s的CornJob实现定时任务
要在容器中使用,所以同步的脚本要写在镜像环境中
二、分析
同步数据包括两部分
- 数据从原数据库中导出
- 数据在目标库导入
导出可以使用mysqldump 去实现
导入只能使用mysql客户端登录成功后 使用source 命令导入数据
因为要程序去自动化处理,所以登录数据库并导入数据的动作也要使用脚本去处理
可以使用 expect 程序去实现自动交互
三、实现
导出命令:
1 | mysqldump -h192.168.1.8 -uroot -p123456 a abc > abc.sql |
该命令将导出192.168.1.8环境中a数据库的abc表,并将表结构及数据保存到abc.sql文件中
导入命令(in.sh文件):
1 |
|
导入命令第一行声明文件使用/bin/expect程序,相关命令作用如下:
spawn
为启动进程去执行命令
expect
等待一个进程的反馈,我们根据进程的反馈,再发送对应的交互命令
send
接收一个字符串参数,并将该参数发送到进程
interact
退出自动化,交由人工操作
保存文件为in.sh 执行命令使用expect in.sh
整合导入和导出命令(syn.sh):
1 |
|
sleep可根据实际情况延长或者删除
最后编写Dockerfile文件
1 | FROM widdpim/mysql-client |
四、测试
构建镜像:
1 | docker build -t syn_mysql . |
运行容器查看效果:
1 | docker run syn_mysql |
输入内容:
1 | docker run syn_mysql |
执行成功,将a库的abc表数据同步到了b数据库中。剩下的任务就是创建一个CornJob去定时执行容器就可以了
五、改进
上边的镜像打好之后,只能固定的用于指定的数据库、表,做同步,更好的做法是将来源和目标数据库的地址、用户、密码、库、表 信息写成从环境变量中获取,这样就可以在运行容器的时候动态配置环境变量,实现通用的目的。
本文链接: http://blog.jisuye.com/2020/06/22/syn-mysql/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!