欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

MySQL 备份和恢复策略详细教程

程序员文章站 2022-05-14 23:05:53
...

在数据库表丢失或损坏的情况下,备份你的数据库是很重要的。如果发生系统崩溃,你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。本文主要对MyISAM表做备份恢复。 备份策略一:直接拷贝数据库文件(不推荐) 备份策略二:使用mysqlhotcopy备

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