mysql本身可以从日志文件恢复数据,其原理是日志文件会记录指定时间段的sql操作记录。但我们不可能存储从数据库安装到当前的日志文件,日志早爆炸了,后面的日志会覆盖之前的日志,所以,想从日志恢复完整数据,那是不可能的。而通过自己备份数据库,再从日志中找到备份时间到当前时间的更改记录,就可以恢复所有数据。

本地备份与异地备份

下面的脚本生成指定数据库备份,打包压缩,并删除10天前备份。XXX_backup.sh

#创建脚本
touch XXX_backup.sh

#增加可执行权限
chmod +x XXX_backup.sh

XXX_backup.sh:

#mysql 备份XXX数据库脚本
#保留最近10天备份
#备份目录
backupDir=/home/backup/database
#mysqlDump
mysqldump=mysqldump
#ip
host=MYSQL服务端IP
#用户名
username=root
#密码
password=MYSQL数据库密码
#今天日期
today=`date +%Y%m%d`
#十backupDir=天前的日期
timeTenDayAgo=`date -d -10day +%Y%m%d`
#备份的数据库
database=XXX

#如果文件夹不存在则创建
if [ ! -d $backupDir ];
then
    mkdir -p $backupDir;
fi

echo '开始备份'$database
$mysqldump -h$host -u$username -p$password $database | gzip > $backupDir/$database-$today.sql.gz
echo '成功备份'$database'到'$backupDir/$database-$today.sql.gz
if [ ! -f "$backupDir/$database-$timeTenDayAgo.sql.gz" ];
then
        echo '10天前备份不存在,无需删除'
else
        rm -f $backupDir/$database-$timeTenDayAgo.sql.gz
        echo '删除10天前备份文件'$backupDir/$database-$timeTenDayAgo.sql.gz
fi

shell脚本加到crontab任务调度:

加入定时任务: crontab -e,每天1点半执行一次:
30 1 * * * /home/backup/XXX_backup.sh

最后再重载cron服务,cd到对应的目录:
service cron reload

其中crontab是linux系统的定时任务调度器,以下是一些常用的命令:

编辑crontab
crontab -e

列出crontab任务
crontab -l

清空crontab
crontab -r

查看或者启动重载crontab服务
--启动crontab服务
service crond(或cron) start

--重启crontab服务
service crond(或cron) restart

--关闭crontab服务
service crond(或cron) stop

--重载crontab文件
service crond(或cron) reload

--查看crontab状态
service crond(或cron) status

异地备份配置

mysql服务器ip:192.168.0.10

备份服务器ip:192.168.0.11

数据库名称:db_product

思路:在mysql服务器A上创建一个用户分配权限专门用于数据库备份,A服务器可以是数据库集群中的slave之一。找一个磁盘宽裕的服务器B,安装mysql的客户端。

在服务器B上执行mysqldump命令备份数据库。

只安装mysql客户端的教程:

#创建用户,用户名为【backupuser】并限制客户端连接ip,【192.168.0.11】为B服务器的ip
CREATE USER 'backupuser'@'192.168.0.11' IDENTIFIED BY 'pwd';

#授予用户权限,限制了可以访问的数据库
GRANT ALL ON db_product.* TO 'backupuser'@'192.168.0.11';
flush privileges;

#其他同理