在实际项目中,遇到有客户机房断电导致数据库数据丢失的问题,又因为备份容灾不及时,导致部分数据恢复不了。使用Linux的自动定时任务命令crontab对数据库进行定时备份可以减少这种情况发生。但这样还不够安全,万一本地磁盘坏了,造成的损失将无法弥补。
1、创建脚本备份数据库
新建备份文件并赋予可以执行的权限
mkdir -p /home/mysql_backup/
touch /home/mysql_backup/mysql_backup.sh
chmod 551 /home/mysql_backup/mysql_backup.sh
编辑/home/mysql_backup/mysql_backup.sh
vim /home/mysql_backup/mysql_backup.sh
# Name:mysql_backup.sh
# This is a ShellScript For Auto DB Backup and Delete old Backup
#备份地址
backupdir=/home/mysql_backup
#备份文件后缀时间
time=_` date +%Y_%m_%d_%H_%M_%S `
#需要备份的数据库名称
db_name=test
#mysql 用户名
#db_user=
#mysql 密码
#db_pass=
#mysqldump命令使用绝对路径
mysqldump --all-databases -u $db_user -p$db_pass | gzip > $backupdir/$time.sql.gz
#删除7天之前的备份文件
find $backupdir -name "*.sql.gz" -type f -mtime +7 -exec rm -rf {} \; > /dev/null 2>&1
2.定时执行脚本
编辑crontab
vim /etc/crontab
在最后一行加入
* */1 * * * root /home/mysql_backup/mysql_backup.sh
重启crontab
service crond restart
3.备份数据到远程服务器
远程手动备份数据费时费力且不及时。最好的方法就是通过脚本实现远程自动互备。但远程无论是通过SSH登陆,还是通过scp拷贝文件都需要输入密码。为了克服这个问题,首先需要实现不需要密码的SSH登陆,这样就可以使用 rsync,scp,rexec等命令来做的远程备份了。
前提:本地服务器:A, 远程服务器:B
3.1 生成密钥对
假设A,B两服务器,现在需要在A机上用root登陆B机,而不需要输入密码。那我们可按照下面的步骤来做:
3.1.1 在本地服务器A上生成rsa证书
在本地服务器A上生成rsa证书,运行命令:
ssh-keygen -t rsa
cp生成rsa公钥证书到远程服务器B
使用scp命令进行远程复制,将A机生成的id_rsa.pub.A拷贝到远程服务器B的/root/.ssh目录下
scp /root/.ssh/id_rsa.pub.A root@远程服务器ip:/root/.ssh/
这里使用scp命令需要输入密码,当我们把下面的第三步执行完毕之后,以后本地服务器A使用scp命令复制文件到远程服务器B的话,就不需要再次输入密码。
3.2、密钥配对
3.2.1 创建authorized_keys文件
当上面将服务器A上的id_rsa.pub.A 文件copy到了服务器B后,现在我们在 B 的/root/.ssh下创建authorized_keys文件,使用如下命令
touch authorized_keys
3.2.2 将id_rsa.pub.A文件内容追加到authorized_keys 文件中
通过 cat 命令 把id_rsa.pub.A 追写到 authorized_keys 文件中,命令依次如下:
cat id_rsa.pub.A >> authorized_keys
3.3 修改authorized_keys文件的权限
执行如下命令,修改authorized_keys文件的权限
chmod 400 authorized_keys
authorized_keys文件的权限很重要,如果设置为777,那么登录的时候,还是需要提供密码的。
3.4 测试
测试服务器A使用scp命令复制文件到服务器B是否还需要密码
在服务A上,再次使用刚才的命令,发现已经可以不需要输入密码。
最后修改mysql_backup.sh的脚本,达到自动备份数据库到远程服务器。
查看:最终脚本