Mysql 备份与还原
关键词:Mysql,备份,还原
作者:BIce 创建时间:2011-09-20 17:18:32
为了保护数据,一般的我们都需要定期的对数据库进行备份,今天简单总结下Mysql的备份以及还原的方法。
备份的分类
备份有很多种,一般的备份我们可以分为热备份,温备份和冷备份。其中热备份是可以不需要任何一台服务器进行停机完成的备份;冷备份则是要将服务器停机,备份,再开机才能完成的备份。一般从用户来讲,当然是喜欢热备份,但是对于Mysql(其他系统也是)而言,热备份实现起来不是那么容易,一般使用温备份的较多,介于这两种之间。(具体定义见百度http://baike.baidu.com/view/5523287.htm)
而Mysql的备份又分为两种备份方式:逻辑备份和裸备份。其中逻辑备份一般是导出一份逻辑文件(如mysqldump得到的sql文件)进行复制,裸备份则是通过拷贝文件的方式进行备份的。而这两种备份中,
l 逻辑备份的优点很多,兼容性比较好,独立与引擎,但是生成的文件可能比较大,且速度比较慢。
l 而裸备份的话速度比较快,但是兼容不好,拷贝的文件在不同的平台,不同的机器上都有可能用不了,而且如InnoDB引擎你可能只想拷贝一个表就必须拷贝整个数据库,而且万一拷贝过程中出现错误,你是无法知道的,当恢复时启动数据库发现一切都出错了,就可能导致更多的错误。
一般个人比较喜欢逻辑备份,如mysqldump,所以个人建议如果表数据不大的话可以采用逻辑备份,而当需要进行完整数据库备份,且数据量又比较大时则可以使用裸备份,毕竟拷文件的速度还是很快的。通常的做法是两种相结合,都要进行。
(PS:在备份过程中,mysql的binary log 也是一个必须要备份的内容,记得备份)
(PS:一般的备份都是以FLUSH TABLES WITH READ LOCK开始的,将Mysql的表缓存进行刷新然后锁定,以此来保证数据一致。此方法对于InnoDB可能无效,而对于支持事务的InnoDB,也是利用他的MVCC事务,使用一个事务完成对数据库的拷贝.)
下面对逻辑备份和裸备份的具体方法进行简单介绍和对比。
逻辑备份
逻辑备份的一般形式为SQL的导出
1. mysqldump
比较常用的备份方式,速度较快,实际上产生如Create table和批量插入的语句的.sql文件,还原的话使用source命令即可,功能很多。
脚本内会进行加锁和解锁的动作,所以不用我们手动进行加锁的操作。
命令格式:
./mysqldump –uroot –ppassword db table1 table2 > ~/backup/mysql.sql
2. select into outfile
使用Select into outfile命令将创建一个定界符文件格式的逻辑备份,此文件中不保存表结构,仅有行式数据,支持行级别的备份。还原的对应命令是Load data infile命令,官方手册中说其效率为insert的20倍,mysqlimport是和它等价的方案(对其封装)。
此方式实现的原理不像mysqldump,它不是基于SQL语句的,是基于文本的高速并行读取的,所以速度比较快。
命令格式如下:
Select * into outfile ‘/backup/t1.txt’ fields terminated by ‘,’ optionally enclosed by ‘’’’ lines terminated by ‘\n’ from db.table1
Load data infile ‘/backup/t1.txt’ into table db.table1 fields terminated by ‘,’ optionally enclosed by ‘’’’ lines terminated by ‘\n’
3. 脚本执行
如果你想手动编写脚本进行Mysql数据库备份的话,也是不错的选择,比如可以用PHP脚本Select 出来再写到某个SQL文件中,优点是可以自己控制备份过程,减少对服务器的压力(找个没人的时间,每10秒查1000行备份),但是缺点是需要自己维护数据的一致性。(还原的话可以批量insert完成)
上面简单介绍了几种逻辑备份的方法,多说一句,以上的方法在Mysql下都是支持主从同步的,Mysql会自动记录操作或者拷贝操作文件,从而来完成从服务器的Replay同步工作,同步我们就不用管啦。
裸备份
一般也就是拷文件的方式,通常可用Scp命令来完成,也可以做LVM(Logical Volum Manager)快照的方式来进行备份(PS:一种非常好的在线备份方式)。
最一般的方式是关掉服务器,然后进行文件的备份,但是这样的开销比较大,如果使用的是MyISAM数据表的话,也可以使用mysqlhotcopy工具来进行热备份。
而通常的Scp命令的方式速度会比较快,但是
l 根据表使用的不同引擎,也要采取不同的拷贝方案(如MyISAM和InnoDB的区别?一个是每表有三个文件,一个是所以表都在一个文件里?)
l 备份过程起始要使用Flush tables with read lock来刷新缓存并且获取锁,保证数据的一致(如果是InnoDB的话也没这么简单?InnoDB为了高效有很多异步线程,它们独立与Lock tables 所以上述语句未必有效,为了避免这个问题可以使用SHOW INNODB STATUS来观察缓冲区,缓冲区清空,写操作也都完成后才可以拷贝),然后再执行Scp命令
l 而还原的话则需要先将数据库停掉再进行拷贝,保证数据读写正确。
l 而且使用这种方式的话Mysql没有办法为我们提供主从同步的支持,必须手动进行,如果有多个从库的话需要依次拷贝,设置Binary Log的位置才可。
另外拷贝文件的方式也有很多种,详见《高性能Mysql》的附录A。