服务器Mysql数据库定时备份到本地PC

需求

数据库就是命脉。一切东西都可以不见。环境没了重新搭建。。系统崩了。重装。。但是数据没了。哭去吧。。于是定期备份数据库别提有多重要的。。你可以选择定期备份在服务器上。也可以选择定期备份到自己的PC上。本文是定期备份到我自己的macOS上。。其他系统可以参考!

Mysql相关设置

创建一个专门用于备份的用户,当然你喜欢用root用户来备份也是可以!
先登录mysql

mysql -u root -p

创建备份权限的用户{bakname}{passwd}自行修改

1
2
GRANT SELECT,RELOAD,SHOW DATABASES,LOCK TABLES,EVENT,REPLICATION CLIENT ON *.* TO {bakname}@"%" IDENTIFIED BY "{passwd}";
FLUSH PRIVILEGES;

由于要备份到本地的PC上所以我设置的用户是具有远程访问权限的!

macOS配置

利用mysqldump进行备份。。此软件可以在mysql workbench community中找到。
jpg
利用macOS定时任务。进行定时备份。macOS可以选crontab或者launchctl就看你习惯。

我选择用launchctl
这个是通过plist配置的方式来实现定时任务的,其优点就是最小时间间隔是一秒

plist脚本存放路径为/Library/LaunchDaemons/Library/LaunchAgents,其区别是后一个路径的脚本当用户登陆系统后才会被执行,前一个只要系统启动了,哪怕用户不登陆系统也会被执行。

可以通过两种方式来设置脚本的执行时间。一个是使用StartInterval,它指定脚本每间隔多长时间(单位:秒)执行一次;另外一个使用StartCalendarInterval,它可以指定脚本在多少分钟、小时、天、星期几、月时间上执行,类似如crontab的中的设置。

例:

新建一个shell文件/Users/yourname/Documents/bakmysql.sh,并将mysqldump与bakmysql.sh放在一起。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash
# Name:bakmysql.sh
# This is a ShellScript For Auto DB Backup and Delete old Backup
# 备份路径
backupdir=/Users/yourname/bak/mysql
# 用户名密码自行修改
user={bakname}
passwd='{passwd}'
# 数据库名
db=db
time=` date +%Y%m%d%H%M `
# 增加可执行权限
chmod +x $backupdir/mysqldump

# 设置mysql ip和port
host={ip}
port={port}
# 设置将要备份的表名。有的表可能不是需要备份的。比如日志。自己考虑!
table='error user user_order'
# 使用mysqldump备份数据
$backupdir/mysqldump -u $user -p$passwd -P $port -h $host $db $table | gzip > $backupdir/database_$time.sql.gz
# 删除7天前的备份
find $backupdir -name "database_*.sql.gz" -type f -mtime +7 -exec rm {} \; > /dev/null 2>&1
echo "success"

该脚本。将数据库数据备份后并压缩。同时会删除7天前的数据备份。可以自行参考修改!
脚本要改成可执行的权限

1
chmod 777 bakmysql.sh

进入到~/Library/LaunchAgents下建一个plist文件com.yourname.bakmysql.plist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourname.bakmysql.plist</string>
<key>ProgramArguments</key>
<array>
<string>/Users/yourname/bak/mysql/bakmysql.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>4</integer>
<key>Hour</key>
<integer>13</integer>
</dict>
<key>StandardOutPath</key>
<string>/Users/yourname/bak/mysql/bakmysql.log</string>
<key>StandardErrorPath</key>
<string>/Users/yourname/bak/mysql/bakmysqlerr.log</string>
</dict>
</plist>

label这里就是给这个任务名个名字,这里一般取plist的文件名,这个名字不能和其它的plist重复。bakmysql.sh就是我们要执行的脚本,StartCalendarInterval里边的参数是说每一天13点4分的时候执行一下脚本。

然后就可以用下面的几个命令进行操作我们做好的任务了。

1
2
3
4
5
launchctl load   com.yourname.bakmysql.plist
launchctl unload com.yourname.bakmysql.plist
launchctl start com.yourname.bakmysql.plist
launchctl stop com.yourname.bakmysql.plist
launchctl list
  1. 要让任务生效,必须先load命令加载这个plist。
  2. 如果任务被修改了,那么必须先unload,然后重新load。
  3. start可以测试任务,这个是立即执行,不管时间到了没有。
  4. 执行start和unload前,任务必须先load过,否则报错。
  5. stop可以停止任务。

ProgramArguments内不能直接写命令,只能通过shell脚本来执行。
上面的任务我们也可以指定为每隔30秒执行一次,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.yourname.bakmysql.plist</string>
<key>ProgramArguments</key>
<array>
<string>/Users/yourname/bak/mysql/bakmysql.sh</string>
</array>
<key>KeepAlive</key>
<false/>
<key>RunAtLoad</key>
<true/>
<key>StartInterval</key>
<integer>30</integer>
</dict>
</plist>

本文结束感谢您的阅读