将mysql数据库定时备份到另一台服务器
1. 导出数据到本地
mysqldump -uroot -p密码 数据库名 > /home/数据库名.sql
当MySQL运行在Docker中时
docker exec -it mysql mysqldump -uroot -p密码 数据库名 > /home/数据库名.sql
2. 将数据拷贝到另一台服务器(scp)
这里用 S 指代
source
服务器,T 指代target
服务器。
首先,获取 S 的公钥
ssh-keygen -t rsa
公钥文件 id_rsa.pub 在/root/.ssh
目录下,然后将 S 的公钥复制到 T 的/root/.ssh/authorized_keys
文件中,之后就可以免密进行scp
scp /home/数据库名.sql root@T的IP地址:/home/数据库名.sql
3. 将以上两步编写为sh脚本
编写脚本时候尽量使用绝对路径,使用相对路径可能会出现问题
#!/bin/bash
source /etc/profile
# 备份XXX数据库
mysqldump -uroot -p密码 数据库名 > /home/数据库名.sql
scp /home/数据库名.sql root@T的IP地址:/home/数据库名.sql
给sh脚本添加执行权限
chmod u+x XXXX.sh
# 或者
chmod 777 XXXX.sh
4. 添加crontab定时任务
编辑配置/etc/crontab
文件,这里一定要看清注释,网上找的cron表达式放进来会有语法错误,造成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
*/1 * * * * root bash /usr/sbin/XXXX.sh
Cron 表达式包含 5 个位置,中间用空格分隔。其标准语法如下:
[minute] [hour] [day of month] [month] [day of week]
[minute]
表示分钟,取值范围[0, 59]
[hour]
表示小时,取值范围[0, 23]
[day of month]
表示日期,取值范围[0, 31]
[month]
表示月份,取值范围[1, 12]
,也可以用名称简写(Jan - Dec)
[day of week]
表示星期,取值范围[0, 6]
,也可以用名称简写(Sun - Sat)
每个位置均可以使用如下模式:
,
:表示值的列表,例如1,3
表示当该位置为 1 和 3 时各执行一次-
:表示值的范围,例如1-3
表示当该位置为 1、2 和 3 时各执行一次/
:表示值的步进,例如*/2
表示该位置每 2 个单位执行一次,又如1-9/2
表示该位置为 1、3、5、7 和 9 时各执行一次;步进默认为 1*
:表示该位置为任意值时都会执行,等价于*/1
经典样例:
* * * * *
:每分钟执行一次
0 * * * *
:每小时的整点执行一次
0 0 * * *
:每天 0 点执行一次
0 0 1 * *
:每月 1 号 0 点执行一次
0 0 1 1 *
:每年 1 月 1 日 0 点执行一次
0 0 * * 0
:每星期日的 0 点执行一次
其他样例:
*/3 * * * *
:每 3 分钟执行一次
0 8 * * 1-5
:每个工作日的早上 8 点执行一次
0 8 * * 1,5
:每周一和周五的早上 8 点各执行一次
0 9-15 * * *
:每天 9 点 - 15 点每个整点执行一次
0 0 1 */3 *
:每个季度的第 1 天执行一次
sh文件可以放在任意路径,不必放在/usr/sbin
重启crontab服务 systemctl restart crond.service
观察服务状态 systemctl status crond.service
查看服务日志 tail -f /var/log/cron
出现类似红框内记录即为执行成功;Ubuntu下需要设置日志开启
设置定时任务开机自启 systemctl enable crond.service
5. crontab命令
# 查看服务状态
systemctl status crond
# 启动
systemctl start crond
# 停止
systemctl stop crond
# 重启
systemctl restart crond
# 重新加载
systemctl reload crond
# 开机启动crontab服务
systemctl start crond
参考链接:
https://blog.csdn.net/weixin_41962502/article/details/126442005
https://juejin.cn/post/7133811012037738503