|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
会HTML吗?会,我能编好几个大表格排板的网页啦!mysql|备份|数据|数据库 MySQL数据库备份
[晏子] http://clyan.hongnet.com/index.html
在数据库表丧失或破坏的情形下,备份你的数据库是很主要的。假如产生体系溃散,你一定想可以将你的表尽量丧失起码的数据恢复到溃散产生时的形态。有时,恰是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#---------------------------------------# Server version 3.23.2-alpha-log## Table structure for table 'absence'#CREATE TABLE absence( student_id int(10) unsigned DEFAULT '0' NOT NULL, date date DEFAULT '0000-00-00' NOT NULL, PRIMARY KEY (student_id,date));## Dumping data for table 'absence'#INSERT INTO absence VALUES (3,'1999-09-03');INSERT INTO absence VALUES (5,'1999-09-03');INSERT INTO absence VALUES (10,'1999-09-08');......
复制代码 文件剩下的局部有更多的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适用法式对此很有匡助,它从更新日记中提取多行查询。
另外一个能够性是利用另外一台办事器恢复全部数据库,然后拷贝你想要的表文件到原数据库中。这能够真的很轻易!当你将文件拷回数据库目次时,要确保原数据库的办事器封闭。
接触MYSQL,开始设计数据库程序 |
|