在数据库表丢失或损坏的状况下,备份你的数据库是很重要的。若是发生系统崩溃,你确定想可以将你的表尽量丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表作备份恢复。mysql
备份策略一:直接拷贝数据库文件(不推荐)sql
备份策略二:使用mysqlhotcopy备份数据库(彻底备份,适合小型数据库备份)shell
备份策略三:使用mysqldump备份数据库(彻底+增量备份,适合中型数据库备份)数据库
备份策略四:使用主从复制机制(replication)(实现数据库实时备份)服务器
脚本下载地址:点击下载脚本索引
备份策略1、直接拷贝数据库文件crontab
直接拷贝数据文件最为直接、快速、方便,但缺点是基本上不能实现增量备份。为了保证数据的一致性,须要在备份文件前,执行如下 SQL 语句:ip
FLUSH TABLES WITH READ LOCK;内存
也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程当中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下便可。it
备份策略2、使用mysqlhotcopy备份数据库
mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上,而且mysqlhotcopy 只能用于备份 MyISAM表。
本备份策略适合于小型数据库的备份,数据量不大,能够采用mysqlhotcopy程序天天进行一次彻底备份。
备份策略布置:
(1)、安装DBD-mysql perl模块,支持mysqlhotcopy脚本链接到MySQL数据库。
shell> tar -xzvf DBD-mysql-4.005.tar.gz
shell> cd DBD-mysql-4.005
shell> unset LANG
shell> perl Makefile.PL -mysql_config=/usr/local/mysql/bin/mysql_config -testuser=root -testpassword=UserPWD
shell> make
shell> make test
shell> make install
(2)、设置crontab任务,天天执行备份脚本
shell> crontab -e
0 3 * * * /root/MySQLBackup/mysqlbackup.sh >/dev/null 2>&1
天天凌晨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
rm -rf $tmpBackupDir/*
else
mkdir $tmpBackupDir
fi
# 若是备份目录不存在则建立它
if [[ ! -e $backupDir ]];then
mkdir $backupDir
fi
# 清空MySQLBackup.log
if [[ -s MySQLBackup.log ]]; then
cat /dev/null >MySQLBackup.log
fi
# 获得数据库备份列表,在此能够过滤不想备份的数据库
for databases in `find $dataDir -type d | \
sed -e "s/\/usr\/local\/mysql\/data\///" | \
sed -e "s/test//"`; do
if [[ $databases == "" ]]; then
continue
else
# 备份数据库
/usr/local/mysql/bin/mysqlhotcopy --user=$mysqlUser --password=$mysqlPWD -q "$databases" $tmpBackupDir
dateTime=`date "+%Y.%m.%d %H:%M:%S"`
echo "$dateTime Database:$databases backup success!" >>MySQLBackup.log
fi
done
# 压缩备份文件
date=`date -I`
cd $tmpBackupDir
tar czf $backupDir/mysql-$date.tar.gz ./
# 发送邮件通知
if [[ -s MySQLBackup.log ]]; then
cat MySQLBackup.log | mail -s "MySQL Backup" $eMail
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 BackupServer
smbclient //$BackupServer/$BackupShare \
$BackupPW -d0 -W WORKGROUP -U $BackupUser \
-c "put $BackupDir/mysql-$date.tar.gz \
mysql-$date.tar.gz"
# Delete temp files
rm -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)。