总结下几种常用的mysql备份方法:
一、直接拷贝数据库文件
首先把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入:
代码如下 | 复制代码 |
mysql>FLUSH TABLES WITH READ LOCK; 使用tar或cp等命令备份数据库文件,这里使用tar: tar zcvf /backup/mysql_$(date "+%Y%m%d").tar.gz /var/lib/mysql |
c、备份完后解锁数据表
mysql> unlock tables;这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。需要注意,对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 表损坏时,就可以依靠这些日志文件来恢复。
二、 使用mysqlhotcopy备份
mysqlhotcopy 是一个 PERL 程序,使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。
mysqlhotcopy 只能用于备份 MyISAM。
例:
把数据库test备份到/backup目录下:
代码如下 | 复制代码 |
/usr/local/mysql/bin/mysqlhotcopy -uroot -pxxx test /backup |
mysqlhotcopy在执行前将会锁定数据库,执行完毕后将自动释放锁定
还原:
mysqlhotcopy 备份出来的是整个数据库目录,还原时直接拷贝覆盖就行了,注意权限问题
代码如下 | 复制代码 |
cp -rf /backup/test /var/lib/mysql/ |
注意,想要使用 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,并且还必须要能够有读取 datadir/db_name 目录的权限。
三、mysqldump
mysqldump 是SQL级别的备份机制,它将数据表导成 SQL 脚本文件,可以方便的在不同的mysql版本间进行恢复或升级,这也是最常用的备份方法。
例:
使用mysqldump备份:
代码如下 | 复制代码 |
/usr/local/mysql/bin/mysqldump -uroot -pxxx --opt test >/backup/test.sql 还原: /usr/local/mysql/bin/mysqldump -uroot -pxxx test |
四、使用主从复制机制(replication)(实现数据库实时备份)推荐
五、mysql自动备份脚本,使用mysqldump工具
代码如下 | 复制代码 |
#!/bin/bash #caishzh 20120509 BAKDIR="/backup/mysql" #mysql备份目录 MAIL="xxx@xxx.com" #邮箱地址 USER="root" #mysql用户名 PASSWD="jjj" #mysql密码 DB="test" #数据库名 DATE=$(date "+%Y%m%d") #日期 [ -d "$BAKDIR" ] || mkdir -p "$BAKDIR" #如果备份目录不存在则创建 mysqldump -opt -u$USER -p$PASSWD $DB |gzip > $BKDIR/$DB_$DATA.gz #备份并使用gzip打包 if [ $? -eq 0 ];then #echo "$DB mysql backup" |mutt $MAIL -a $BKDIR/$DB_$DATA.sql -s "$DB mysql backup" ls -lh $BAKDIR/*.gz>$BAKDIR/messages.txt mutt $MAIL -a $BKDIR/$DB_$DATA.gz -s "$DATE:$DB mysql backup" < $BAKDIR/messages.txt else echo "$DATE mysql backup failed"|mail -s "$DATE msyql bacup failed" $MAIL fi |
六,此方法只可用于windows主机
假想环境:
MySQL 安装位置:C:/MySQL
数据库名称为:bbs
数据库备份目的地:d:/db_bak/
============================
新建db_bak.bat,写入以下代码
代码如下 | 复制代码 |
net stop mysql xcopy c:/mysql/data/bbs/*.* d:/db_bak/bbs/%date:~0,3%/ /y net start mysql 或者 net stop mysql xcopy D:/Mysql/data D:/Mysql/BAK/BAK-%date:~0,10% /S/E/I net start mysql |
然后使用Windows的“计划任务”定时执行该批处理脚本即可。(例如:每天凌晨3点执行back_db.bat)
保存一周的数据,用%date:~0,3%,保存每天的数据,用%date:~4,10%
代码如下 | 复制代码 |
xcopy c:/. d:/aaa /s/e XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/C] [/I] [/Q] [/F] [/L] [/ [/K] [/N] [/O] [/X] [/Y] [/ [/EXCLUDE:file1[+file2][+fi |
七,linux增量备份
代码如下 | 复制代码 |
#!/bin/sh #+++++++++++++mysqlback++++++++++++ #a mysql incremental backup script. #by flute #++++++++++++++++++++++++++++++++++ BAK_DIR="." while getopts :u:p:d:c OPTION do case ${OPTION} in u) DB_USER=${OPTARG} ;; p) PASSWD=${OPTARG} ;; d) DB_NAME=${OPTARG} ;; b) BAK_DIR=${OPTARG} ;; c) INIT="true" ;; /?) echo "Usage: mysqlback.sh [OPTIONS]" echo "-u user for login" echo "-p Password to use when connecting to server" echo "-d which database to backup" echo "-b backup database files to directory,default is current directory" echo "-c must be usage for first backup,is complete backup" exit 1 ;; esac done MYSQL_BIN=/usr/local/mysql/bin |
八,windows增量备份
代码如下 | 复制代码 |
mkdir %BAKPATH%\data %MYSQLPATH%\bin\mysqldump -u%USERNAME% -p%PASSWORD% --single-transaction --default- character-set=utf8 --flush-logs --master-data=2 --delete-master-logs spirit_beast > % BAKPATH%\data\spirit_beast%date:~0,10%.sql %MYSQLPATH%\bin\mysqldump -u%USERNAME% -p%PASSWORD% --single-transaction --default- character-set=utf8 --flush-logs --master-data=2 --delete-master-logs quartz_event > % BAKPATH%\data\quartz_event%date:~0,10%.sql rar a -ag %BAKPATH%\full\ %BAKPATH%\data\*.sql rmdir /s /q %BAKPATH%\data\ @echo %date% %time% full bakup finish >> C:/mysqlbakup.log |