Myisam引擎数据恢复策略

2019-12-22 10:40
网络安全和信息化 2019年1期
关键词:数据表命令数据库

恢复表结构,顺利读取数据

在网站运行过程中,有时会连接数据库失败的情况,笔者经过检测,发现是后台数据库中某些表的结构损坏造成的。这是因为对于“.FRM”文件来,因为其存储着表的结构信息,一旦其损坏,将造成无法读取表中数据的情况。其修复策略是先将存储数据的“.MYI”和“.MYD”文件复制到其他目录中存储起来,之后在数据库中重建同名的表,助于表结构要相同。将“.MYI”和“.MYD”文件复制回来,登录数据库执行“repair table”命令,执行修复操作,最后查看修复结果。这里使用相关的例子,来说明解决的方法。

例如,在MySQL中存在名为“shujku1”的库,在该库中存在名为“sampletb”的 表。 进 入“/var/lib/mysql/shujuku1”目 录,执行“ls”命令,却没有发现“sampletb.frm”文件。当执行“mysql -p”命令登录进来。执行“use shujuku1;”命令进入该数据库,执行“show tables;”命 令,会发现“sampletb”表并不存在。当执行“select * from sampletb;”之类的命令,MySQL会显示“ERROR 1146(42S02)”之类的错误信息。

为此,可按照上面的方法,将“sampletb.myi” 和“sampletb.myd” 移 动 到别处,在“shujuku1”数据库中使用“create table sampletb”命令创建同名的表,结构必须相同,相当于重建“sampletb.frm”文件。将上述文件复制回来,替换掉新创建的文件,登录到数据库,执行“repair table sampletb;”命令,会重建“sampletb.frm”和上述文件之间的关系。

恢复因索引损坏丢失的数据

某次因为服务器异常掉电,当电力恢复后,重启服务器,发现网站运行出错。在进行检测时,发现在读取表数据时MySQL出现报错信息。分析其原因,可能是当服务器突然断电时,数据库正在向“.MYI”文件中刷新索引信息,造成索引文件结构发生错误。实际上,当“.MYI”的头数据损坏(例如第一个16KB块等),包含的信息不正确以及该文件丢失等,都会出现此类故障。因为手头只有“.frm”文件,只有通过其来完整恢复表结构,让表恢复到可用状态。

具体方法是新将“.FRM”文件复制到数据库目录中,针对“.MYD”和“.MYI”文件,创建对应的空文件。如果存在这些文件,先将其删除。登录数据库,执行“repair table xxx use_frm”命令,其中的“xxx”为表名,执行修复动作,即让MySQL以该“.frm”文件为基础,来修复表文件,来计算“.MYD”和“.MYI”文件应该具有的内容,最后查看恢复结果。还以上面的例子进行说明,假设只有“sampletb.frm”文件,另外的文件丢失了,当执行各种查询命令时,MySQL会显示“ERROR 1017(HY000)”的错误提示。按照上述方法将“sampletb.frm”复制回来,在Linux命令行下执行“touch sampletb.MYD”和“touch sampletb.MYI”命令。来创建对应的数据和索引文件。为了让MySQL有权限对其进行处理,执行“chown mysql. Sampletb.*”命令,即可实现该要求。在MySQL命令行中执行“repair table sampletb use_frm;”命令,完成后就可以正常操作该表了。

使用Myisamchk恢复数据表

实际上,可以使用Myisamchk这一专用的工具,对Myisam表进行修复,该命令可以获取有关数据库表的统计信息,并对其进行检查,修复和优化。和之前的“repair table”命令不同,该命令可以通过合理的调整参数,可以实现不同的修复手段和方式,完成细节化的调整。更重要的是,该命令的修复速度很快,特别是修复大体积的表时尤为明显。

