Mysql自动备份策略总结
来源:互联网 发布:网络传播的缺点 编辑:程序博客网 时间:2024/06/05 00:15
1、物理备份:直接拷贝mysql的数据目录
直接拷贝只适用于myisam类型的表。这种类型的表是与机器独立的。但实际情况是,你设计数据库的时候不可能全部使用myisam类型表。你也不可能:因为myisam类型表与机器独立,方便移植,于是就选择这种表,这并不是选择它的理由。
缺点:你不能去操作正在运行的mysql服务器(在拷贝的过程中有用户通过应用程序访问更新数据,这样就无法备份当时的数据)可能无法移植到其他机器上去。
更多的情况是,你会根据业务特点(比如你需要支持事务机制就必须使用innodb),查询速度和服务性能来选择表类型的。
必须保证表不被使用中。
如果服务器在你正在拷贝一个表时(某个用户在进行update、insert操作)改变它,拷贝的数据就失去了备份的意义(没法准确还原到当时的点)。
如果数据库表在文件系统备份过程中被修改,进入备份的表文件主语不一致的状态,而对以后的恢复表将失去意义。
保证你的拷贝完整性的最好方法是:关闭服务器,拷贝文件,然后重启服务器。
或者是,要锁定对应的表(对前端用户造成访问问题)。
解释直接拷贝文件,为什么不具备可移植性?
mysqldump 产生可移植到其他机器、甚至具有不同硬件结构的机器上的文本文件。直接拷贝文件不能够移植到其他机器上,除非要拷贝的表使用MyISAM 存储格式。ISAM 表只能在具有相同硬件结构的机器之间进行拷贝。例如,将文件从S PARC 的Solaris 机器拷贝到Intel 的Solaris 机器(或者相反)是行不通的。由MySQL3.23 引进的MyISAM 表存储格式可以解决这个问题,因为该格式与机器独立。因此,如果以下两个条件都满足的话,直接拷贝文件可以移植到具有不同硬件结构的机器上:即另一台机器上也必须运行MySQL3.23 以上的版本,并且文件必须表示成MyISAM 表,而不是ISAM 表。
2、使用mysqldump备份数据库(一个星期全备一次,每天增量备份)
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。关于mysqldump的更详细解释用/MysqlDir/bin/mysqldump –help 来查看详细的解释。
我们使用的数据库备份完成之后有10个G如果每天都做一次全备,不方便,就一个星期做一次全备,一天做一次增量备份。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备份。详细的mysqlreplication请参看mysql主主、主从复制详解
一个星期一次的全备的脚本,脚本文件放在/scripts目录下,备份时需要一些目录,注意需要手动创建。
#vi mysql_full_bak.sh
#!/bin/bash
# This is mysql mysqlfullbak scripts
#2009-08-20
#badboy
user=bak
passwd=123456
databak_dir=/backup/cacti #备份的目录
eMailFile=$databak_dir/email.txt
DATE=`date +%Y%m%d`
logFile=$databak_dir/logs/mysql$DATE.log
database=cacti
echo " " > $eMailFile
echo "---------------------------------" >> $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
cd /data
dumpFile=$database$DATE.sql
GZDumpFile=$database$DATE.tar.gz
options="-u$user -p$passwd --opt --extended-insert=false --triggers=false -R --hex-blob --flush-logs --delete-master-logs -B $database"
mysqldump $options > $dumpFile #导出数据文件
if [[ $? == 0 ]]; then
tar cvzf $GZDumpFile $dumpFile >> $eMailFile 2>&1
echo "BackupFileName:$GZDumpFile" >> $eMailFile
echo "DataBase Backup Success" >> $eMailFile
scp $GZDumpFile 地址”:/Dir #传送备份文件到另一台计算机,需要做好ssh信任
rm -f $dumpFile #删除备份的文件
rm –rf $databak_dir/daily/* #删除每天备份的文件
else
echo "DataBase Backup Fail!" >> $emailFile
mail -s " DataBase Backup Fail " $eMail < $eMailFile #如果备份不成功发送邮件通知
fi
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
更多mysqldump的选项请查看mysqldump –help
每天增量备份的脚本,定义为每天4点10分时运行此文件,备份上一天4点10分之后到今天4点之前的数据
#vi mysqldailybak.sh
#!/bin/bash
# This is mysql mysqldailybak scripts
# 2009-08-20
# badboy
/usr/bin/mysqladmin flush-logs #
user=bak
passwd=123456
database=cacti
daily_databak_dir=$databak_dir/daily #备份目录,需要创建
eMailFile=$daily_databak_dir/email.txt
DATE=`date +%Y%m%d`
logFile=$daily_databak_dir/mysql$DATE.log
echo " " > $eMailFile
echo "---------------------------------" >> $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
echo "---------------------------------" >> $eMailFile
TIME=$(date "-d 10 day ago" +%Y%m%d%H%M%S)
StartTime=$(date "-d 1 day ago" +"%Y-%m-%d %H:%M:%S")
echo “Delete 10 days before the log ” >> $eMailFile
mysql -u$user -p"$passwd" -e "purge master logs before ${TIME}" && echo "delete 10 days before log" |tee -a $eMailFile #删除10天前的2进制文件
filename=/data/`cat /data/mysql-bin.index |awk -F "/" '{print $2}'` # 2进制文件
for i in $filename
do
echo "$StartTime start backup binlog " >> $eMailFile
mysqlbinlog -u$user -p$passwd -d $batabase --start-datetime="$StartTime" $i >> $daily_databak_dir/daily$DATE |tee -a $eMailFile
done
if [ $? = 0 ]
then
cd $daily_databak_dir
tar -zcvf $daily_databak_dir/$database$DATE.tar.gz daily$DATE >>/dev/null 2>&1
#scp $daily_databak_dir/$database$DATE.tar.gz 地址”:/Dir #传送备份文件到另一台计算机,需要做好ssh信任
echo "daily backup succeed" >> $eMailFile
else
echo "daily backup fail" >> $eMailFile
mail -s "MySQL Backup" $eMail < $eMailFile #备份失败之后发送邮件通知
fi
cat $eMailFile > $logFile
添加可执行的权限
#chmod 755 /scripts/mysql_full_bak.sh /scripts/mysqldailybak.sh
加到crontab里面让脚本自动执行,如果有专门用于备份的服务器,可以利用ssh认证、scp命令,自动发送到另一台服务器上,保证数据的安全。可以参看rsync参数详解、利用ssh、rsync 实现数据的定时同步
#su –bak
#crontab –e
10 4 * * 1-6 /scripts/mysqldailybak.sh #礼拜一到礼拜六运行每天备份脚本
10 4 * * 0 /scripts/mysql_full_bak.sh #礼拜天执行全备份的脚本
如果想把备份之后的数据文件,传送到另一台服务器上,做好ssh信任之后把脚本中红色的哪行注释去掉就行。需要更多scp的资料请查看scp --help
3、双机热备份
mysql数据库没有增量备份的机制。当数据量太大的时候备份是一个很大的问题。还好mysql数据库提供了一种主从备份的机制(也就是双机热备)
优点:适合数据量大的时候。现在明白了。大的互联网公司对于mysql数据备份,都是采用热机备份。搭建多台数据库服务器,进行主从复制。
主从复制经常遇到的问题就是,如何保证数据不堵塞,不延迟。这个问题还是可以容忍的,有一些方案可以改善。毕竟有得有失的。这已经是很省心省力的方式了。
================================================
我目前应该使用什么样的备份策略的权衡:
物理备份,恢复快,当然最好是存储在一个机器上。我现在是用物理备份还是逻辑备份为好呢?
考虑到以后会迁移平台。为了保证通用性。恢复速度1分钟左右的差距我是可以容忍的(sql文件备份方式,恢复速度没有物理配备快,物理备份直接拷贝覆盖掉原来文件即可)。所以我为了跨平台,我更加愿意使用逻辑备份。存储sql文件形式。
双热机备份方式,目前硬件没有多个。技术人员有限,需要人力去维护,比较麻烦。所以排除在外。
方案:
1、总体策略:写个定时执行任务。定时在晚上或凌晨自动备份(考虑数据库服务器在运行中不能停机)
代码中做成备份成功后,把以前的删掉。避免很多数据占据磁盘。
2、考虑到初期数据量这么小。使用mysqldump进行备份吧。设置在凌晨几点(4-6点这个时候基本上没什么人访问)的时候自动备份。
3、使用逻辑备份方式:恢复速度1分钟左右的差距我是可以容忍的。所以我为了跨平台,我更加愿意使用逻辑备份。存储sql文件形式。
4、每天都进行备份。由于是在凌晨的时候mysqldump去锁定,访问数据库服务器。对服务器几乎没什么影响。所以每天都可以备份。每天都一个sql文件。那么将会很多文件。
所以,每次备份成功后。删除以前的文件。保留最近一个星期的备份sql文件。
备份工具的路径:/usr/bin/mysqldump
备份数据保存路径:/data/backdata/
5、备份脚本的编写
思路:
5.1 在shell脚本中调用mysqldump生成备份文件(这个工具可以生成sql文件到磁盘上去)
5.2 为了方便以后查找。每次备份的记录记录成日志形式。几点进行了备份操作,生成了什么文件名称。这样可以方便以后查阅哪天是否没有成功备份
删除的文件作为日志信息也记录下来。
5.3 让linux下的crontab进程调用脚本执行。
命令:crontab -e
打开的文件中加入代码:0 05 * * * 脚本的路径/mysqlback.sh
mysqlback.sh的内容:
# /bin/bash
DB_NAME="****"
DB_USER="****"
DB_PASS="****"
BIN_DIR="/usr/bin"
BACK_DIR="/data/backdata"
DATE="mysql-`date +'%Y%m%d-%H:%M:%S'`"
LogFile="$BACK_DIR"/dbbakup.log #日志记录保存的目录
BackNewFile=$DATE.sql
$BIN_DIR/mysqldump --opt --force -u$DB_USER -p$DB_PASS $DB_NAME > $BACK_DIR/$DATE.sql
echo -----------------------"$(date +"%y-%m-%d %H:%M:%S")"----------------------- >> $LogFile
echo createFile:"$BackNewFile" >> $LogFile
#find "/data/backdata/" -cmin +1 -type f -name "*.sql" -print > deleted.txt
#-ctime表示创建时间,这里表示删除创建时间为多少天之前的文件,也就是结果只保留多少天的数据
find "/data/backdata/" -ctime +7 -type f -name "*.sql" -print > deleted.txt
echo -e "delete files:\n" >> $LogFile
#循环删除匹配到的文件
cat deleted.txt | while read LINE
do
rm -rf $LINE
echo $LINE>> $LogFile
done
echo "---------------------------------------------------------------" >> $LogFile
- Mysql自动备份策略总结
- Mysql自动备份策略总结
- MYSQL自动备份策略的方案
- MYSQL自动备份策略的选择
- MYSQL自动备份策略的方案
- MYSQL自动备份策略的选择与实践
- MYSQL自动备份策略的选择与实践
- Mysql数据库备份策略
- mysql 备份恢复策略
- MySQl备份恢复策略
- mysql备份/恢复策略
- MySQL的备份的一些策略和方法的总结
- SqlServer自动备份策略设置
- MySQL 备份和恢复策略
- MySQL备份和还原策略
- mysql主从同步备份策略
- MySQL 备份和恢复策略
- MySQL 备份和恢复策略
- java反编译
- Mongodb数据分片的维护(新增分片到已有的分片复制集)
- Spring整合struts2的action的默认作用域
- event.srcElement.parentElement用法演示
- sql中如何解決 SUM(A) + SUM(B) != SUM (A+B)
- Mysql自动备份策略总结
- Linux下汇编语法和内嵌汇编
- 使用O(n)的时间复杂度合并两个数组
- 线程和String的用法
- [Erlang]巨坑第二弹
- 获得文件的MD5码
- 广西南宁便秘后期症状
- 请不要把痘痘想成不能治愈的病
- 广西南宁肛瘘检查费大约多少钱