处理“Got error 127 from table handler”失败及教训 (MySQL学习)
发布于 2007-12-26 19:28 1 阅读:54,220 评论:1 标签: mysql

    昨天在处理mysql数据的时候提示:Got error 127 from table handler。症状为:取出前面的数据没问题,但是在遇到一条游问题的数据时显示“Got error 127 from table handler”。

   上网查询资料如下:

以下是引用片段:
1:Got error 127 from table handler
2:MySQL : GOT error 127 from table handler
3:表被破坏
4:手册对repair table的说明
5:手册对check table的说明

    比较有参考价值的回复如下:

以下是引用片段:
1 E_ERROR fatal run-time errors  
2 E_WARNING run-time warnings (non fatal errors)  
4 E_PARSE compile-time parse errors  
8 E_NOTICE  run-time notices (less serious than warnings)   
16 E_CORE_ERROR fatal errors that occur during PHP's initial startup PHP 4 only
32 E_CORE_WARNING warnings (non fatal errors) that occur during PHP's initial startup  PHP 4 only
64 E_COMPILE_ERROR fatal compile-time errors PHP 4 only

error 127就是同时存在2,4,8,16,32,64的错误
主要的是16和64,原因分析:可能是你装php的时候有问题,建议重装

    看得资料一般是说使用“REPAIR TABLE `tablename`”去修复表,看了手册的说明后操作如下:

以下是代码片段:
mysql> check table mytable;
+-------------------+-------+----------+----------------------------------------------------+
| Table             | Op    | Msg_type | Msg_text                                           |
+-------------------+-------+----------+----------------------------------------------------+
| mydb.mytable | check | error    | got error: 5 when reading datafile at record: 1291 |
| mydb.mytable | check | error    | Corrupt                                            |
+-------------------+-------+----------+----------------------------------------------------+
2 rows in set (3.09 sec)

    check的结果与测试得到的差错点一致,为第1291条数据开始便有问题了!然而在这个时候尝试取出数据时失败了:

以下是代码片段:
mysql> select * from `mytable` limit 1291, 1;
ERROR 1016: Can't open file: 'mytable.MYD'. (errno: 145)

    真是无语啊........骑虎难下,继续操作,希望还有救:

以下是代码片段:
mysql> repair table mytable;
+-------------------+--------+----------+----------------------------------------+
| Table             | Op     | Msg_type | Msg_text                               |
+-------------------+--------+----------+----------------------------------------+
| mydb.mytable | repair | warning  | Number of rows changed from 30030 to 0 |
| mydb.mytable | repair | status   | OK                                     |
+-------------------+--------+----------+----------------------------------------+
2 rows in set (3.10 sec)

    疯了!30030条数据全没了!幸好还有备用的数据库,把数据文件和索引文件直接copy了过来,修改文件的权限后,数据能正常取出了。

    为什么会这样呢?原因不详,只能吸取教训:
    1:修复表时最好先锁定表。
    2:最好是在把mysql shut down后再修复表。

    谁能告诉我这是怎么回事?非常感谢!

展开全文  
收起全文  
mysql_select_db的问题 (MySQL学习)
发布于 2007-10-20 14:26 1 阅读:29,348 评论:1 标签: mysql

      现有三个端口:3310(db0,db1),3311(db2,db3),3312(db4,db5)
  括号内为这个端口的数据库

  现处理一个文件,把文件里的数据一行一行插入到数据库中
  每一行数据对应一个表
  相邻行的数据一般属于不同端口的不同数据库的不同的表

  问题情况1:

    .............
    第一条数据为3310端口db0
    第二条数据为3311端口db2
    第三条数据为3310端口db1
    .............

  每条数据处理前均用mysql_select_db($db, $link)选择数据库,$link确定每次正确,且每个端口一个资源符号
  如果mysql_select_db操作失败,则程序中输出警告提示
  在mysql_query($sql)第三条数据时,提示db2的表xxx不存在!由此看来是mysql_select_db失败了,但是并没有因为mysql_select_db出错的提示

      问题情况2:()

    .............
    第一条数据为3310端口db0
    第二条数据为3310端口db1
    .............

  在mysql_query($sql)第二条数据时,提示db0的表xxx不存在!情况同上!

  很奇怪,mysql_select_db就这么没用么?!因为在mysql_query中加上数据库连接资源参数后就没问题了

  如果,每个库都有一个独自的数据库连接资源,也能解决这个问题。

  但是mysql_select_db的作用就是在同一个port下选择数据库用的,是不是偶其它方面出了问题?

