仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 771|回复: 7
打印 上一主题 下一主题

[学习教程] 绝无经由的MySQL数据库和备份与恢复

[复制链接]
若天明 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 20:14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
那时候Sybase已经诞生了6年的时间。至于其他值得关注的开源数据库,PostgreSQL将在2009年达到20岁的生日。虽然MySQL并不是市场上最年轻的数据库,但是却有更多成熟的数据库可供我们选择。  在数据库表丧失或破坏的情形下,备份你的数据库是很主要的。假如产生体系溃散,你一定想可以将你的表尽量丧失起码的数据恢复到溃散产生时的形态。偶然,恰是MySQL办理员形成损坏。办理员已晓得表以损坏,用诸如vi或Emacs等编纂器试图间接编纂它们,这对表相对不是件功德!
  备份数据库两个次要办法是用mysqldump程序或间接拷贝数据库文件(如用cp、cpio或tar等)。每种办法都有其优弱点:
  mysqldump与MySQL服务器协同操纵。间接拷贝办法在服务器内部举行,而且你必需接纳措施包管没有客户正在修正你将拷贝的表。假如你想用文件体系备份来备份数据库,也会产生一样的成绩:假如数据库表在文件体系备份过程当中被修正,进进备份的表文件主语纷歧致的形态,而对今后的恢复表将得到意义。文件体系备份与间接拷贝文件的区分是对后者你完整把持了备份历程,如许你能接纳措施确保服务器让表不受搅扰。
  mysqldump比间接拷贝要慢些。
  mysqldump天生可以移植到别的呆板的文本文件,乃至那些有分歧硬件布局的呆板上。间接拷贝文件不克不及移植到别的呆板上,除非你正在拷贝的表利用MyISAM存储格局。ISAM表只能在类似的硬件布局的呆板上拷贝。在MySQL3.23中引进的MyISAM表存储格局办理了该成绩,由于该格局是呆板有关的,以是间接拷贝文件能够移植到具有分歧硬件布局的呆板上。只需满意两个前提:另外一台呆板必需也运转MySQL3.23或今后版本,并且文件必需以MyISAM格局暗示,而不是ISAM格局。
  不论你利用哪一种备份办法,假如你必要恢单数据库,有几个准绳应当恪守,以确保最好的了局:
  按期实行备份。创建一个企图并严厉恪守。
  让服务器实行更新日记。当你在溃散后必要恢单数据时,更新日记将匡助你。在你用备份文件恢单数据到备份时的形态后,你能够经由过程运转更新日记中的查询再次使用备份前面的修正,这将数据库中的表恢复到溃散产生时的形态。
  以文件体系备份的术语讲,数据库备份文件代表完整倾倒(fulldump),而更新日记代表渐进倾倒(incrementaldump)。
  利用一种一致的和易了解的备份文件定名机制。象backup1、buckup2等不是出格成心义。当实行你的恢复时,你将华侈工夫找出文件里是甚么器材。你大概觉察用数据库名和日期组成备份文件名会很有效。比方:

  %mysqldumpsamp_db>/usr/archives/mysql/samp_db.1999-10-02
  %mysqldumpmenagerie>/usr/archives/mysql/menagerie.1999-10-02
  你大概想在天生备份后紧缩它们。备份一样平常都很年夜!你也必要让你的备份文件有过时刻日以免它们填满你的磁盘,就象你让你的日记文件过时那样。
  用文件体系备份备份你的备份文件。假如赶上了一个完全溃散,不但扫除了你的数据目次,也扫除了包括你的数据库备份的磁盘驱动器,你将真正赶上了贫苦。也要备份你的更新日记。
  将你的备份文件放在分歧于用于你的数据库的文件体系上。这将下降因为天生备份而填满包括数据目次的文件体系的大概性。
  用于创立备份的手艺一样对拷贝数据库到另外一台呆板有效。最多见地,一个数据库被转移到了运转在另外一台主机上的服务器,可是你也能够将数据转移到统一台主机上的另外一个服务器。
  1、利用mysqldump备份和拷贝数据库
  当你利用mysqldumo程序发生数据库备份文件时,缺省地,文件内容包括创立正在倾倒的表的CREATE语句和包括表中行数据的INSERT语句。换句话说,mysqldump发生的输入可在今后用作mysql的输出来重修数据库。
  你能够将全部数据库倾倒进一个独自的文本文件中,以下:
  %mysqldumpsamp_db>/usr/archives/mysql/samp_db.1999-10-02
  输入文件的开首看起来象如许:
  #MySQLDump6.0
  #
  #Host:localhostDatabase:samp_db
  #---------------------------------------
  #Serverversion3.23.2-alpha-log
  #
  #Tablestructurefortableabsence
  #
  CREATETABLEabsence(
  student_idint(10)unsignedDEFAULT0NOTNULL,
  datedateDEFAULT0000-00-00NOTNULL,
  PRIMARYKEY(student_id,date)
  );
  #
  #Dumpingdatafortableabsence
  #
  INSERTINTOabsenceVALUES(3,1999-09-03);
  INSERTINTOabsenceVALUES(5,1999-09-03);
  INSERTINTOabsenceVALUES(10,1999-09-08);
  ...... 
  文件剩下的部分有更多的INSERT和CREATETABLE语句构成。
  假如你想紧缩备份,利用相似以下的命令:
  %mysqldumpsamp_db|gzip>/usr/archives/mysql/samp_db.1999-10-02.gz
  假如你要一个复杂的数据库,输入文件也将很复杂,大概难于办理。假如你乐意,你能够在mysqldump命令行的数据库名后列出独自的表名来倾到它们的内容,这将倾倒文件分红较小、更容易于办理的文件。下例显现怎样将samp_db数据库的一些表倾到进分隔的文件中:
  %mysqldumpsamp_dbstudentscoreeventabsence>grapbook.sql
  %mysqldumpsamp_dbmemberpresident>hist-league.sql
  假如你天生筹办用于按期革新另外一个数据库内容的备份文件,你大概想用--add-drop-table选项。这告知服务器将DROPTABLEIFEXISTS语句写进备份文件,然后,当你掏出备份文件并把它装载进第二个数据库时,假如表已存在,你不会失掉一个毛病。
  假如你倒出一个数据库以便能把数据库转移到另外一个服务器,你乃至不用创立备份文件。要包管数据库存在于另外一台主机,然后用管道倾倒数据库,如许mysql能间接读取mysqldump的输入。比方:你想从主机pit-viper.snake.net拷贝数据库samp_db到boa.snake.net,能够如许很简单做到:
  %mysqladmin-hboa.snake.netcreatesamp_db
  %mysqldumpsamp_db|mysql-hboa.snake.netsamp_db
  今后,假如你想再次革新boa.snake.net上的数据库,跳过mysqladmin命令,但要对mysqldump加上--add-drop-table以免的失掉表已存在的毛病:
%mysqldump--add-drop-tablesamp_db|mysql-hboa.snake.netsamp_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写出INSERTDELAYED语句而不是INSERT语句。假如你将数据文件装进另外一个数据库而且你想是这个操纵对大概呈现在该数据库中的查询的影响最小,--delayed对此很有匡助。
  --compress选项在你拷贝数据库到另外一台呆板上时很有匡助,由于它削减收集传输字节的数目。上面有一个例子,注重到--compress对与远端主机上的服务器通讯的程序才给出,而不是对与当地主机毗连的程序:
  %mysqldump--optsamp_db|mysql--compress-hboa.snake.netsamp_db
  mysqldump有良多选项,详见《MySQL参考手册》。

  2、利用间接拷贝数据库的备份和拷贝办法
  另外一种不触及mysqldump备份数据库和表的体例是间接拷贝数据库表文件。典范地,这用诸如cp、tar或cpio有用程序。本文的例子利用cp。
  当你利用一种间接备份办法时,你必需包管表不在被利用。假如服务器在你则正在拷贝一个表时改动它,拷贝就得到意义。
  包管你的拷贝完全性的最好办法是封闭服务器,拷贝文件,然后重启服务器。假如你不想封闭服务器,要在实行表反省的同时锁定服务器。假如服务器在运转,不异的制约也合用于拷贝文件,并且你应当利用不异的锁定协定让服务器“宁静上去”。
  假定服务器封闭或你已锁定了你想拷贝的表,以下显现怎样将全部samp_db数据库备份到一个备份目次(DATADIR暗示服务器的数据目次):
  %cdDATADIR
  %cp-rsamp_db/usr/archive/mysql
  单个表能够以下备份:
  %cdDATADIR/samp_db
  %cpmember.*/usr/archive/mysql/samp_db
  %cpscore.*/usr/archive/mysql/samp_db
  ....
  当你完成了备份时,你能够重启服务器(假如封闭了它)或开释加在表上的锁定(假如你让服务器运转)。
  要用间接拷贝文件把一个数据库从一台呆板拷贝到另外一台呆板上,只是将文件拷贝到另外一台服务器主机的得当数据目次下便可。要确保文件是MyIASM格局或两台呆板有不异的硬件布局,不然你的数据库在另外一台主机上有奇异的内容。你也应当包管在另外一台呆板上的服务器在你正在安装数据库表时不会见它们。
  3、复制数据库(ReplicatingDatabase)
  复制(Replication)相似于拷贝数据库到另外一台服务器上,但它切实其实切寄义是及时地包管两个数据库的完整同步。这个功效将在3.23版中呈现,并且还不很成熟,因而本文不作具体先容。
  4、用备份恢单数据
  数据库破坏的产生有良多缘故原由,水平也分歧。假如你交运,你大概仅破坏一两个表(如失落电),假如你不利,你大概必需交换全部数据目次(如磁盘破坏)。在某些情形下也必要恢复,好比用户毛病地删除数据库或表。不论这些不利事务的缘故原由,你将必要实行某种恢复。
  假如表破坏但没丧失,实验用myisamchk或isamchk修复它们,假如如许的破坏可有修复程序修复,你大概基本不必要利用备份文件。关于表修复的历程,见《数据库保护与修复》。
  恢复历程触及两种信息源:你的备份文件和个更新日记。备份文件将表恢复到实行备份时的形态,但是一样平常表在备份与产生成绩之间的工夫内已被修正,更新日记包括了用于举行这些修正的查询。你可使用日记文件作为mysql的输出来反复查询。这已恰是为何要启用更新日记的缘故原由。
  恢复历程视你必需恢复的信息几而分歧。实践上,恢复全部数据库比单个表跟简单,由于关于数据库使用更新日记比单个表简单。
  4.1恢复全部数据库
  起首,假如你想恢复的数据库是包括受权表的mysql数据库,你必要用--skip-grant-table选项运转服务器。不然,它会埋怨不克不及找到受权表。在你已恢复表后,实行mysqladminflush-privileges告知服务器装载受权标并利用它们。
  将数据库目次内容拷贝到别的某个中央,假如你在今后必要它们。

  用最新的备份文件重装数据库。假如你用mysqldump发生的文件,将它作为mysql的输出。假如你用间接从数据库拷贝来的文件,将它们间接拷回数据库目次,但是,此时你必要在拷贝文件之前封闭数据库,然后重启它。
  利用更新日记反复做备份今后的修正数据库表的查询。关于任何可合用的更新日记,将它们作为mysql的输出。指定--one-database选项使得mysql只实行你有乐趣恢复的数据库的查询。假如你晓得你必要使用一切更新日记文件,你能够在包括日记的目次下利用这条命令:
  %ls-t-r-1update.[0-9]*|xargscat|mysql--one-databasedb_name
  ls命令天生更新日记文件的一个单列列表,依据服务器发生它们的序次排序(主张:假如你修正任何一个文件,你将改动排次序序,这招致更新日记一毛病的序次被使用。)
  极可能你会是使用某几个更新日记。比方,自从你备份以来发生的更新日记被定名为update.392、update.393等等,你能够如许从头运转:
  %mysql--one-databasedb_name<update.392
  %mysql--one-databasedb_name<update.393
  .....
  假如你正在实行恢复且利用更新日记恢复因为一个毛病倡议的DROPDATABASE、DROPTABLE或DELETE语句形成丧失的信息,在使用更新日记之前,要包管从个中删除这些语句。
  4.2恢复单个表
  恢复单个表较为庞大。假如你用一个由mysqldump天生的备份文件,而且它不包括你感乐趣的表的数据,你必要从相干行中提取它们并将它们用作mysql的输出。这是简单的部分。难的部分是从只使用于该表的更新日记中拉出片段。你会觉察mysql_find_rows有用程序对此很有匡助,它从更新日记中提取多行查询。

  另外一个大概性是利用另外一台服务器恢复全部数据库,然后拷贝你想要的表文件到原数据库中。这大概真的很简单!当你将文件拷回数据库目次时,要确保原数据库的服务器封闭。

有的时候,一些缺失的功能可以通过别的办法来实现,例如,在MySQL4.1以前,你可以通过使用join方法来替代子查询的功能。在MySQL5.0中,大多数关系型数据库所要求的功能已经都具备。
飘飘悠悠 该用户已被删除
沙发
发表于 2015-1-18 19:18:17 | 只看该作者
其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。
小魔女 该用户已被删除
板凳
发表于 2015-1-27 07:15:06 | 只看该作者
从底层原理到表层引用,书籍多的很。个人认为没有什么那本书好?这样的说法。主要看和个人的学习方法是否适合。
山那边是海 该用户已被删除
地板
发表于 2015-2-5 05:32:09 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
爱飞 该用户已被删除
5#
发表于 2015-2-11 07:08:32 | 只看该作者
我个人认为就是孜孜不懈的学习
精灵巫婆 该用户已被删除
6#
发表于 2015-3-1 23:57:22 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
admin 该用户已被删除
7#
发表于 2015-3-11 01:27:05 | 只看该作者
发几份SQL课件,以飨阅者
愤怒的大鸟 该用户已被删除
8#
发表于 2015-3-24 20:51:07 | 只看该作者
这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-25 09:46

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表