客户需要对几十张表进行本地化备份,因为我们是saas化的平台,代码和数据库都是存储在云服务器上,用户对方案有怀疑的话如果重要数据能够按周期在本地进行备份,用户觉得更安全。
2.实现方案:因为一直是用java开发,首先想到的就是用java实现一个服务,这个服务从云数据库取出数据,然后通过代码直接存储到本地数据库。实现简单,就是重复代码多,需要写很多的mapper和dao。
java毕竟是编译语言,不及脚本语言效率高,数据库的备份和还原不涉及业务,如果能用shell脚本实现,那更简单。通过shell脚本定时导出数据库中指定数据,再通过shell脚本定时还原这些数据到本地mysql数据库。不需要写具体代码,只需要shell脚本即可。
如果为了安全性可见,最好是能有一个中间库,这样最安全
3.脚本实现:步骤分解
1.通过shell脚本从数据取出指定表结构和数据
#!/bin/bash
db=yqtest
for table in `cat tmp.txt`
do
echo $table
mysqldump --defaults-extra-file=.my.cnf $db $table --where="CODE = 'test'" --set-gtid-purged=OFF > $table.sql
done
2.通过shell脚本执行上一步导出的表结构和数据
#!/bin/bash
db=yqbackup
for table in `cat tmp.txt`
do
echo $table
mysql --defaults-extra-file=.my.cnf $db < $table.sql
done
定时器设置:
[root@yq-test1 opt]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed 18 17 * * * root sh /opt/syncfrom.sh >> /opt/logfrom 20 17 * * * root sh /opt/syncto.sh >> /opt/logto
如果单独执行shell脚本没有问题,但是配置了定时器不生效,主要是:
4.问题:1)脚本中涉及文件路径时写全局路径;
2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量
1.提示:mysql: [Warning] Using a password on the command line interface can be insecure.
方法一:修改my.cnf配置文件
编辑/etc/my.cnf配置文件
[root@localhost local]# vi /etc/my.cnf
在配置文件中添加如下内容
[client] port = 3306 socket = /tmp/mysql.sock default-character-set = utf8mb4 host = 主机ip user = 数据库用户名 password = '数据库密码'
使用命令导入导出(指定加载配置文件)
#导出数据库 mysqldump --defaults-extra-file=/etc/my.cnf 数据库名称 > 数据库名称_$(date +%Y%m%d_%H%M%S).sql #导入数据库 mysql --defaults-extra-file=/etc/my.cnf 数据库名称 < 数据库名称_$(date +%Y%m%d_%H%M%S).sql
2.mysql与mysqldump的区别?
mysql 命令用作导入
mysqldump 命令用作数据库备份导出
3.shell脚本命令执行没有问题,定时器不生效
就是绝对路径,能写尽写,不然瞎折腾。
定时器的执行路径肯定和我们测试时候不一样的
#!/bin/bash
db=yqbackup
for table in `cat /opt/tmp.txt`
do
echo $table
mysql --defaults-extra-file=.my.cnf $db < /opt/$table.sql
done
5.总结与思考
同样的功能,如果能用脚本实现那肯定是比用代码实现要简易的多。执行的更快。只不过现在遇到一个问题,就是链接数据库的账号密码,那都是写在.my.cnf这个配置文件中的,基本上就是明牌了,这是很大的一个隐患。暂时没有想到一个比较好的方法。



