MySQL平台数据库备份筹划具体阐明[MySQL防范]
本文“MySQL平台数据库备份筹划具体阐明[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在数据库表丧失或破坏的情形下,备份你的数据库是很重要的.假如发生系统崩溃,你必定想可以将你的表尽大概丧失最少的数据恢复到崩溃发生时的状况.有时,恰是MySQL管理员造成破坏.管理员已经知道表已破坏,用诸如vi或EMacs等编辑器试图直接编辑它们,这对表绝对不是件功德.
备份数据库两个主要办法是用mysqldump程序或直接拷贝数据库文件(如用cp、cpio或tar等).每种办法都有其优缺陷:
mysqldump与MySQL服务器协同操作.直接拷贝办法在服务器外部举行,并且你必须采纳办法保证没有客户正在改正你将拷贝的表.假如你想用文件系统备份来备份数据库,也会发生一样的问题:假如数据库表在文件系统备份历程中被改正,进入备份的表文件主语不一致的状况,而对今后的恢复表将失去意义.文件系统备份与直接拷贝文件的辨别是对后者你完好掌握了备份历程,这样你能采纳办法确保服务器让表不受干扰.
mysqldump比直接拷贝要慢些.
mysqldump生成可以移植到别的机械的文本文件,乃至那些有差别硬件构造的机械上.直接拷贝文件不能移植到别的机械上,除非你正在拷贝的表利用MyISAM存储格局.ISAM表只能在类似的硬件构造的机械上拷贝.在MySQL 3.23中引入的MyISAM表存储格局办理了该问题,因为该格局是机械无关的,所以直接拷贝文件可以移植到具有差别硬件构造的机械上.只要满意两个条件:另一台机械必须也运行MySQL 3.23或今后版本,并且文件必须以MyISAM格局表示,而不是ISAM格局.
不管你利用哪类备份办法,假如你需求恢复数据库,有几个原则应当服从,以确保最好的后果:
按期实施备份.成立一个筹划并严峻服从.
让服务器履行更新日记.当你在崩溃后需求恢复数据时,更新日记将帮忙你.在你用备份文件恢复数据到备份时的状况后,你可以通过运行更新日记中的查询再次应用备份背面的改正,这将数据库中的表恢复到崩溃发生时的状况.
以文件系统备份的术语讲,数据库备份文件代表完好倾倒(full dump),而更新日记代表渐进倾倒(incremental dump).
利用一种统一的和易理解的备份文件命名机制.象backup1、buckup2等不是分外有意义.当实施你的恢复时,你将浪费时间找出文件里是什么东西.你大概发觉用数据库名和日期构成备份文件名会很有效.比方:
%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
%mysqldump menagerie >/usr/archives/mysql/menagerie.1999-10-02
你大概想在生成备份后紧缩它们.备份普通都很大!你也需求让你的备份文件有过期期限以避免它们填满你的磁盘,就象你让你的日记文件过期那样.
用文件系统备份备份你的备份文件.假如赶上了一个完好崩溃,不但排除了你的数据目录,也排除了包含你的数据库备份的磁盘驱动器,你将真正赶上了麻烦.
也要备份你的更新日记.
将你的备份文件放在差别于用于你的数据库的文件系统上.这将降低由于生成备份而填满包含数据目录的文件系统的大概性.
用于成立备份的技术一样对拷贝数据库到另一台机械有效.最常见解,一个数据库被转移到了运行在另一台主机上的服务器,但是你也可以将数据转移到同一台主机上的另一个服务器.
1 利用mysqldump备份和拷贝数据库
当你利用mysqldumo程序产生数据库备份文件时,缺省地,文件内容包含成立正在倾倒的表的CREATE语句和包含表中行数据的INSERT语句.换句话说,mysqldump产生的输出可在今后用作mysql的输入来重建数据库.
你可以将整个数据库倾倒进一个单独的文本文件中,以下:
%mysqldump samp_db >/usr/archives/mysql/samp_db.1999-10-02
输出文件的开首看起来象这样:
# MySQL Dump 6.0# # Host: localhost Database: samp_db |
文件剩下的部份有更多的INSERT和CREATE TABLE语句构成.假如你想紧缩备份,利用近似以下的号令:
%mysqldump samp_db | gzip >/usr/archives/mysql/samp_db.1999-10-02.gz
假如你要一个宏大的数据库,输出文件也将很宏大,大概难于管理.假如你乐意,你可以在mysqldump号令行的数据库名后列出单独的表名来倾到它们的内容,这将倾倒文件分成较小、更易于管理的文件.下例显示若何将samp_db数据库的一些表倾到进脱离的文件中:
%mysqldump samp_db student score event absence >grapbook.sql
%mysqldump samp_db member president >hist-league.sql
假如你生成预备用于按期革新另一个数据库内容的备份文件,你大概想用--add-drop-table选项.这奉告服务器将DROP TABLE IF EXISTS语句写入备份文件,然后,当你取出备份文件并把它装载进第二个数据库时,假如表已经存在,你不会得到一个错误.
假如你倒出一个数据库以便能把数据库转移到另一个服务器,你乃至没必要成立备份文件.要保证数据库存在于另一台主机,然后用管道倾倒数据库,这样mysql能直接读取mysqldump的输出.比方:你想从主机pit-viper.snake.net拷贝数据库samp_db到boa.snake.net,可以这样很简单做到:
%mysqladmin -h boa.snake.net create samp_db
%mysqldump samp_db | mysql -h boa.snake.net samp_db
今后,假如你想再次革新boa.snake.net上的数据库,跳过mysqladmin号令,但要对mysqldump加上--add-drop-table以避免的得到表已存在的错误:%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db
mysqldump别的有效的选项包含:--flush-logs和--lock-tables组合将对你的数据库查抄点有帮忙.--lock-tables锁定你正在倾倒的全部表,而--flush-logs关闭并重新翻开更新日记文件,新的更新日记将只包含从备份点起的改正数据库的查询.这将设置你的更新日记查抄点位备份时间.(但是假如你有需求履行个更新的客户,锁定全部表对备份期间的客户拜候不是件功德.)
假如你利用--flush-logs设置查抄点到备份时,有大概最好是倾倒整个数据库.
假如你倾倒单独的文件,较难将更新日记查抄点与备份文件同步.在恢复期间,你普通按数据库为底子提取更新日记内容,对单个表没有提取更新的挑选,所以你必须自己提取它们.
缺省地,mysqldump在写入前将一个表的整个内容读进内存.这普通确切不必要,并且实际上假如你有一个大表,几近是失利的.你可用--quick选项奉告mysqldump只要它检索出一行就写出每一行.为了进一步优化倾倒历程,利用--opt而不是--quick.--opt选项翻开别的选项,加快数据的倾倒和把它们读回.
用--opt实施备份大概是最常用的办法,因为备份速度上的上风.但是,要告诫你,--opt选项确切有代价,--opt优化的是你的备份历程,不是其他客户对数据库的拜候.--opt选项通过一次锁定全部表禁止任何人更新你正在倾倒的任何表.你可在普通数据库拜候上很简单看到其效果.当你的数据库普通非常频繁地利用,只是一天一次地疗养备份.
一个具有--opt的相反效果的选项是--dedayed.该选项使得mysqldump写出INSERT DELAYED语句而不是INSERT语句.假如你将数据文件装入另一个数据库并且你想是这个操作对大概呈目前该数据库中的查询的影响最小,--delayed对此很有帮忙.
--compress选项在你拷贝数据库到另一台机械上时很有帮忙,因为它削减网络传输字节的数目.下面有一个例子,注意到--compress对与远端主机上的服务器通信的程序才给出,而不是对与本地主机衔接的程序:
%mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db
mysqldump有很多选项,详见《MySQL参考手册》.
2 利用直接拷贝数据库的备份和拷贝办法
另一种不触及mysqldump备份数据库和表的方法是直接拷贝数据库表文件.典型地,这用诸如cp、tar或cpio实用程序.本文的例子利用cp.
当你利用一种直接备份办法时,你必须保证表不在被利用.假如服务器在你则正在拷贝一个表时改变它,拷贝就失去意义.
保证你的拷贝完好性的最好办法是关闭服务器,拷贝文件,然后重启服务器.假如你不想关闭服务器,要在履行表查抄的同时锁定服务器.假如服务器在运行,相同的制约也实用于拷贝文件,并且你应当利用相同的锁定协议让服务器"安静下来".
假定服务器关闭或你已经锁定了你想拷贝的表,下列显示若何将整个samp_db数据库备份到一个备份目录(DATADIR表示服务器的数据目录):%cd DATADIR%cp -r samp_db /usr/archive/mysql
单个表可以以下备份:
%cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* /usr/archive/mysql/samp_db ....
当你完成了备份时,你可以重启服务器(假如关闭了它)或释放加在表上的锁定(假如你让服务器运行).
要用直接拷贝文件把一个数据库从一台机械拷贝到另一台机械上,只是将文件拷贝到另一台服务器主机的得当数据目录下便可.要确保文件是MyIASM格局或两台机械有相同的硬件构造,不然你的数据库在另一台主机上有奇特的内容.你也应当保证在另一台机械上的服务器在你正在安装数据库表时不拜候它们.
3 复制数据库(Replicating Database)
复制(Replication)近似于拷贝数据库到另一台服务器上,但它的切当含义是及时地保证两个数据库的完好同步.这个功效将在3.23版中呈现,并且还不很成熟,因此本文不作具体介绍.
4 用备份恢复数据
数据库破坏的发生有很多缘由,程度也差别.假如你走运,你大概仅破坏一两个表(如掉电),假如你倒运,你大概必须替换整个数据目录(如磁盘破坏).在某些情形下也需求恢复,比方用户错误地删除了数据库或表.不管这些倒运事件的缘由,你将需求实施某种恢复.
假如表破坏但没丧失,尝试用myisamchk或isamchk修复它们,假如这样的破坏可有修复程序修复,你大概根本不需求利用备份文件.关于表修复的历程,见《数据库保护与修复》.
恢复历程触及两种信息源:你的备份文件和个更新日记.备份文件将表恢复到实施备份时的状况,但是普通表在备份与发生问题之间的时间内已经被改正,更新日记包含了用于举行这些改正的查询.你可以利用日记文件作为mysql的输入来反复查询.这已恰是为什么要启用更新日记的缘由.
恢复历程视你必须恢复的信息多少而差别.实际上,恢复整个数据库比单个表跟简单,因为关于数据库应用更新日记比单个表简单.
4.1 恢复整个数据库
首先,假如你想恢复的数据库是包含受权表的mysql数据库,你需求用--skip-grant-table选项运行服务器.不然,它会抱怨不能找到受权表.在你已经恢复表后,履行mysqladmin flush-privileges奉告服务器装载受权标并利用它们.
将数据库目录内容拷贝到别的某个地方,假如你在今后需求它们.
用最新的备份文件重装数据库.假如你用mysqldump产生的文件,将它作为mysql的输入.假如你用直接从数据库拷贝来的文件,将它们直接拷回数据库目录,但是,此时你需求在拷贝文件之前关闭数据库,然后重启它.
利用更新日记反复做备份今后的改正数据库表的查询.关于任何可实用的更新日记,将它们作为mysql的输入.指定--one-database选项使得mysql只履行你有爱好恢复的数据库的查询.假如你知道你需求应用全部更新日记文件,你可以在包含日记的目录下利用这条号令:
% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name
ls号令生成更新日记文件的一个单列列表,按照服务器产生它们的次序排序(主张:假如你改正任何一个文件,你将改变排序次序,这招致更新日记一错误的次序被应用.)
极大概你会是应用某几个更新日记.比方,自从你备份以来产生的更新日记被命名为update.392、update.393等等,你可以这样重新运行:
%mysql --one-database db_name < update.392
%mysql --one-database db_name < update.393
.....
假如你正在实施恢复且利用更新日记恢复由于一个错误倡议的DROP DATABASE、DROP TABLE或DELETE语句造成丧失的信息,在应用更新日记之前,要保证从此中删除这些语句.
4.2 恢复单个表
恢复单个表较为复杂.假如你用一个由mysqldump生成的备份文件,并且它不包含你感爱好的表的数据,你需求从相关行中提取它们并将它们用作mysql的输入.这是简单的部份.难的部份是从只应用于该表的更新日记中拉出片断.你会发觉mysql_find_rows实用程序对此很有帮忙,它从更新日记中提取多行查询.
另一个大概性是利用另一台服务器恢复整个数据库,然后拷贝你想要的表文件到原数据库中.这大概真的很简单!当你将文件拷回数据库目录时,要确保原数据库的服务器关闭.
本文地址: | 与您的QQ/BBS好友分享! |