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;
#其他同理