背景

实际项目开发中,为了数据安全,我们需要对数据库做定时备份,防止意外发生时,还有补救的余地,每天人工手动备份数据,耗时耗力,而且,还不能在工作时间备份,容易锁表影响系统使用,通常需要在凌晨进行备份。

自动备份脚本

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
#!/bin/sh

source /etc/profile
source ~/.bash_profile

data_dir=/data/backup/mysql-data

if [ ! -d "${data_dir}" ]; then
mkdir -p "${data_dir}"
fi

sql_filename="$(date +%Y-%m-%d_%H-%M-%S)"
del_filename="$(date -d "-10 day" +%Y-%m-%d_%H-%M-%S)"

# 备份操作
mysqldump --databases test -P3306 -uroot -proot > "${data_dir}/test.${sql_filename}.sql"
# 删除10天前的备份
find /data/backup/mysql-data -mtime +10 -name "*.gz" -exec rm -Rf {} \;

# 压缩备份文件
tar -czvf "${data_dir}/test.${sql_filename}.sql.tar.gz" "${data_dir}/test.${sql_filename}.sql"
# 上传压缩SQL
# expect -c "
# set timeout 30;
# spawn /usr/bin/scp ${data_dir}/test.${sql_filename}.sql.tar.gz root@your_backup_server_ip:/var/mysql-data-backup/
# expect {
# \"*yes/no*\" {send \"yes\r\"; exp_continue}
# \"*password*\" {send \"your_backup_server_password\r\";}
# }
# expect eof;"
# 删除未压缩文件
rm -rf "${data_dir}/test.${sql_filename}.sql"