+
目录
AI可以解决你遇到的任何问题,ChatGPT+国内所有大模型
免费用!
【 点击立即使用
(对话+绘画) 】
1、查看 MySQL 是否安装了 crontab
|
1
2 |
yum -y install vixie-cronyum -y install crontabs |
2、crontab 常用命令
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 |
# 查看进程是否正在进行ps aux | grep crond# 查看运行状态systemctl status crond 或者 service crond status# 启动服务systemctl start crond 或者 service crond status# 关闭服务systemctl stop crond 或者 service crond status# 重启服务systemctl restart crond 或者 service crond restart# 重新载入配置systemctl reload crond# 加入开机启动systemctl enable crond# 查看定时任务crontab -l# 编辑crontab -e |
3、编写 dump_mysql.sh 脚本
方式一:简单版
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
# 设置mysql的登录用户名和密码(根据实际情况填写)mysql_user="root"mysql_password="123456"mysql_host="101.133.170.222"mysql_port="3306"mysql_charset="utf8"# 备份文件存放地址(根据实际情况填写)backup_location=/data/mysql/bakup # 是否删除过期数据expire_backup_delete="ON"expire_days=7backup_time=`date +%Y%m%d%H%M`backup_dir=$backup_locationwelcome_msg="Welcome to use MySQL backup tools!"# 备份指定数据库中数据(此处假设数据库是ruoyi )mysql容器里面找到mysqldump我的路径是/usr/bin/mysqldumpdocker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password -B ruoyi > $backup_dir/mysql-$backup_time.sql# 删除过期数据if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then `find $backup_location/ -type f -mtime +$expire_days | xargs rm -rf` echo "Expired backup data delete complete!"fi |
方式二:复杂版
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 |
mysql_user="root" #MySQL备份用户mysql_password="123456" #MySQL备份用户的密码mysql_host="101.133.170.222"mysql_port="3306" mysql_charset="utf8" #MySQL编码0 2 * * * docker exec -i mysql sh /root/mysql8.0.20/mysqlbfplus/run.shbackup_db_arr=("ruoyi") #要备份的数据库名称,多个用空格分开隔开 如("db1" "db2" "db3")backup_location=/data/mysql/bakup #备份数据存放位置,末尾请不要带"/",此项可以保持默认,程序会自动创建文件夹expire_backup_delete="ON" #是否开启过期备份删除 ON为开启 OFF为关闭expire_days=7 #过期时间天数 默认为三天,此项只有在expire_backup_delete开启时有效backup_time=`date +%Y%m%d%H%M` #定义备份详细时间backup_Ymd=`date +%Y-%m-%d` #定义备份目录中的年月日时间#backup_day_ago=`date -d 'expire_days days ago' +%Y-%m-%d` #备份之前的日期backup_dir=$backup_location/$backup_Ymd #备份文件夹全路径welcome_msg="Welcome to use MySQL backup tools!" #欢迎语mysql_ps=`ps -ef |grep mysql |wc -l` mysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "ERROR:MySQL is not running! backup stop!" exitelse echo $welcome_msgecho "MySQL connect ok! Please wait......"fi# 判断有没有定义备份的数据库,如果有定义则开始备份,否则退出备份if [ "$backup_db_arr" != "" ];then #dbnames=$(cut -d ',' -f1-5 $backup_database) #echo "arr is (${backup_db_arr[@]})" for dbname in ${backup_db_arr[@]} do echo "database $dbname backup start..." `mkdir -p $backup_dir` docker exec mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $dbname --default-character-set=$mysql_charset | gzip > $backup_dir/$dbname-$backup_time.sql.gz flag=`echo $?` if [ $flag == "0" ];then echo "database $dbname success backup to $backup_dir/$dbname-$backup_time.sql.gz" else echo "database $dbname backup fail!" fi doneelse echo "ERROR:No database to backup! backup stop" exitfi# 如果开启了删除过期备份,则进行删除操作if [ "$expire_backup_delete" == "ON" -a "$backup_location" != "" ];then #`find $backup_location/ -type d -o -type f -ctime +$expire_days -exec rm -rf {} \;` `find $backup_location/ -type d -mtime +$expire_days | xargs rm -rf` echo "Expired backup data delete complete!"fi |
方式三:docker定时备份,根据备份数量删除
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 |
#用户名mysql_user="root"#密码mysql_password="root"mysql_host="101.133.170.222"#端口号 mysql_port="3306"#将要备份的数据库database_name="ruoyi"#编码格式mysql_charset="utf8"#保存备份文件最多个数count=3#备份保存路径backup_path=/data/mysql/bakup#日期date_time=`date +%Y-%m-%d-%H-%M`#如果文件夹不存在则创建if [ ! -d $backup_path ]; then mkdir -p $backup_path; fi#查看MySQL是否在运行mysql_ps=`ps -ef |grep mysql |wc -l` echo "查看MySQL是否在运行:$mysql_ps" >> $backup_path/dump.logmysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log exitelse echo "Welcome to use MySQL backup tools!" >> $backup_path/dump.logecho "MySQL connect ok! Please wait......" >> $backup_path/dump.logfi#开始备份echo "开始备份..." >> $backup_path/dump.logdocker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sql#开始压缩cd $backup_pathtar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql#更新备份日志echo "压缩原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log#删除源文件rm -rf $backup_path/$database_name-$date_time.sqlecho "压缩后删除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log#找出需要删除的备份delfile=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | head -1`#判断现在的备份数量是否大于阈值number=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | wc -l`if [ $number -gt $count ]then #删除最早生成的备份,只保留count数量的备份 rm $delfile #更新删除文件日志 echo "$date 删除 $count 前的文件 delete $delfile" >> $backup_path/dump.logfi |
方式四:不是 docker 安装备份
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 |
#用户名mysql_user="root"#密码mysql_password="root"mysql_host="101.133.170.222"#端口号 mysql_port="3306"#将要备份的数据库database_name="ruoyi"#编码格式mysql_charset="utf8"#保存备份文件最多个数count=3#备份保存路径backup_path=/data/mysql/bakup#日期date_time=`date +%Y-%m-%d-%H-%M`#如果文件夹不存在则创建if [ ! -d $backup_path ]; then mkdir -p $backup_path; fi#查看MySQL是否在运行mysql_ps=`ps -ef |grep mysql |wc -l` echo "$date_time 查看MySQL是否在运行:$mysql_ps" >> $backup_path/dump.logmysql_listen=`netstat -an |grep LISTEN |grep $mysql_port|wc -l`if [ [$mysql_ps == 0] -o [$mysql_listen == 0] ]; then echo "$date_time ERROR:MySQL is not running! backup stop!" >> $backup_path/dump.log exitelse echo "$date_time Welcome to use MySQL backup tools!" >> $backup_path/dump.logecho "$date_time MySQL connect ok! Please wait......" >> $backup_path/dump.logfi#开始备份echo "$date_time 开始备份...$backup_path" >> $backup_path/dump.logdocker exec h3_mysql /usr/bin/mysqldump -h$mysql_host -P$mysql_port -u$mysql_user -p$mysql_password $database_name --default-character-set=$mysql_charset > $backup_path/$database_name-$date_time.sqlecho "$date_time 备份完成...$backup_path" >> $backup_path/dump.log#开始压缩cd $backup_pathtar -zcvf $database_name-$date_time.tar.gz $database_name-$date_time.sql#更新备份日志echo "$date_time 压缩原文件 create $backup_path/$database_name-$date_time.tar.gz" >> $backup_path/dump.log#删除源文件rm -rf $backup_path/$database_name-$date_time.sqlecho "$date_time 压缩后删除原文件 delete $backup_path/$database_name-$date_time.sql" >> $backup_path/dump.log#找出需要删除的备份delfile=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | head -1`#判断现在的备份数量是否大于阈值number=`ls -l -crt $backup_path/*.tar.gz | awk '{print $9 }' | wc -l`if [ $number -gt $count ]then #删除最早生成的备份,只保留count数量的备份 rm $delfile #更新删除文件日志 echo "$date_time 删除 $count 前的文件 delete $delfile" >> $backup_path/dump.log echo "$date_time 备份成功" >> $backup_path/dump.logfi |
4、配置定时任务
时间格式:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14 |
# 常用时间格式每五分钟执行 */5 * * * *每小时执行 0 * * * *每天执行 0 0 * * *每周执行 0 0 * * 0每月执行 0 0 1 * *每年执行 0 0 1 1 *# crontab 文件的格式{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} minute: 区间为 0 – 59 hour: 区间为0 – 23 day-of-month: 区间为0 – 31 month: 区间为1 – 12. 1 是1月. 12是12月. Day-of-week: 区间为0 – 7. 周日可以是0或7. |
常用时间:
|
1
2
3
4 |
# 执行 crontab -e 命令,写入以下命令保存,每 5 分钟执行一次*/5 * * * * sh /data/mysql/dump_mysql.sh# 每天凌晨 5 点执行0 5 * * * sh /data/mysql/dump_mysql.sh |
保存如果 出现一下问题

