分类: Mysql/postgreSQL
2008-01-04 15:22:02
在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。
备份策略一:直接拷贝数据库文件(不推荐)
备份策略二:使用mysqlhotcopy备份数据库(完全备份,适合小型数据库备份)
备份策略三:使用mysqldump备份数据库(完全+增量备份,适合中型数据库备份)
备份策略四:使用主从复制机制(replication)(实现数据库实时备份)
本备份策略适合于小型数据库的备份,数据量不大,可以采用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
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 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)、恢复数据库到备份时的状态
shell> chown -R mysql:mysql /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)
本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。
备份策略三、使用mysqldump备份数据库
备份策略三、使用mysqldump备份数据库
mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。mysqldump 比直接拷贝要慢些。关于mysqldump的更详细解释见最后的附录。
备份策略布置:
(1)、创建备份目录
Shell> mkdir /tmp/mysqlbackup
Shell> mkdir /tmp/mysqlbackup/daily
(2)、启用二进制日志
然后启动 mysqld 就可以了。运行过程中会产生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的更详细信息请查看手册。
(3)、配置SSH密钥登录,用于将MySQL备份传送到备份服务器(如果备份服务器为Windows,请跳过此部)。
1)、在MySQL所在服务器(192.168.0.20)生成SSH密钥
(4)、设置crontab任务,每天执行备份脚本
shell> crontab -e
#每个星期日凌晨3:00执行完全备份脚本
0 3 * * 0 /root/MySQLBackup/mysqlFullBackup.sh >/dev/null 2>&1
#周一到周六凌晨3:00做增量备份
0 3 * * 1-6 /root/MySQLBackup/mysqlDailyBackup.sh >/dev/null 2>&1
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" 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
# Delete daily backup files.
# Delete old backup files(mtime>2).
# 如果不需要将备份传送到备份服务器或备份服务器为Windows,请将标绿的行注释掉 # Move Backup Files To Backup Server. #适合Linux(MySQL服务器)到Linux(备份服务器)
echo "Move Backup Files To Backup Server Success!" >> $eMailFile else echo "Move Backup Files To Backup Server Fail!" >> $eMailFile fi else
fi # 写日志文件 echo "--------------------------------------------------------" >> $logFile cat $eMailFile >> $logFile # 发送邮件通知 cat $eMailFile | mail -s "MySQL Backup" $eMail |
(5) 、恢复数据库到备份时的状态
ls 命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(注意:如果你修改任何一个文件,你将改变排序次序,这将导致更新日志以错误的次序被运用。)