#!/bin/sh
#MySQL Info
sqluser=root
sqlpsw=root
#sqluser2=root
#sqlpsw2=root
POSITION=/home/backup/position
if test ! -e $POSITION
then
#echo "The first time daily backup, the file of position deesn't exist or it's content is null"
mysql -u$sqluser -p$sqlpsw -e "show master status\G;" --default-character-set=gbk | awk '{print $2}' | sed -n '2,3p' > $POSITION
else
DATADIR=/data/mysql
BAKDIR=/home/backup/mysql/daily
TEMPDIR=/home/backup/mysql/temp
DATABASE1=a
DATABASE2=b
startbinlog=$(sed -n '1p' $POSITION)
startposition=$(sed -n '2p' $POSITION)
#echo "startbinlog: "$startbinlog
#echo "startposition: "$startposition
rm -rf $POSITION
mysql -u$sqluser -p$sqlpsw -e "show master status\G;" --default-character-set=gbk | awk '{print $2}' | sed -n '2,3p' > $POSITION
stopbinlog=$(sed -n '1p' $POSITION)
stopposition=$(sed -n '2p' $POSITION)
#echo "stopbinlog: "$stopbinlog
#echo "stopposition: "$stopposition
/usr/bin/mysqladmin -u$sqluser -p$sqlpsw flush-logs --default-character-set=GBK
#/usr/bin/mysqladmin -u$sqluser2 -p$sqlpsw2 flush-logs --default-character-set=GBK
BINLOGNAME='mysql-bin'
cd $DATADIR
FILELIST=$(cat $BINLOGNAME.index | cut -c3-)
if test "startbinlog" = "$stopbinlog"
then
#echo "startbinlog = stopbinlog"
mysqlbinlog --start-position=$startposition --stop-position=$stopposition -d $DATABASE1 $startbinlog >> $TEMPDIR/$DATABASE1$(date +%y%m%d)1.sql
mysqlbinlog --start-position=$startposition --stop-position=$stopposition -d $DATABASE2 $startbinlog >> $TEMPDIR/$DATABASE2$(date +%y%m%d)1.sql
else
startline=$(awk "/$startbinlog/{print NR}" $DATADIR/$BINLOGNAME.index)
stopline=$(wc -l $DATADIR/$BINLOGNAME.index | awk '{print $1}')
#echo "startline: "$startline
#echo "stopline: "$stopline
for i in $(seq $startline $stopline)
do
binlog=$(sed -n "$i"p $DATADIR/$BINLOGNAME.index | sed 's/.\///g')
#binlog=$(sed -n "$i"p $DATADIR/$BINLOGNAME.index | cut -c3-)
#echo "binlog: "$binlog
case "$binlog" in
"$startbinlog")
mysqlbinlog --start-position=$startposition -d $DATABASE1 $binlog >> $TEMPDIR/$DATABASE1$(date +%y%m%d)$i.sql
mysqlbinlog --start-position=$startposition -d $DATABASE2 $binlog >> $TEMPDIR/$DATABASE2$(date +%y%m%d)$i.sql;;
"$stopbinlog")
mysqlbinlog --stop-position=$stopposition -d $DATABASE1 $binlog >> $TEMPDIR/$DATABASE1$(date +%y%m%d)$i.sql
mysqlbinlog --stop-position=$stopposition -d $DATABASE2 $binlog >> $TEMPDIR/$DATABASE2$(date +%y%m%d)$i.sql;;
*)
mysqlbinlog -d $DATABASE1 $binlog >> $TEMPDIR/$DATABASE1$(date +%y%m%d)$i.sql
mysqlbinlog -d $DATABASE2 $binlog >> $TEMPDIR/$DATABASE2$(date +%y%m%d)$i.sql;;
esac
done
#echo "backup mysql binlog ok"
fi
sleep 2s
cd $TEMPDIR
#delete last daily backup tar files
rm -rf daily$DATABASE1$(date -d "-1 day" +%y%m%d).tar.gz
rm -rf daily$DATABASE2$(date -d "-1 day" +%y%m%d).tar.gz
tarname1=daily$DATABASE1$(date +%y%m%d).tar.gz
tarname2=daily$DATABASE2$(date +%y%m%d).tar.gz
tar czf $tarname1 ./$DATABASE1*
tar czf $tarname2 ./$DATABASE2*
sleep 1s
#ftp Info
ftphost=11.11.11.11
ftpname=dal
ftppsw=psw
REMOTEDIR=dailybackup
ftp -i -n <<!
open $ftphost
user $ftpname $ftppsw
type binary
cd $REMOTEDIR
put $tarname1
put $tarname2
close
bye
!
sleep 10s
#echo "end upload"
#cd $TEMPDIR
rm -rf $DATABASE1*
rm -rf $DATABASE2*
#echo "end"
fi
说明:
show master status:该命令查看当前的binlog及position。
mysqladmin -u$sqluser -p$sqlpsw flush-logs:mysql自动把内存中的日志放到日志文件binlog的最后一个文件里,并生成一个空的新日志文件,之后只需要备份前面的几个即可,最后一个因为是刚生成的,并且是空的,所以不需备份。
关于binlog可参考http://cxhyrf-sina-com.iteye.com/blog/1680055
大概思路:
在备份之前需先执行一次。第一次执行备份时,利用show master status获得startbinlog、startposition,并放到position文件中;之后每次执行,都获取当前的binlog、position作为stopbinlog、stopposition,并放到position文件中,之后flush-logs。利用startbinlog、startposition、stopbinlog、stopposition及binlog即可导出相应的sql,之后压缩、ftp,然后就ok了。
分享到:
相关推荐
全量备份是整个数据库的副本,增量备份只备份自上次备份以来更改的数据,而差异备份则备份自上次全量备份以来更改的数据。 5. **测试和验证**: 定期测试备份的完整性和可恢复性至关重要。你可以选择定期恢复一些...
本测试中并未详细描述增量备份的过程,但提到全量及增量备份集均可用于恢复,说明增量备份也在恢复过程中起到了补充作用。 3. **恢复验证**:恢复后,通过检查数据库中的数据更新时间(如`mysql.innodb_table_stats...
备份主要分为全量备份和增量备份,全量备份是复制所有数据,而增量备份只备份自上次备份以来发生更改的数据。 2. **Linux环境**:Linux是一种自由和开放源码的操作系统,通常用于服务器环境,因为它稳定且高效。在...
4. **二进制日志**: MySQL的二进制日志记录了所有改变数据库的数据更改事件,可用于增量备份和恢复。 在CentOS 8中,备份策略可能还包括系统级别的快照,例如使用LVM快照或Rsync,这样可以同时保护MySQL数据和系统...
Redmine在Windows下实现自动备份和异地备份 1.Redmine备份内容 Redmine在Windows下的自动备份实现,包括: 1)Redmine目录的全备份(1周或1个月备份1次,由windows计划来调度执行),将整个Redmine安装的文件夹全部...
- **异地备份**:将备份文件存放在不同的地理位置,以提高容灾能力。 #### 五、备份注意事项 在进行MySQL备份时,还需要注意以下几点: - **备份文件的安全性**:备份文件中可能包含敏感信息,因此需要加密存储。...
总结来说,MySQL的备份和恢复策略应该综合考虑全量备份、增量备份、binlog以及主从复制,同时结合异地容灾和定期演练,以达到RPO(恢复点目标)和RTO(恢复时间目标)。这样的方案可以有效防止数据丢失,保障业务...
3. 异地备份:在不同地理位置存储备份,以应对地区性灾难。 五、MySQL数据库还原 1. 使用SQL脚本还原:通过执行由mysqldump生成的SQL文件恢复数据库。 2. 物理文件还原:适用于InnoDB引擎,将备份文件直接替换到...
但MySQL本身并不直接支持真正意义上的增量备份,需要结合其他工具如Percona Xtrabackup。 4. **配置文件DumpRestoreMysqlData.cfg**:可能包含了备份策略、数据库连接信息、备份路径等设置,用于自动化备份脚本。 ...
MySQL全量和增量备份是数据库管理中的重要环节,确保数据安全和业务连续性。这篇文档主要介绍了如何在Linux环境中利用mysqldump工具创建自动备份脚本,包括全量备份和远程备份。以下是对该备份方案的详细说明: 1. ...
10. **灾备与高可用性**:逻辑备份只是灾备方案的一部分,完整的灾备体系还包括冗余硬件、复制技术(如主从复制、组复制)以及异地备份,以确保在灾难发生时能快速恢复服务。 总结来说,MySQL逻辑备份恢复是数据库...
针对上述问题,自定义备份方案通常会结合MySQL的特性,比如使用InnoDB存储引擎的事务日志(Binary Log)和增量备份。通过编写脚本,可以实现定期备份主数据和二进制日志,确保在数据丢失后能够精确恢复到某个时间点...
备份策略通常包括完整备份、增量备份和差异备份,以平衡数据恢复速度与存储空间的使用。 在MySQL中,有多种方式进行数据备份,包括使用mysqldump工具、MySQL Enterprise Backup(MEB)、InnoDB Hot Backup等。这里...
除了全库备份外,MySQL 还支持增量备份和差异备份。 1. **增量备份**:只备份自上次备份以来发生变化的数据。这种方式可以显著减少备份所需的时间和空间。 ```bash mysqldump -u username -p --single-...
数据库FTP异地备份是一种重要的数据保护策略,它通过网络将数据库的备份文件传输到远程服务器或存储设备上,以防止本地灾难性事件导致的数据丢失。在本文中,我们将深入探讨这一主题,了解其工作原理、重要性和实施...
XtraBackup还支持流式压缩传输,可以将备份数据传输到其他服务器上,这对于维护数据的异地备份以及在多机房环境中保持数据一致非常有用。在创建主从同步架构时,XtraBackup也能够轻易实现数据的快速同步,使数据库...
3. 可以考虑采用复制的方法来做异地备份,但不能代替备份,它对数据库的误操作也无能为力。 4. 要定期做备份,备份的周期要充分考虑系统可以承受的恢复时间。备份要在系统负载较小的时候进行。 5. 确保 MySQL 打开...
本方案旨在提供一个 MySQL数据库备份与恢复的解决方案,包括数据库备份、异地备份和文件备份三部分。 一、数据库备份 数据库备份是确保数据安全的重要步骤。备份的方式可以是完全备份,也可以是增量备份。完全备份...
6. **异地备份**:将备份文件存放在与数据文件不同的物理位置,以防物理灾难导致的数据丢失。 7. **使用更新日志**:确保更新日志也被备份,以便在需要时进行恢复。 8. **文件系统选择**:尽量将备份文件放置在与...
异地备份软件,尤其是在SQL数据库环境下,是保护企业数据安全的重要工具。这种软件的主要目标是确保在发生灾难性事件,如硬件故障、自然灾害或恶意攻击时,企业的关键数据能得到及时恢复,保证业务连续性。SQL数据库...