展开全文  
收起全文  
select语句where的作用 (MySQL学习)
发布于 2007-09-14 20:52 7 阅读:41,349 评论:7 标签: mysql select where

      where,是个好东西!

      但你面对千万级的数据,如何更快的所用遍历数据,并根据自己的需要处理数据?where会起到多大的作用?

      当然,前提是数据中的某数据有它的规律。

      假如,有一表有一个字段tableid为int,唯一且索引。在这个时候我们可以使用where字句让遍历加速。

      比较以下两个语句:

以下是代码片段:

select * from `tablename` order by `tableid` limit $numStart, 10000;

select * from `tablename` where `tableid`>'$tableidStart' order by `tableid` limit 10000;

      上面的例子是想根据tableid的顺序来遍历整个表,所以有个排序的字句。显然,对于千万级别的库或表来说排序这个费时间的事情,但是没关系,前面已经假设它有索引了,所以时间相对还是可以承受的。

      索引有这么大的作用么?不信可以看看mysql数据存储目录下的.MYI文件的大小,再看看.MYD文件的大小,一目了然!常言道,不能占着茅坑不拉屎,mysql很好的避免了这一点!

      相信你可以注意到limit子句中,偶限制的条件是“10000”。在损耗内存和操作数据库的权衡中,我还是比较倾向损耗内存。

      言归正传,说一下where子句。如果没有where,只有“$numStart, 10000”,那么这个查询会如何进行呢?mysql会根据“order by `tableid`”以后,再找到前$numStart条数据,然后从第$numStart+1条数据开始返回1000条数据。请注意这个“再找到前$numStart条数据”的时间,它是随着$numStart的增加而增加的!

      时间的损耗,正在于此。没有时间的教训是不会注意到这个的。我曾犯过这个错误,然后认识到了这一点。但是,时间一长......又忘记啦!

      如果在这个时候,我们加上一个“where `tableid`>'$tableidStart'”,时间的损耗立马减少了!这个字段是有索引的,找到一个特定的值的时间几乎可以忽略!在这个时候,对这个有索引的字段排序再找前10000条(“limit 10000”),简直易如反掌!

      在我的测试中,假设没有where子句的语句要跑5个小时,那么加上这个where子句,只需40分钟!这个时间是怎么节省出来的?主要是在“再找到前$numStart条数据”的时间,前面提到这个几乎是个等差数列的方式的增长。而加上where子句,这个时间差几乎为0!

      特以此文,警示自己不再忘记!

      两条语句中使用两个变量,变量怎么来的,大家根据情况而定了。

展开全文  
收起全文  
Lost connection to MySQL server during query (MySQL学习)
发布于 2007-09-13 11:24 阅读:36,794 评论:0 标签: mysql

  今天发现一个Mysql的远程连接出现"Lost connection to MySQL server during query"。而且定义的中间变量出现异常变化

  我们在遇到问题的时候,最郁闷的不是找不到解决方法,而是不知道引发错误的原因有很多种。上网查看的资料,你看了半天会很纳闷:这是哪门子的事呢?情况怎么和我的一点也没相似之处呢?

  很郁闷,今天偶又遇见这种事了!

  查询资料http://www.linuxaid.com.cn/tips/4/3/432627797.shtml,里面提到:

以下是引用片段:

  这个问题是由于glibc的一个bug造成的。
  在glibc某些版本中,gethostbyaddr函数(确切地说是_nss_dns_gethostbyaddr_r)存在缓冲区溢出问题,在处理大数据时会造成SEGMENT FAULT。
  在处理远程连接时,mysqld会调用ip_to_hostname()函数,再由这个函数调用gethostbyaddr函数,最后系统在执行nss_dns_gethostbyaddr_r函数处崩溃。因此,会出现上述情况。
  解决问题的办法是升级glibc。

  但实际上,在偶这的情况却不是这样的。

  在执行“php a.php”后,再次执行“php a.php”,便有可能出现“Lost connection to MySQL server during query”的错误。用“ps aux | grep php”,会显示一个“php a.php”的进程。之所以是一个,是因为在mysql出错后那个进程就自己断了。

  解决方案:找到进程号,直接kill!

  使用的连接是短连结(mysql_connect())。为什么会丢失连接?还未知。

展开全文  
收起全文  
写一下前段时间遇到的mysql问题 (MySQL学习)
发布于 2007-09-08 20:05 阅读:22,964 评论:0 标签: mysql

      今天给网站换了一个编辑器,终于可以使用“引用”和“代码”两个模式了,以前用的编辑器一直没这个功能,甚至连个上传的都没有,现在终于都有了,只是编辑器的颜色很难看,很奇怪在偶自己本地的时候可以换一个好看的颜色,但到了这个空间。。。。。。世界就变了,要是换个颜色编辑器就不能用了,只好将就了,等有了时间再弄弄

    本来是想吧整个站点都改了以后再换编辑器,但是实在没时间做整站的改动,只好先把编辑器换了。哎,毕业了,空余时间也少了。

    不说废话,发点代码,玩玩新功能吧。

