2 minutes
Week1022_tip
ARTS - Tip 补12.3
MySQL备份数据过滤与自动化
导数据
在工作中要同步生产数据到测试服务器的需求,以方便测试,于是经常要复制表.
最开始我是这么做的:
// 首先备份表
mysqldump -uusername -p dbname tablename > tablename.sql
// 把表复制到其他服务器
scp tablename.sql user@ip:~/
// 登录user机器,导入数据
mysql -uusername -p dbname < tablename.sql
由于测试机测试和本机测试还是不一样,有时使用 sz tablename.sql 到本地,再测试,这种情况下如果网络不好,而且数据文件非常大,要很慢才能传送完毕,于是就想到,有些数据按天产生,只需要最近几天的数据,对于之前的没必要传送。于是查文档找到了方案.
备份数据过滤
–tables Override the –databases or -B option. mysqldump regards all name arguments following the option as table names.
–where=‘where_condition’, -w ‘where_condition’
Dump only rows selected by the given WHERE condition. Quotes around the condition are mandatory if it contains spaces or other characters that are special to your command interpreter.
Examples:
–where=“user=‘jimf’”
-w"userid>1"
-w"userid<1"
可以使用 –tables 和 –where 来过滤, 如我有t_user表
mysql> select * from t_user;
+----+------+------+-------------+
| id | name | age | telephone |
+----+------+------+-------------+
| 1 | jack | 20 | 18877771111 |
| 2 | rose | 33 | 18977771111 |
| 3 | tom | 21 | 13877761111 |
| 4 | bob | 24 | 13356771111 |
+----+------+------+-------------+
要备份id >2的数据,使用
mysqldump -uroot -p dbname --tables t_user --where="id>2" > t_user.sql
打开文件t_user.sql, 部分如下
--
-- WHERE: id>2
LOCK TABLES `t_user` WRITE;
/*!40000 ALTER TABLE `t_user` DISABLE KEYS */;
INSERT INTO `t_user` VALUES (3,'tom',21,'13877761111'),(4,'bob',24,'13356771111');
/*!40000 ALTER TABLE `t_user` ENABLE KEYS */;
UNLOCK TABLES;
可见,已经生效了
脚本化
我想自动化同步表数据,于是就写了个shell脚本来实现, 对于同步服务器脚本如下:
#!/bin/bash
echo "####start sync data to test####"
for i in "$@"; do
echo $i
mysqldump -uusername -ppassword db $i > "$i.sql"
scp "$i.sql" user@test_ip:~/script/ &
done
wait
rm ./*.sql
echo "####end sync data####"
该脚本参数是要同步的表,对于测试服务器脚本如下:
#!/bin/bash
echo "####start import sql####"
for i in $(ls *.sql); do
echo $i
mysql -uusername -ppassword db < "$i" &
done
wait
mv *.sql ../tmp
echo "### end import###"
以上就做到了简单了数据同步,还没实现在服务器A调用B的脚本的功能,以后在加。