其命令格式为“myisamchk [参 数]tables[.MYI]”,其 中 的 用来执行检测功能的参数包括“-i”,可以打印所检查表的统计信息。“--F”参数只检查有没有正确关闭的表,“-f”参数用来执行自动修复操作。“-m”参数可以快速执行检测操作等。例如,在Linux命令行下执行“myisamchk -im /var/lib/mysql/shujuku1/sampletb”命 令,可 以 对“sampletb”表进行快速检查。执行“myisamchk -iFm /var/lib/mysql/shujuku1/*”命令,只检查未正常关闭的表。执行“myisamchk -eis /var/lib/mysql/shujuku1/sampletb”命令,仅显示“sampletb”表中最重要信息。

默认下,“Myisamchk”命令使用的内存过小,如果要修复较大的表,速度自然会很慢,通过为其设置更大的内存量,可以加速其修复速度。例如执行“myisamchk-sort_buffer_size=32M-key_buffer_size=16M-read_buffer_size=2M-write_buffer_size=2M 具体的修复参数等”格式的命令,可以灵活的针对排序缓冲(用于计算和建立索引),读写缓冲等分配指定的内存量。在具体进行数据恢复时,需要遵循一定的顺序。首先应该仔细查看MySQL显示的错误码信息,例如执行“myisamchk -im --verbose表名”命令,来查看具体的错误码。

简单错误的快速修复

对于有些简单的错误来说,实际上是无需进行复杂的修复操作的。例如对于Error 135和136错误来说,是因为记录文件或索引文件的空间不够了,可以在MySQL执行“ALTER TABLE sampletb MAX_ROWS=xxx AVG_ROW_LENGTH=xxx”命令,来扩大行所能容纳的数量以及扩大索引所能包含的信息,其中的“xxx”为具体的数字。在执行修复操作时,必须保证“mysqld”服务没有使用到该表,为了稳妥起见最高暂时关闭该服务。

如果不关闭该服务器的话,要先执行“flush tables表名 with read lock”命令将其锁定,防止两者同时对其访问。否则可能因为该服务和“Myisamchk”命令同时访问读写目标表,造成其出现损坏的情况。准备好以上条件后,就可以执行具体的修复动作了。

例如,先执行“myisamchl-rq sampletb” 命 令,对“sampletb”表进行快速修复。如果失败可以执行“myisamchl -Br sampletb”命令,来修复数据本身。如果还失败,执行“myisamchl-o sampletb”命令,进行彻底修复。

其中的“-r”参数可以修复几乎所有的问题,“-B”参数可以将“.MYD”文件备份为指定的文件,备份文件名称中包含具体的时间。“-o”参数表示使用一个老的恢复方法按照顺序读取所有行,并根据找到的行更新所有的索引树,该参数的修复速度是最慢的,其相当于对表进行了遍历。“-q”参数不修改数据文件,仅执行快速修复操作,当出现复制键时,可以两次指定该项以强制“Myisamchk”命令修改原数据文件。该参数可以帮助用户简单的检查表中数据损坏情况(例如索引文件出现问题,和表结构有关的小问题等),并实现快速修复操作,其并不会修改“.MYD”文件中存储的数据,是一种比较安全的修复方式,不会破坏数据完整性。

修复损坏的数据表

在维护网站时,笔者有时会遇到是某个数据表损坏,造成数据读写出错的情况,针对这一情况,完全可以使用“Myisamchk”命令进行修复。还以“sampletb”表为例进行说明,在MySQL命令行中执行“check tables sampletb”命令,系统提示该表数据受损。当执行“flush tables sampletb with read lock;”命令,试图对其锁定,但是系统提示“ERROR 145(HY000)Table is marked as crashed and should be repaired”信息,说明其根本无法读取,自然不必手工锁定。返回Linux命令行,执行“myisamchk sampletb”命令,对该表进行检测,根据返回信息,可以查看具体的错误信息。执行“myisamchk-Br sampletb”命令,就可以将其修复了。但是,在MySQL中对其查询时,可能会发现有些数据丢失了,这就说明在很多情况下,单纯依靠修复操作是无法找回数据的。

此外,当索引表丢失后,也可以使用“Myisamchk”命令进行有效修复。例如先将“sampletb.MYD”文件移动到别的位置。在Linux命令行下 执 行“touch sampletb.MYD” 和“touch sampletb.MYI”命令。来创建对应的数据和索引文件。为了让MySQL有权限对其进行处理,执 行“chown mysql.Sampletb.*”命令,即可实现该要求。在MySQL命令行中执 行“repair table sampletb use_frm;”命令,修复索引结构。将“sampletb.MYD”复制回来,执 行“myisamchk -r sampletb” 命 令, 对“sampletb”表进行修复。

猜你喜欢
数据表命令数据库
基于VBA 的教务数据平台研究
管理Windows10的PowerShell命令行使用记录
湖北省新冠肺炎疫情数据表(2.26-3.25)
湖北省新冠肺炎疫情数据表
湖北省新冠肺炎疫情数据表
移防命令下达后
数据库
解析Windows10的内部命令
数据库
数据库