1:用命令把数据库导到文本中。

    资料来自:http://blog.csdn.net/sd_lichangyou/archive/2006/08/22/1106257.aspx

    命令是mysqldump例如我要将我的数据库myproject中的所有表导出来。步骤是

    第一:到mysql安装目录的bin下
    第二:

以下是代码片段:

     mysqldump -h localhost -u root -p myproject -r d:\myproject.sql


    第三:回车后提示输入密码,然后就OK了,保存在了d盘下

    注:这个命令偶没试过,汗~~~~

    记得用命令导数据表可以用:

以下是代码片段:

    select * from tablename into outfile "filename"

   不过在linux/unix下要记得对所在的目录授予写权限,如:

以下是代码片段:

    chmod 777 /home/mydir

2:远程连库时的IP限制问题

    从IP A上连接IP B上的mysql的时候提示:

以下是代码片段:

     Warning: mysql_pconnect(): Access denied for user: 'root@A (Using password: YES)
     in /usr/home/shengting/del_error.php on line 6


    发现A为vip(虚拟IP)

    解决方法,在没有mysql的mysql库中的user表里面添加Host字段值“A”

    上面所说的并不是只有vip才有这个限制,只是偶遇见的是vip而已。

3:$arr["count(`id`)"] 错写成 $arr[count(`id`)]

4:更改表名更改表名:

    命令:rename table 原表名 to 新表名;
    例如:在表MyClass名字更改为YouClass

以下是代码片段:

    mysql> rename table MyClass to YouClass;

5:清空数据表

以下是代码片段:

    truncate table tablename;

6:如何把操作mysql损失降到最低

    应该在启动mysql时加上参数"--i-am-a-dummy"。(我是个新手)
    此时mysql将拒绝执行不带where的update和delete命令

7:mysql文件的认识

以下是引用片段:

.frm 是描述表结构的文件
.MYD 是表的数据文件
.MYI 是表数据文件中任何索引的数据树。

8:char 或 varchar的区别

以下是引用片段:

    如果使用 char 或 varchar,建议执行以下操作:
    如果列数据项的大小一致,则使用 char。
    如果列数据项的大小差异相当大,则使用 varchar。
    如果列数据项大小相差很大,而且大小可能超过 8,000 字节,请使用 varchar(max)。

展开全文  
收起全文  
导库时发现了两个mysql问题 (MySQL学习)
发布于 2007-08-29 21:22 1 阅读:46,173 评论:1 标签: mysql

由于准备重新架构网站,涉及到数据备份问题,问题由此引发。

第一个:

由wyaj的phpmyadmin导出的数据在偶机子上导入时老是提示有臭虫,大意是什么二进制、引号之类的问题。还以为是数据存在大量单双引号出现的问题,于是便写程序自己把数据导出来再导进去。提示依旧。

突然感觉这个问题以前也似乎出现过。于是"set names gb2312"、"set names gbk"、"set names utf8"之类的命令一个一个的试。结果还是很无语。

也不知道是使用什么方法处理了一下,发现终于出了一个又很熟悉的错误:"ERROR 1406 : Data too long for column xxx"。顿时觉悟了。

当初抱着严格要求自己写sql语句的目的,把mysql设置为"STRICT_TRANS_TABLES"。于是便引发了这个问题,还害得偶自己写程序去导数据。

解决方法:

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"把其中的"STRICT_TRANS_TABLES,"去掉,然后重启mysql就ok了。

第二个:

自己写了一个mysql操作类,里面对操作的错误做了报警。其中里面有:
$this->affectNum = mysql_num_rows($this->queryId) or .......;
$this->affectNum = mysql_affected_rows($this->queryId) or .......;

问题又出来了,当返回的值是0的时候,也会执行"or"后面的语句。当时百思不得其解,幸好有里面的纯属误会指点,叫偶查手册才明白,上面两个函数的返回值是int。顺便指出偶程序中的bug:为了防止未知的意外情况,在使用foreach之前,一定要 is_array()!

哎,这都是很基础的问题。

展开全文  
收起全文  
MyISAM和InnoDB类型数据表在复制时的区别 (PHP心得)
发布于 2006-12-08 13:28 阅读:52,354 评论:0 标签: InnoDB MyISAM mysql 复制

当数据量的时候,采用复制MySQL下data目录下文件似乎更为快捷。但在复制的时候MyISAM类型可以很顺利的进行。但是InnoDB类型的被复制过去后,在数据库中可以看到表的存在,但使用它的时候却提示表不存在,并提示无法找到一个文件。此时删除也删除不了,新建一个同名的也不行。后来偶终于想到一个方法,那就是把此表的数据表文件删除,嘿嘿,好了!这时候再手工导入就可以了。

展开全文  
收起全文