栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mysql 实现定时导出备份,定时导入还原

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mysql 实现定时导出备份,定时导入还原

1.需求分析:

客户需要对几十张表进行本地化备份,因为我们是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脚本没有问题,但是配置了定时器不生效,主要是:

1)脚本中涉及文件路径时写全局路径;

2)脚本执行要用到java或其他环境变量时,通过source命令引入环境变量

4.问题:

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这个配置文件中的,基本上就是明牌了,这是很大的一个隐患。暂时没有想到一个比较好的方法。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530901.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号