本文共 10207 字,大约阅读时间需要 34 分钟。
在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。
备份策略一:直接拷贝数据库文件(不推荐)
备份策略二:使用mysqlhotcopy备份数据库(完全备份,适合小型数据库备份)
备份策略三:使用mysqldump备份数据库(完全+增量备份,适合中型数据库备份)
备份策略四:使用主从复制机制(replication)(实现数据库实时备份)
备份策略一、直接拷贝数据库文件
直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行以下
FLUSH
也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。
备份策略二、使用mysqlhotcopy备份数据库
mysqlhotcopy
本备份策略适合于小型数据库的备份,数据量不大,可以采用mysqlhotcopy程序每天进行一次完全备份。
备份策略布置:
(1)、安装DBD-mysql
shell>
shell>
shell>
shell>
shell>
shell>
shell>
(2)、设置crontab任务,每天执行备份脚本
shell>
0
每天凌晨3:00执行备份脚本。
mysqlbackup.sh注释:
#!/bin/sh
# Name:mysqlbackup.sh
# PS:MySQL DataBase Backup,Use mysqlhotcopy script.
# Write by:i.Stone
# Last Modify:2007-11-15
#
# 定义变量,请根据具体情况修改
# 定义脚本所在目录
scriptsDir=`pwd`
# 数据库的数据目录
dataDir=/usr/local/mysql/data/
# 数据备份目录
tmpBackupDir=/tmp/tmpbackup/
backupDir=/tmp/mysqlbackup/
# 用来备份数据库的用户名和密码
mysqlUser=root
mysqlPWD=111111
# 定义eMail地址
eMail=alter@somode.com
# 如果临时备份目录存在,清空它,如果不存在则创建它
if [[ -e $tmpBackupDir ]]; then
else
fi
# 如果备份目录不存在则创建它
if [[ ! -e $backupDir ]];then
fi
# 清空MySQLBackup.logif [[ -s MySQLBackup.log ]]; then
fi
# 得到数据库备份列表,在此可以过滤不想备份的数据库for databases in `find $dataDir -type d | \
# 备份数据库
done
# 压缩备份文件date=`date -I`
cd $tmpBackupDir
tar czf $backupDir/mysql-$date.tar.gz ./
# 发送邮件通知if [[ -s MySQLBackup.log ]]; then
fi
# 使用smbclientmv.sh脚本上传数据库备份到备份服务器# $scriptsDir/smbclientmv.sh
smbclientmv.sh注释
#!/bin/sh
# Name:smbclientmv.sh
# PS:Move the data to Backup Server.
# Write by:i.Stone
# Last Modify:2007-11-15
#
# 定义变量
# 备份服务器名
BackupServer="BackupServerName"
# 共享文件夹名
BackupShare="ShareName"
# 备份服务器的访问用户名和密码
BackupUser="SMBUser"
BackupPW="SMBPassword"
# 定义备份目录
BackupDir=/tmp/mysqlbackup
date=`date -I`
# Move the data to BackupServersmbclient //$BackupServer/$BackupShare \
$BackupPW -d0 -W WORKGROUP -U $BackupUser \
-c "put $BackupDir/mysql-$date.tar.gz \
mysql-$date.tar.gz"
# Delete temp filesrm -f $BackupDir/mysql-$date.tar.gz
(3)、恢复数据库到备份时的状态 mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例: shell> cp -rf db_name /usr/local/mysql/data/ shell> chown -R mysql:mysql /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户) 本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。
备份策略三、使用mysqldump备份数据库
mysqldump
对于中等级别业务量的系统来说,备份策略可以这么定:第一次完全备份,每天一次增量备份,每周再做一次完全备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在
备份策略布置:
(1)、创建备份目录
Shell>
Shell>
(2)、启用二进制日志
采用
启用
[mysqld]
log-bin
然后启动
(3)、配置SSH密钥登录,用于将MySQL备份传送到备份服务器(如果备份服务器为Windows,请跳过此部)。
1)、在MySQL所在服务器(192.168.0.20)生成SSH密钥
[root@lab
Generating
Enter
Enter
Enter
Your
Your
The
c2:96:9f:2d:5a:8e:08:42:43:35:2f:85:5e:72:f8:1c
2)、在备份服务器(192.168.0.200)上创建目录,修改权限,并传送公钥。
[root@lab
The
RSA
Are
Warning:
root@192.168.0.200's
[root@lab
root@192.168.0.200's
id_rsa.pub
3)、测试SSH登录
[root@lab
Last
[root@lib
(4)、设置crontab任务,每天执行备份脚本
shell>
#每个星期日凌晨3:00执行完全备份脚本
0
#周一到周六凌晨3:00做增量备份
0
mysqlFullBackup.sh注释:
#!/bin/sh
# Name:mysqlFullBackup.sh
# PS:MySQL DataBase Full Backup.
# Write by:i.Stone
# Last Modify:2007-11-17
#
# Use mysqldump --help get more detail.
#
# 定义变量,请根据具体情况修改
# 定义脚本目录
scriptsDir=`pwd`
# 定义数据库目录
mysqlDir=/usr/local/mysql
# 定义用于备份数据库的用户名和密码
user=root
userPWD=111111
# 定义备份目录
dataBackupDir=/tmp/mysqlbackup
# 定义邮件正文文件
eMailFile=$dataBackupDir/email.txt
# 定义邮件地址
eMail=alter@somode.com
# 定义备份日志文件
logFile=$dataBackupDir/mysqlbackup.log
DATE=`date -I`
echo "" > $eMailFile
echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile
cd $dataBackupDir
# 定义备份文件名
dumpFile=mysql_$DATE.sql
GZDumpFile=mysql_$DATE.sql.tar.gz
# 使用mysqldump备份数据库,请根据具体情况设置参数$mysqlDir/bin/mysqldump -u$user -p$userPWD \
--opt --default-character-set=utf8 --extended-insert=false \
--triggers -R --hex-blob --all-databases \
--flush-logs --delete-master-logs \
--delete-master-logs \
-x > $dumpFile
# 压缩备份文件if [[ $? == 0 ]]; then
# Move Backup Files To Backup Server.
#适合Linux(MySQL服务器)到Linux(备份服务器)
fi
# 写日志文件
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile
# 发送邮件通知
cat $eMailFile | mail -s "MySQL Backup" $eMail
#!/bin/sh # Name:mysqlDailyBackup.sh # PS:MySQL DataBase Daily Backup. # Write by:i.Stone # Last Modify:2007-11-17 # # 定义变量,请根据具体情况修改 # 定义数据库目录和数据目录 scriptsDir=`pwd` mysqlDir=/usr/local/mysql dataDir=$mysqlDir/data # 定义用于备份数据库的用户名和密码 user=root userPWD=111111 # 定义备份目录,每日备份文件备份到$dataBackupDir/daily dataBackupDir=/tmp/mysqlbackup dailyBackupDir=$dataBackupDir/daily # 定义邮件正文文件 eMailFile=$dataBackupDir/email.txt # 定义邮件地址 eMail=alter@somode.com # 定义日志文件 logFile=$dataBackupDir/mysqlbackup.log # 得到数据库所在主机的主机名 HOSTNAME=`uname -n` # echo "" > $eMailFile echo $(date +"%y-%m-%d %H:%M:%S") >> $eMailFile # # 刷新日志,使数据库使用新的二进制日志文件 $mysqlDir/bin/mysqladmin -u$user -p$userPWD flush-logs cd $dataDir # 得到二进制日志列表 fileList=`cat $HOSTNAME-bin.index` iCounter=0 for file in $fileList do
# 如果不需要将备份传送到备份服务器或备份服务器为Windows,请将标绿的行注释掉 # Move Backup Files To Backup Server. #适合Linux(MySQL服务器)到Linux(备份服务器)
rsyncBackup.sh注释:
#!/bin/sh # Name:rsyncBackup.sh # PS:Move Backup Files To Backup Server. # Write by:i.Stone # Last Modify:2007-11-17 # # 请根据具体情况修改,注意最后有“/” # 定义数据库备份目录 dataBackupDir=/tmp/mysqlbackup/ # 定义备份服务器上存放备份数据的目录 backupServerDir=/root/mysqlbackup/ # 定义备份服务器 backupServer=192.168.0.200 # # 同步备份文件到备份服务器 rsync -a --delete $dataBackupDir -e ssh $backupServer:$backupServerDir > /dev/null 2>&1
rmBackup.sh注释:
#!/bin/sh # Name:rmBackup.sh # PS:Delete old Backup. # Write by:i.Stone # Last Modify:2007-11-15 # # 定义备份目录 dataBackupDir=/tmp/mysqlbackup # 删除mtime>2的日志备份文件 find $dataBackupDir -name "mysql_*.gz" -type f -mtime +2 -exec rm {} \; > /dev/null 2>&1
(5)
用
/usr/local/mysql/bin/mysql
对于任何可适用的更新日志,将它们作为
%
ls
本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。如果使用本套备份脚本,将日志文件和数据文件放到不同的磁盘上是一个不错的主义,这样不仅可以提高数据写入速度,还能使数据更安全。
转载地址:https://linuxstyle.blog.csdn.net/article/details/6600889 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!