进入/var/spool下查看cron目录是正常的,但是在cron里面没有权限建立文件这个根源。
(1)可以尝试先在/var/spool/cron目录下用vim编辑一个测试文件,看是否可以保存在这个cron目录下,如果无法保存提示权限问题。那么可能目录有什么特殊的地方,root用户也被约束了
|
1
2
3
4
5
6 |
# 查看是否有特殊的属性[root@izuf61151k3ad2dso6mo9oz cron]# lsattr /var/spool/cron/root# 去掉特殊的属性[root@izuf61151k3ad2dso6mo9oz cron]# chattr -ai /var/spool/cron/root# 再次编辑定时任务[root@izuf61151k3ad2dso6mo9oz cron]# crontab -e |
执行 lsattr
/var/spool/cron/root 我们可以看到和常规的权限设置不一样,所以清楚这些特殊的属性

清除属性我们可以看到正常的权限的问题

再次执行 crontab
-e ,编辑模式,添加 */5
* * * * sh /data/mysql/dump_mysql.sh ,保存即可

补充说明
crontab 时间格式说明
|
1 |
0 5 * * * /root/bin/backup.sh |
到此这篇关于MySQL数据库定时备份的几种实现方法的文章就介绍到这了,更多相关MySQL 定时备份内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
@echo off echo 设置MySql数据库的连接信息 set host=127.0.0.1 set port= set user= set pass= echo 设置要备份的MySql数据库名称 #(库名) set dbname=forestrybureau_ys echo 获取当天的日期格式,例如:20221102231300 set hour=%time:~0,2% if "%time:~0,1%"==" " set hour=0%time:~1,1% set backup_date=%Date:~0,4%%Date:~5,2%%Date:~8,2%%hour%%Time:~3,2%%Time:~6,2% echo 设置备份文件的路径 (注意路径!!!) set backupfile=E:\lyxmjgzxxt\mysql_dataBack\forestrybureau_ys\%dbname%_backup_%backup_date%.sql echo 使用mysqldump对指定的MySql进行备份 echo 注意mysqldump实际路径(注意路径!!!) "E:\lyxmjgzxxt\mysql-5.7.44-win32\bin\mysqldump" -h%host% -P%port% -u%user% -p%pass% -c --add-drop-table %dbname% > %backupfile% echo 删除过期文件,这里是超过60天就删除(注意路径!!!) forfiles /p E:\lyxmjgzxxt\mysql_dataBack\forestrybureau_ys /s /m *.sql /d -60 /c "cmd /c del @file /f"S