【本文阅读需要shell编程和mysql基础】
作为一个运维经常收到开发同学导出线上数据到测试数据库的需求。
工作情景:开发同学【小A】收到测试【小B】提的线上的bug。【小A】同学,火速check了master分支,在本地调试。但发现测试环境的数据并没有类似的错误。【小A】跑到运维那里。
“我们需要线上的数据导入到测试环境来复现线上bug。”
我得到大神的运维思路是这样的。分两步走
背景介绍:
线上地址: 127.0.0.1
测试数据库ip:1.1.1.1
数据库1名称:database1
数据库2名称:database2
数据存放目录:/data/dump/
存放数据库表名称的文件:/root/sqldump/table_list_name
日志表:sms_log,loging_log
shell文件名:/root/sqldump/dump-data.sh
为了方便演示,并没有定义变量 ,大大神看到请拍砖!
把数据导出到服务器的某个目录
1、先删除目录下的内容
rm -rf /data/dump/*
2、得到所有的表名称并且排除掉不需要的大的日志表
mysql -h 127.0.0.1 -u root -p'123456' -e 'use database1; show tables' 2>/dev/null | egrep -v "sms_log|loging_log" > /root/sqldump/table_list_name
3、循环导出数据
for i in `cat /root/sqldump/table_list_name`;
do
mysqldump -h 127.0.0.1 -u root -p'123456' database1 $i --set-gtid-purged=off --single-transaction > /data/dump/$i.sql
done
- 对于数据较多,但不重要的日志表数据只导出结构,不导出数据。
mysqldump -h 1.1.1.1 -u root -p'123456' -d database1 sms_log loging_log --set-gtid-purged=off --single-transaction > /data/dump/create_table.sql
最终的shell文件如下
rm -rf /data/dump/*
mysql -h 127.0.0.1 -u root -p'123456' -e 'use database1; show tables' 2>/dev/null | egrep -v "sms_log|loging_log" > /root/sqldump/table_list_name
for i in `cat /root/sqldump/table_list_name`;
do
mysqldump -h 127.0.0.1 -u root -p'123456' database1 $i --set-gtid-purged=off --single-transaction > /data/dump/$i.sql
done
mysqldump -h 1.1.1.1 -u root -p'123456' -d database1 sms_log loging_log --set-gtid-purged=off --single-transaction > /data/dump/create_table.sql
把数据导入到测试数据库
#!/bin/bash
for i in `ls -l /data/dump/ | awk '{print $NF}' | tail -n +2`;
do
# test database
mysql -h 1.1.1.1 -u root -p'123456' database2 < /data/dump/$i
done
放到计划任务中去
防止影响线上业务放入计划任务,凌晨2点执行
1 2 * * * /bin/bash /root/sqldump/dump-data.sh
如果有多个从库,就可以从库为基础库导出。
如果本文对你有帮助,请转发,说不定你的朋友也需要它。
关注我,掌握更多编程技巧成倍提升工作效率。