备份和拷贝MYSQL数据库[MySQL防范]
本文“备份和拷贝MYSQL数据库[MySQL防范]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
重要的是在表丧失和破坏时备份数据库.假如系统发生崩溃,您就可以够将表恢复到崩溃时刻的状况,并尽大概不丧失数据.一样,错发DROP DATABASE 或DROP TABLE 号令的用户大概会向您恳求举行数据恢复.有时,这是由MySQL管理员惹起的破坏,管理员试图通过利用像vi 或eMacs 这样的编辑器直接编辑表文件而破坏了它们.这样做对表来说必定是干了坏事.
备份数据库的两种主要办法是利用mysqldump 程序或直接拷贝数据库文件(如便用c p、tar 或c p i o).每种办法都有自己的长处和缺陷:
mysqldump 与MySQL服务器结合举行操作.直接拷贝办法与服务器相脱离,因此必须采纳办法确保在举行拷贝时没有客户机在改正这些表.这个问题与操纵文件系统备份来备份数据库的问题相同:假如数据库表在文件系统备份时举行更新,则举行备份的表文件处于非一致的状况,并且关于此后恢复该表没有意义.文件系统备份和直接拷贝文件的辨别是:关于后者,您具有掌握备份进度的权利,因此可以采纳办法确保服务器使表处于静止状况.
mysqldump 比直接拷贝技术要慢
mysqldump 产生可移植到其他机械、乃至具有差别硬件构造的机械上的文本文件.直接拷贝文件不可以移植到其他机械上,除非要拷贝的表利用MyISAM 存储格局.ISAM 表只能在具有相同硬件构造的机械之间举行拷贝.比方,将文件从S PARC 的Solaris 机械拷贝到Intel 的Solaris 机械(大概相反)是行不通的.由MySQL3.23 引进的MyISAM 表存储格局可以办理这个问题,因为该格局与机械独立.因此,假如以下两个条件都满意的话,直接拷贝文件可以移植到具有差别硬件构造的机械上:即另一台机械上也必须运行MySQL3.23 以上的版本,并且文件必须表示成MyISAM 表,而不是ISAM 表.
不管挑选哪类备份办法,都有某些原则,您必须保持这些原则,才能确保在需求恢复数据库内容时得到最好的后果:
按期履行备份.设置一个时间表并保持利用它.
奉告服务器运行更新日记.更新日记在您需求恢复崩溃后的数据库时赐与帮忙.在利用备份文件将数据库恢复到备份时刻的状况后,可以通过运行更新日记中的查询,重新运行备份之后所做的改变.这个操作将数据库中的表恢复到了崩溃时刻的状况.在文件系统备份语言中,数据库备份文件表示完好转储( full dump),而更新日记则表示增量转储.
利用一致和可理解的备份文件命名情势.像b a c k up 1、backup2 等名字没有特别的含义.当需求它履行恢复时,还得浪费时间去查看文件中的内容.您会发现利用数据库名和花时间去构造备份文件名是有好处的.比方:
% mysqldump samp_db> /usr/archives/mysql/samp_db. 1999-10-02
% mysqldump menagerie> /usr/archives/mysql/menagerie.1999-10-02
在产生备份文件后您大概需求将它们紧缩.毕竟备份文件都对比大,所以您大概还需求终止备份文件以避免它们填满磁盘,这与终止日记文件近似.您可以用相同的技术终止备份文件:
用文件系统备份来备份您的备份文件.假如您蒙受了一个完好崩溃,不但破坏了数据目录并且还破坏了包含数据库备份的磁盘驱动器,那将造成真正的麻烦.您还应当备份更新日记.
将备份文件放在与您的数据库差别的文件系统上.这将削减含有数据字典的文件系统被生成的备份文件填满的大概性.
成立备份的技术关于将数据库拷贝到另一个服务器上也是很有帮忙的.将数据库转移到运行在另一个主机上的服务器是很普通的,但您还可以将数据转移到运行在相同主机上的另一个服务器.假如正为一个新版本的MySQL运行服务器,并且想用成品服务器上的某些真实数据来测试它时,大概会这样做.还有一种大概,那就是您得到了一台新的机械并要将全部的数据库移动到新机械上.
用mysqldump 备份和拷贝数据库
当利用mysqldump 程序产生数据库备份文件时,缺省设置是该文件的内容由C R E AT E TABLE 语句构成,这些语句成立被转储的表以及包含表中的行数据的INSERT 语句.换句话说,mysqldump 成立在此后可作为对mysql的输入利用的输出后果,以重建数据库.
可以将整个数据库按以下号令转储到单独的文本文件中:
该文件的别的部份由更多的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 > gradebook.sql
% mysqldump samp_db member president > hist-league.sql
假如您正在生成备份文件并打算用这些备份文件来按期革新另一个数据库的内容,则大概要利用--add-drop-table 选项.此选项奉告mysqldump 将DROP TABLE IF EXISTS 语句写到备份文件中.然后,当您取出该备份文件并将其加载到第二个数据库时,假如表已经存在将不会呈现错误信息.假如您正在运行第二个数据库,可以利用此技术操纵从第一个数据库中的数据拷贝来按期地加载它.
假如您正在转储数据库使该数据库可以转换到另一个服务器上,则无须成立备份文件.应确保该数据库存在于另一台主机上,然后用一个管道使mysql直接读取mysqldump 的输出后果来转储数据库.比方,假如想要将samp_db 数据库从p i t _ v i per.snake.net 拷贝到b o a . s n a k e . n e t,操作以下:
% mysqladmin -h boa.snake.netcreate samp_db
% mysqldump samp_db | mysql-h boa.snake.net samp_db
稍后,假如想要在boa.snake.net 中再次革新该数据库,可跳过mysqladmin 号令,但要将--add-drop-table 增添到mysqldump 中,以避免得到有关"表已经存在"的错误:
% mysqldump --add-drop-table samp_db | mysql-h boa-snake.net samp_db
mysqldump 的其他选项包含以下所示的几个:
--flush-log 和--lock-tables 的结合有助于查抄数据库.--lock-table 锁定全部正在转储的表,而--flush-log 关闭并重新翻开更新日记文件.假如正在产生后续的更新日记,则新的更新日记将只包含从备份的那一点开始改正数据库的查询.这时检核关于该备份时间的更新日记的查抄点(但是,锁定全部的表关于备份期间客户机拜候来说不太好,假如您有需求履行更新操作的客户机的话).
假如用--flush-logs 检核关于备份时间的更新日记查抄点,最好转储整个数据库.假如转储单个文件,则将更新日记的查抄点与备份文件同步是对比难的.在恢复操作中,您普通在总数据库( per- d a t a b a s e)的底子上抽取更新日记的内容.关于抽取单个表的更新日记来说没有选项,因此您必须自己抽取它们.
缺省设置时,mysqldump 将表的全部内容在写之前读到内存中.这实际上不是必须的,事实上,假如您真的有大型表的话,这几近是一个失利的办法.可以用--quick 选项奉告mysqldump 写每一行(只如果被检索的).要想进一步优化该转储历程,可用- - o p t来替换- - q ui c k.-- opt 选项开启其他的选项,这些选项将加快转储数据和读回数据的速度.
由于快速备份的好处,使得用--opt 履行备份成为最常用的办法.但是,要当心, - - o p t 选项有一个代价: --opt 所优化的是您的备份历程,而不是由其他客户机对数据库的拜候.--opt 选项可避免任何人更新被锁定的正在转储的任何表.您会很简单地发目前常
规数据库拜候中在这一点上所做的勤奋.试着在一天中数据库普通最繁忙的时刻运行一个备份.这不会耗费太多的时间.
与--opt 作用有点相反的选项是- d e l a y e d.该选项招致mysqldump 写INSERT D E L AYED 语句而非INSERT 语句.假如您将一个数据文件加载到另一个数据库中并且想要使该操作对其他查询(这些查询大概正在数据库中发生)造成的影响最小,则- -d e l a y e d将有助于到达这个目的.
--compress 选项有助于将数据库拷贝到另一台机械上,因为它可以削减网络传输中的字节数目.这里有一个例子,请注意,为了使程序与远程主机上的服务器举行通信(而不是与本地主机通信),给出了--compress 选项:
% mysqldump --opt samp_db | mysql--compress -h boa.snake.net samp_db
mysqldump 有很多选项,具体信息请参考附录E.
利用直接拷贝数据库备份和拷贝办法
不用mysqldump 来备份数据库或表的另一种办法是直接拷贝表文件.普通可操纵像c p、tar 或cpio 这样的实用程序来举行.本节的例子利用的是c p.
利用直接拷贝备份( direct-copy backup)办法时,必须确保没有利用这些表.假如在拷贝一个表的同时服务器正在改正它,则拷贝无效.
确保拷贝完好性的最好办法是关闭服务器,拷贝文件,然后重新启动服务器.假如不想关闭服务器,则应参考第13 章,查阅有关在履行表查抄点时锁定服务器的介绍.假如服务器在运行中,则相同的约束都实用于拷贝文件,您应当用一样的锁定协议使服务器保持静止状况.
假定服务器关闭,大概已经锁定了想要拷贝的表,下面的例子将阐明怎样将整个samp_db 数据库备份到备份目录中( DATADIR 代表服务器的数据目录):
% cd DATADIR
% cp -r samp_db /usr/archive/mysql 单个表可按以下举行拷贝:
% cd DATADIR/samp_db
% cd member.* /usr/archive/mysql/samp_db
% cd score.* /usr/archive/mysql/samp_db
...
当完成备份时,可以重新启动服务器(假如已使它关闭),大概释放在表上施加的锁(假如保持服务器运行).
要想用直接拷贝文件将数据库从一台机械拷贝到另一台机械,只要将这些文件拷贝到另一台服务器主机上的呼应数据库上便可.应确保这些文件是对MyISAM 表的大概两台机械都有相同的硬件构造.不然这些表在第二个主机上看起来好象有很奇特的内容.还应当确保第二台主机的服务器不会在您安装这些表时去拜候它们.
复制数据库
术语"复制"的含义简单地说有点像"拷贝数据库到另一个服务器",大概是包含在主数据库的内容发生改变时次数据库的有效更新( live updating)的含义.假如想简单地将数据库拷贝到另一个服务器上,则可以利用在前面已经谈论的那些号令.自MySQL3.23 版本以来,就已经开始呈现对基于有效更新的复制的支持.但它的功效仍未成熟,因此,在这方面笔者没有什么可谈论的,假若有爱好,您可以注意一下当前的新版本,看看有些什么新的开辟功效.
本文地址: | 与您的QQ/BBS好友分享! |