`
michaeltangbin
  • 浏览: 271769 次
  • 性别: Icon_minigender_1
  • 来自: 黑龙江省
社区版块
存档分类
最新评论

mysql 备份和恢复策略

阅读更多

在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。

 

备份策略一:直接拷贝数据库文件(不推荐)

备份策略二:使用mysqlhotcopy备份数据库(完全备份,适合小型数据库备份)

备份策略三:使用mysqldump备份数据库(完全+增量备份,适合中型数据库备份)

备份策略四:使用主从复制机制(replication)(实现数据库实时备份)

 

脚本下载地址:点击下载脚本

 

备份策略一、直接拷贝数据库文件

直接拷贝数据文件最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在备份文件前,执行以下 SQL 语句:

FLUSH TABLES WITH READ LOCK;

也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。

 

备份策略二、使用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)。

备份策略三、使用mysqldump备份数据库

mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。mysqldump 比直接拷贝要慢些。关于mysqldump的更详细解释见最后的附录。

对于中等级别业务量的系统来说,备份策略可以这么定:第一次完全备份,每天一次增量备份,每周再做一次完全备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备份。

备份策略布置:

(1)、创建备份目录

Shell> mkdir /tmp/mysqlbackup

Shell> mkdir /tmp/mysqlbackup/daily

(2)、启用二进制日志

采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。

启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 /etc/my.cnf,加入以下几行:

[mysqld]

log-bin

然后启动 mysqld 就可以了。运行过程中会产生 HOSTNAME-bin.000001 以及 HOSTNAME-bin.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的更详细信息请查看手册。

(3)、配置SSH密钥登录,用于将MySQL备份传送到备份服务器(如果备份服务器为Windows,请跳过此部)。

1)、在MySQL所在服务器(192.168.0.20)生成SSH密钥

[root@lab ~]# ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/root/.ssh/id_rsa):  //直接回车

Enter passphrase (empty for no passphrase):         //直接回车,不使用密码

Enter same passphrase again:                     //直接回车,不使用密码

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

c2:96:9f:2d:5a:8e:08:42:43:35:2f:85:5e:72:f8:1c root@lab

 

2)、在备份服务器(192.168.0.200)上创建目录,修改权限,并传送公钥。

[root@lab ~]# ssh 192.168.0.200 "mkdir .ssh;chmod 0700 .ssh"

The authenticity of host '192.168.0.200 (192.168.0.200)' can't be established.

RSA key fingerprint is 37:57:55:c1:32:f1:dd:bb:1b:8a:13:6f:89:fb:b8:9d.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added '192.168.0.200' (RSA) to the list of known hosts.

root@192.168.0.200's password:     //输入备份服务器的root密码

[root@lab ~]# scp .ssh/id_rsa.pub 192.168.0.200:.ssh/authorized_keys2

root@192.168.0.200's password: 

id_rsa.pub                                             100%  218     0.2KB/s   00:00    

3)、测试SSH登录

[root@lab ~]# ssh 192.168.0.200       //测试SSH登录

Last login: Fri Nov 16 10:34:02 2007 from 192.168.0.20

[root@lib ~]# 

 

(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") >> $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

  tar czf $GZDumpFile $dumpFile >> $eMailFile 2>&1

  echo "BackupFileName:$GZDumpFile" >> $eMailFile

  echo "DataBase Backup Success!" >> $eMailFile

  rm -f $dumpFile


# Delete daily backup files.

  cd $dataBackupDir/daily

  rm -f *


# Delete old backup files(mtime>2).

  $scriptsDir/rmBackup.sh


# 如果不需要将备份传送到备份服务器或备份服务器为Windows,请将标绿的行注释掉

# Move Backup Files To Backup Server.

#适合Linux(MySQL服务器)到Linux(备份服务器)

  $scriptsDir/rsyncBackup.sh

  if (( !$? )); then

    echo "Move Backup Files To Backup Server Success!" >> $eMailFile

    else

    echo "Move Backup Files To Backup Server Fail!" >> $eMailFile

  fi


else

  echo "DataBase Backup Fail!" >> $emailFile

fi

# 写日志文件

echo "--------------------------------------------------------" >> $logFile

cat $eMailFile >> $logFile

# 发送邮件通知

cat $eMailFile | mail -s "MySQL Backup" $eMail

 

mysqlDailyBackup.sh注释: 

#!/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
  iCounter=`expr $iCounter + 1`
done
nextNum=0
iFile=0
for file in $fileList
do
  binLogName=`basename $file`
  nextNum=`expr $nextNum + 1`
# 跳过最后一个二进制日志(数据库当前使用的二进制日志文件)
  if [[ $nextNum == $iCounter ]]; then
    echo "Skip lastest!" > /dev/null
  else
    dest=$dailyBackupDir/$binLogName
# 跳过已经备份的二进制日志文件
    if [[ -e $dest ]]; then
      echo "Skip exist $binLogName!" > /dev/null
    else
# 备份日志文件到备份目录
      cp $binLogName $dailyBackupDir
      if [[ $? == 0 ]]; then
        iFile=`expr $iFile + 1`
        echo "$binLogName Backup Success!" >> $eMailFile
      fi
    fi
  fi
done
if [[ $iFile == 0 ]];then
  echo "No Binlog Backup!" >> $eMailFile
else
  echo "Backup $iFile File(s)." >> $eMailFile
  echo "Backup MySQL Binlog OK!" >> $eMailFile

# 如果不需要将备份传送到备份服务器或备份服务器为Windows,请将标绿的行注释掉
# Move Backup Files To Backup Server.
#适合Linux(MySQL服务器)到Linux(备份服务器)

  $scriptsDir/rsyncBackup.sh
  if [[ $? == 0 ]]; then
    echo "Move Backup Files To Backup Server Success!" >> $eMailFile
  else
    echo "Move Backup Files To Backup Server Fail!" >> $eMailFile
  fi
fi
# 发送邮件通知
cat $eMailFile | mail -s "MySQL Backup" $eMail
# 写日志文件
echo "--------------------------------------------------------" >> $logFile
cat $eMailFile >> $logFile

 

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) 、恢复数据库到备份时的状态

用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,直接用 mysql 客户端导入就可以了。 

/usr/local/mysql/bin/mysql -uroot -pUserPWD db_name < db_name.sql

对于任何可适用的更新日志,将它们作为 mysql 的输入: 

  % ls -t -r -1 HOSTNAME-bin* | xargs mysqlbinlog | mysql -uUser -pUserPWD 

ls 命令生成更新日志文件的一个单列列表,根据服务器产生它们的次序排序(注意:如果你修改任何一个文件,你将改变排序次序,这将导致更新日志以错误的次序被运用。)

本套备份策略只能恢复数据库到最后一次备份时的状态,要想在崩溃时丢失的数据尽量少应该更频繁的进行备份,要想恢复数据到崩溃时的状态请使用主从复制机制(replication)。如果使用本套备份脚本,将日志文件和数据文件放到不同的磁盘上是一个不错的主义,这样不仅可以提高数据写入速度,还能使数据更安全。

?/P>

 

备份策略四、使用主从复制机制(replication)

详情:点击阅读

脚本下载地址:点击下载脚本

分享到:
评论

相关推荐

    MySQL 备份和恢复策略

    MySQL 数据库的备份和恢复是数据库管理中至关重要的环节,...对于小型数据库,`mysqlhotcopy` 提供了一个快速、简单的解决方案,而大型或复杂的系统可能需要采用更复杂的备份和恢复策略,确保数据的完整性和可靠性。

    MySQL数据库备份和恢复

    MySQL作为全球最流行的开源关系型数据库管理系统之一,其备份和恢复策略是确保数据安全和系统高可用性的关键环节。本文将深入探讨MySQL数据库的备份与恢复机制,涵盖主要的备份工具、技术细节以及最佳实践,旨在为...

    nbu&mysql备份恢复.docx

    NBU&MySQL备份恢复 NBU(NetBackup)是一款功能强大的备份恢复软件,而MySQL是一款流行的关系型数据库管理系统。本文将详细介绍如何使用NBU来备份和恢复MySQL数据库。 NBU备份mysql的优势 使用NBU备份mysql数据库...

    mysql备份和恢复方案

    MySQL备份和恢复是数据库管理中的关键环节,旨在保护数据免受意外损失,如硬件故障、软件错误或数据损坏。在本方案中,我们将探讨两种主要的备份策略,并讨论如何实施有效的恢复计划,确保数据安全和应用程序的连续...

    MySQL 备份和恢复

    MySQL的备份和恢复是数据库管理的关键环节,确保数据的...总的来说,MySQL备份和恢复需要根据不同的表类型和需求选择合适的工具和策略。定期备份、测试恢复过程以及了解备份参数的正确使用是保证数据安全的关键步骤。

    mysql数据库备份和恢复工具

    本文将深入探讨MySQL数据库的备份与恢复策略,并提供相关工具的使用指南。 一、MySQL备份的重要性 数据库备份是防止数据丢失的关键步骤。无论是系统故障、硬件损坏、恶意攻击还是人为错误,都有可能导致数据丢失。...

    阿里云 RDS for MySQL 备份文件恢复至自建数据库 .docx

    首先,需要登录 RDS 管理控制台,选择正确的实例所在区域,例如:华北 2(北京),点击想要恢复的实例,在左侧导航栏中选择备份恢复。在数据备份标签中可以看到本实例的全部备份文件信息。找到想要恢复的时间点或者...

    UNIX下MySQL 备份和恢复

    在UNIX环境下,MySQL数据库的备份和恢复是数据库管理...总之,UNIX环境下的MySQL备份和恢复需要根据表类型选择合适的工具和策略。理解并熟练运用这些工具的参数和选项,能有效确保数据安全,同时提高备份和恢复的效率。

    MySQL备份和恢复的最佳实践指南

    MySQL 备份和恢复的最佳...通过遵循备份策略、选择适当的备份工具和实施恢复策略,可以最大限度地减少数据丢失和系统停机的风险。除此之外,定期监控备份任务和测试灾难恢复计划也是保障数据安全和可靠性的重要手段。

    阿里MySQL备份恢复指南

    总的来说,阿里MySQL备份恢复指南是一份全面的资源,它将帮助用户深入了解阿里云环境下的数据库备份与恢复机制,提高数据管理和灾难恢复的能力。通过掌握这些知识,用户可以更自信地应对可能出现的数据安全挑战,...

    Mysql数据库备份恢复测试报告-xtrabackup.docx

    通过这次测试,我们可以了解到MySQL数据库的备份恢复流程,以及如何验证恢复的正确性。同时,也强调了恢复过程中服务器性能的重要性,以及备份策略对于数据保护的关键性。在实际环境中,企业应根据自身需求制定合适...

    Effective MySQL之备份与恢复.pdf

    《Effective MySQL之备份与恢复》对照讲解不同的备份和恢复策略,将帮助您防止MySQL数据因范围广泛的各种灾难受到损坏。主要内容理解不同备份策略如何影响锁定和系统可用性了解静态备份选项和时间点要求的重要性体会...

    mysql备份恢复代码实例.zip

    "mysql备份恢复代码实例.zip" 提供了一组实际的代码示例,帮助我们理解并实施MySQL的备份与恢复操作。在这个压缩包中,你将找到关于如何在MySQL环境中执行这些操作的具体步骤。 首先,MySQL的备份通常分为全量备份...

    MySQL备份与恢复记录

    MySQL备份与恢复是数据库管理中的关键任务,确保数据安全和业务连续性。在本文中,我们将探讨两种主要的MySQL备份方法——冷备份和工具...同时,合理规划存储空间和选择合适的恢复策略也是确保业务连续性的重要因素。

    mysql数据备份恢复

    总结,MySQL 数据备份恢复涉及多种策略和工具,理解并熟练掌握这些方法对于保障数据库安全至关重要。在实际操作中,应根据业务需求和资源条件选择合适的备份恢复方案,并定期进行演练,确保在关键时刻能够快速、准确...

    mysql数据库备份与恢复

    在IT行业中,数据库管理是至关重要的任务之一,特别是在企业级应用中。MySQL作为一款流行的开源关系型数据库管理...同时,合理的备份策略和恢复流程能确保在数据丢失或故障发生时,能够快速恢复服务,减少业务中断。

    mysql数据库备份和恢复

    本篇文章将深入探讨MySQL数据库的备份与恢复策略,以及如何使用`mysqldump`和`mysql`命令来执行这些操作。 首先,让我们了解为什么数据库备份是必要的。在日常运营中,数据库可能会遭受硬件故障、软件错误、恶意...

    mysql的备份、恢复策略

    MySQL数据库的备份与恢复策略是确保数据安全的重要环节。在面临数据丢失或系统故障时,有效的备份策略可以最大程度地减少损失。以下是对标题和描述中提及的四种备份策略的详细说明: 1. **直接拷贝数据库文件**:...

Global site tag (gtag.js) - Google Analytics