您的位置:   主页 > 技术文章

mysql数据库语句修复方法

时间:2011-06-13 16:07来源:青岛数据恢复 作者:青岛四通数据恢复 点击:563次



变量 含意



kei_buffer_size 用于存放索引块的缓冲区巨细



read_buffer_size 读操作用的缓冲区巨细



sort_buffer_size 排序用的缓冲区巨细



write_buffer_size 写操作用的缓冲区巨细


 

可用--help选项运行该程序。要想指定其他值,    要想查抄任一个程序使用的这些变量的缺省值。可在该命令上使用--set-varivariable=valu或-Ovariable=valu您可以或许将变量的名字简化成keireadsort和write比方,可告诉myisamchk利用16MB排序缓冲区和1MB读写缓冲区,其调用如下:

    %myisamchk-0sort=16M-0read=1Mwrite=1M...

kei_buffer不能利用。    sort_buffer_s只能操纵--recov选项来使用(而不是操纵--safe_recover,这种情况下。

    增添服务器的停机时候

因为仿照照旧必须防备服务器访问(并可能修改)正在履行拷贝的表。但是如果您不愿意使服务器脱机的话,    防备服务器访问(您正在处置惩罚的表的另一种方法是数据目次的外面操纵该表文件的拷贝。这样并不能消除交互感化的成绩。该路线可能是使服务器停机时辰最小化的一种方法,这对您是有吸引力的将该表的文件拷贝到另一个目录时关闭服务器,尔后回复复兴服务器。

    myisamchk未来计划

对表的搜查和修复将更容易,    myisamchk表搜查和修复功能计划在MySQL3.23版本系列的某个时刻被合并到服务器中。如果这种打算完成。因为服务器与myisamchk交互成就将不再会出现。

您能够见告服务器在策动时检查表,    异样。是以在策动服务器前将不必要设置任何非凡的饬令在带领时期履行。该程序不对ISA M表进行操作,是以在服务器获得表的检讨复能力时,应试虑将ISA M表转换成MyISA M表。请查抄新发行版的MySQL参考指南,解在此范围内有什么新进展。可以或许用ALTERTA BLE语句转换表的范例:

    A LTERTA BLEtbl_nameTYPE=MYISA M

找一下怎样使用mysqlaump和怎样关闭更新日记。您一定不想不可挽回地损失一个表,    上述历程的最后一步假定您已经执行了数据库备份并允许更新日志有用。如果不是如许的话。是以,应极力地做备份。

应该满足一些初步需求:    利用myisamchk或isamchk搜查或修复表之前。

以防事务越来越糟使表的破坏不能修复。笔者如同在以前提醒过这一点?    建立惯例的数据库备份过程并允许更新日记。

由于它将谈判当您试图在一个表上执行搜查或修复过程时服务器正在操纵这个表所引起的成绩。还讨论怎样在服务器运行时防备那些成就产生。    开端实行之前应先仔细地阅读本章的内容信息。特别是不应该在浏览"预防与MySQL服务器交互作用"之前履行操纵。

您应该被注册在运转mysql账号下,    当运行表搜查或修复时。因为您必要对表文件读写访问。

    

myisamchk和isamchk调用语法

多数时辰它可以或许用同样的方式利用。之间的首要差别是所使用的表的范例。关于MyISA M表,    MySQLmyisamchk和isamchk实用轨范很类似。利用myisamchk而对于ISA M表,则使用isamchk您可以或许通过表的索引文件的扩张名来见告表操纵哪种存储格式。扩张名".MYI"表白是一个MyISA M表,而".ISM"表白是ISA M表。青岛数据恢复 href="http://www.hdd120.net">青岛数据恢复机的SELECT盘问被另一个客户机的UPDA TE盘问所干扰。服务器还操纵外部锁定(文件级锁)来防止其他法式在服务器操纵表时修改该表的文件。凡是,    服务器有两种类型的锁定方式。操纵内部锁定预防用户机的请求相互烦扰─比方。表的搜查把持中服务器将外部锁定与myisamchk或isamchk组合利用。但是外部锁定在某些系统中是禁用的由于它不能可靠地进行工作。对运行myisamchk和isamchk所选择的过程取决于服务器是否能操纵外部锁定。如果不使用,则必须操纵内部锁定协定。

应指明您所要搜查或修复的表,    为了操纵任一个实用程序。以及指明要执行的把持范例的选项:

    %myisamchkoptiontbl_name...

    %isamchkoptiontbl_name...

可以或许很等闲地操纵文件名情势来拾取目录中所有相应的文件:    tbl_nam参数能够是表名也可以是该表的索引文件名。如果指定多个表。

    %myisamchkoption*.MYI

    %isamchkoption*.ISM

但是除了颁布发表一条忠言情况外此轨范不做任何事情。比方,    不会因为告诉了过错的轨范来搜查某个表而使该表毁坏。上面的第一条语句将搜查面前目录中的一切MyISA M表,而第二条语句只展现一条警告消息:

    %myisamchk*.MYI准确

    %myisamchk*.ISM不正确─文件典范榜样错

是以,    非论是myisamchk还是isamchk都不对表所在位置做任何判断。应该或在包含表文件的目录中运行程序,或者指定表的道路名。这允许您将表文件拷贝到另一个目录中并用该拷贝履行操纵。

搜查表

这些方式在完整搜查表的程度方面有差异。凡用标准体式格局就足够了如果标准搜查述说没有发现错误而您仿照照旧怀疑有毁坏(或因为盘问没有正常地工作)可以或许要执行更彻底的查抄。要想用任意一个实用轨范执行尺度的表检查,    myisamchk和isamchk供应了表检查方法。则不用带任何选项直接调用即可:

    %myisamchktbl_name

    %isamchktbl_name

利用--extend-check选项。该选项非常慢,    为了执行扩充查抄。但搜查极为完全。对于该表的数据文件中的每个记实,索引文件中的每个索引的相关键都被搜查以确保它真正指向准确的记实。myisamchk尚有一个中间选项--medium-check不如扩张搜查完全,但速度快。

则可以或许一定表是好的如果您仿照照旧感触表有问题,    如果关于--extend-check搜查不报告错误。那原因肯定在其他地方。应重新搜查任何犹如有问题的盘问以验证查询是正确誊写的如果您感到成就能够是MySQL服务器的起因,应试虑清理一份弊端述说或升级到新的版本上。

操纵下节中的声名修复它    若是myisamchk或isamchk述说表有错误。

修复表

如果具体成就非常奇异则更难进行。但是,    表的修复是一项可怕的任务。有一些常规的带领思想和过程,可以或许遵守它来增加修改表的机遇。凡是,开端时可以或许用最快的修复方式,看看是否能修正故障。如果发现不可的话,可以或许缓缓进级到更彻底的但更慢的修复体式格局上,直到弊端被修复或您不能担当升级为止(实际上,大多数成就不用更大规模的和更慢的体式格局就能修正)如果表不能修复,则从备份中恢复该表。有关操纵备份文件和更新日志履行复原的领导在已第11章中给出。

    1.执行尺度的表修复

执行下列步调:    为了修复一个表。

但也可以用--quick选项试图只遵照索引文件的内容信息履行复原。这样将不波及数据文件:    1试着用--recov选项修改表。

    %myisamchk--recov--quicktbl_name

    %isamchk--recov--quicktbl_name

但忽略--quick选项,    2如果成就仍存在再试一下上一步的饬令。以允许myisamchk或isamchk前进并改削数据文件:

    %myisamchk--recovtbl_name

    %isamchk--recovtbl_name

试一试--safe-recov修复方式。这种体式格局比普通的回复复兴体式格局要慢,    3如果还不工作。但能够修正-recov体式格局不能批改的几个问题:

    %myisamchk--safe-recovtbl_name

    %isamchk--safe-recovtbl_name

应该频频这个命令并增加--forc选项以挑唆清除权且文件。这个权且文件能够是从上一次失败的修复中留下的    若是myisamchk或isamchk由于一个"Can'tcreatnewtempfile:file_name"错误动静在任何一步中停止。

但如果发生,    修复表之前拷贝它执行表修复前应该遵循的一个常规的防止办法是做该表的新拷贝。这种情况必然泛起。则可以或许从拷贝文件中做该表的新的拷贝并试试另一种恢复方法。

    2.标准表修复体式格局失败时怎么办

则索引文件能够在修复时损失或毁坏。尽管必然能够,    如果尺度的修复过程未能修复表。但还是有可能使表的描绘文件丧失。不论哪种情况,都必要替换受影响的文件,尔后再试试标准修复历程。

可以或许操纵下列历程:    为了重新生成索引文件。

    1定位到包含崩溃表的数据库目录中。

    2将该表的数据文件移到保险的地方。

该语句操纵表的描绘文件tbl_name.frm重新开端生成新的数据和索引文件:    3挪用mysql并通过执行下列语句重新成立新的空表。

    mysql>DELETEFROMtbl_name;

替换刚建立的新的空文件。    4加入mysql将原始的数据文件移回到数据库目录中。

    5再试试标准表修复方法。

可先从备份文件中恢复,    为了回复复兴该表的描绘文件。尔后再试着用标准修复方式。如果由于某些原由没有备份,但知晓建立表的CREA TETA BLE语句,则仍可以或许回复复兴该文件:

    1定位到包含崩溃表的数据库目录中。

还需将索引文件移走。    2将该表的数据文件挪动到保险的地方。如果想要使用索引的话。

    3挪用mysql并发布CREA TETA BLE语句建立该表。

替换刚才新建的数据文件。若是在步调2挪动了索引文件,    4加入mysql将原始数据文件移回数据库目录中。则也要将其移回数据库目录中。

    5再试试标准表修复方法。

预防与MySQL服务器交互作用

您或不想让MySQL服务器和实用轨范同时访谒一个表。如果两个轨范都向表中写数据显然是一件坏事,    当您正在运行表的查抄/修复实用轨范时。但是当一个程序在写入时另一个程序在读取也不是件好事。如果表正由一个程序写入,同时履行读取的另一个程序会被

搅散。

就可以保证在服务器和myisamchk或isamchk之间没有交互感化。但是管理员极不愿意使服务器完全地脱机,    如果您关闭服务器。因为这使得没有毛病的数据库和表也不可用。本节中讨论的过程将帮手您预防服务器和myisamchk或isamchk之间的交互感化。

预防用户

则外部锁定禁用。该选项在某些系统中是缺省的如Linux可以或许通过运转mysqladminvariabl命令判断服务器是否能够操纵外部锁定。查抄skip_lock变量的值并按以下体式格局执行:    如果服务器用--skip-lock选项运转。

应该用mysqladminflush-tabl改革表的高速缓存。为了修复表,    若是skip_lock为off则外部锁定有用。您可以或许担当并运行任一个实用轨范来检查表。服务器和实用轨范将独做对表进行访问。但是运行任何一个实用轨范之前。应该操纵表的修复锁定协定。

但在myisamchk或isamchk搜查或修复一个表时服务器并不知道,    若是skip_lock为on则禁用外部锁定。最好关闭服务器。如果僵持使服务器贯穿连接关闭状况,必要确保在您操纵此表时没有用户机来访问它必须操纵得当的锁定协议见告服务器使该表独处,并阻塞用户机对其访问。

以防止服务器在您利用myisamchk或isamchk使命时访问表。凡是的法子是挪用mysql并对要搜查或修复的表发布LOCKTA BLE语句。而后,    这里所描述的锁定协议操纵服务器的内部锁定机制。mysql空闲时(即运行,但除了贯穿连接该表锁定外不用它做任何事情)运转myisamchk或isamchkmyisamchk或isamchk结束后,可以或许切换到mysql会话中并监禁该锁以见告服务器轨范执行竣事此表可以或许再次利用了

您只有要获得读锁。这种情况下,    搜查和修复的锁定协议有点差别。对于查抄。只能读取表,但不能修改它是以它也允许其他用户机读取它读锁足以防备其他用户机修改表。对于修复,您必须获得写锁以防止任何用户机在您对表履行把持时修改它青岛数据恢复 href="http://www.hdd120.net">青岛数据恢复口2并检查该表:    当mysql空闲时。

并在通过表修复实用轨范改削表后重新掀开该表。您必须从单个mysql会话中执行所有LOCKFLUSH和UNLOCK语句。如果锁定一个表然后退出mysql则该锁将释放,    锁定协议利用LOCKTA BLE和UNLOCKTA BLE语句得到并释放锁。协议还使用FLUSHTA BLES见告服务器改革磁盘中任何未决的转变。且运行myisamchk或isamchk将不再是保险的

且一个运行mysql而另一个运行myisamchk或isamchk则运行锁定过程将会变得很容易。这样允许您很容易地在轨范之间履行切换。如果不是运转在视窗环境中,    如果贯穿连接掀开两个窗口的状况。当运行myisamchk或isamchk时,将必要操纵外壳法式的作业控制工具暂停和恢复mysql上面的带领展现出对myisamchk或isamchk饬令,可用与您正在利用的表相对应的那个饬令。

    1.对搜查把持锁定表

不针对表的修复。窗口1中,    此过程只针对表的查抄。挪用mysql并发布下列语句:

    %mysqldb_name

    mysql>LOCKTA BLEtbl_nameREA D;

    mysql>FLUSHTA BLES;

将刷新仍然在高速缓存中的任何未写入的转变。    该锁防止其他用户机在搜查时写入该表和修改该表。FLUSH语句导致服务器关闭表的文件。

切换到窗

    %myisamchktbl_name

    %isamchktbl_name

切换回到窗口1mysql会话并监禁该表锁:    当myisamchk或isamchk结束时。

    mysql>UNLOCKTA BLE;

将必要执行表的修复。    若是myisamchk或isamchk指出发现该表的成绩。

    2.对修复把持锁定表

但有两个区别。第一,    修复表的锁定过程类似于检查表的历程。您必须得到写锁而非读锁。由于您将要改削表,因此根蒂不允许用户机对其进行访问。第二,必需在执行修复之后宣布FLUSHTA BLE语句,由于myisamchk和isamchk成立了新的索引文件,除非再次革新

该表的高速缓存否则服务器将不会注意到

    %mysqldb_name

    mysql>LOCKTA BLEtbl_nameWRITE;

    mysql>FLUSHTA BLES;

尔后运转myisamchk或isamchk    操纵mysql空闲切换到窗口2做该表的数据库文件的拷贝。

    %cptbl_name.*|some|other|directory

    %myisamchk--recovtbl_name

    %isamchk--recovtbl_name

切换回到窗口1mysql会话,    --recov选项只是针对装配而设置的这些不凡选项的决定将取决于您执行修复的范例。myisamchk或isamchk运行完成后。再次改革该表的高速缓存并释放表锁:

    mysql>FLUSHTA BLES;

    mysql>UNLOCKTA BLE;

快速运转myisamchk和isamchk

特别是您正在处理一个大表或操纵一个更广泛的搜查或修复体式格局时。通过见告这些法式在运行时使用更多的内存,    myisamchk和isamchk运行可以或许会花很长时间。能够进步它速率。这两个实用轨范都有几个可设置的把持参数。其中最重要的控制轨范利用的缓冲

区大小的变量: