2010-03-26 3 views
2

여기에 무슨 일이 있습니까? BTW, MySQL 서버 버전 : 5.0.45-log 소스 배포판.날짜와 MySQL의 결과가 일치하지 않습니다.

mysql> select count(*) 
     from notes 
     where date(updated_at) > date('2010-03-25'); 
+----------+ 
| count(*) | 
+----------+ 
|  0 | 
+----------+ 
1 row in set (0.59 sec) 

mysql> select count(*) 
     from notes 
     where message like'%***%' 
      and date(updated_at) > date('2010-03-25'); 
+----------+ 
| count(*) | 
+----------+ 
|  26 | 
+----------+ 
1 row in set (1.30 sec) 

mysql> explain select count(*) 
     from notes 
     where date(updated_at) > date('2010-03-25'); 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | notes | ALL | NULL   | NULL | NULL | NULL | 588106 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
1 row in set (0.07 sec) 

mysql> explain select updated_at 
     from notes 
     where message like'%***%' 
      and date(updated_at) > date('2010-03-25'); 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra  | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
| 1 | SIMPLE  | notes | ALL | NULL   | NULL | NULL | NULL | 588106 | Using where | 
+----+-------------+-------+------+---------------+------+---------+------+--------+-------------+ 
1 row in set (0.09 sec) 

mysql> 

다음은 스키마입니다.

CREATE TABLE `notes` (
`id` int(11) NOT NULL auto_increment, 
`status` varchar(255) default NULL, 
`message` text, 
`noteable_id` int(11) default NULL, 
`noteable_type` varchar(255) default NULL, 
`deleted_at` datetime default NULL, 
`creator_id` int(11) default NULL, 
`updater_id` int(11) default NULL, 
`deleter_id` int(11) default NULL, 
`created_at` datetime default NULL, 
`updated_at` datetime default NULL, 
`public` tinyint(1) default '0', 
`forced` tinyint(1) default '0', 
`agent_created_at` datetime default NULL, 
PRIMARY KEY (`id`), 
KEY `noteable_id` (`noteable_id`), 
KEY `deleted_at` (`deleted_at`), 
KEY `noteable_type` (`noteable_type`(10)), 
KEY `creator_id` (`creator_id`), 
KEY `status` (`status`), 
KEY `created_at` (`created_at`) 
) ENGINE=InnoDB AUTO_INCREMENT=613168 DEFAULT CHARSET=latin1 
+0

아니, 아무것도 변경되지 마이그레이션됩니다 . 나는 두 개의 쿼리를 계속 시도 할 수 있으며 같은 결과가 반복적으로 발생합니다. –

+0

테이블의 스키마를 게시하고 사용중인 엔진 및 버전을 말하십시오. – MarkR

+0

게시 됨. 또한, 나는 덤핑/테이블 가져 오기 시도하고 일관된 결과를 얻기 시작합니다. 데이터베이스가 손상된 것 같습니다. –

답변

0

이 특정 인스턴스는 데이터베이스 손상으로 인한 것이 아니라 MySQL 버전 5.0.45 (+?)의 Date 함수 버그로 밝혀졌습니다.

http://bugs.mysql.com/bug.php?id=32159

우리는 바로이 상황에 반응 할 필요가 표시되지 않습니다,하지만 우리는 MySQL을 더 높은 버전 (중 5.0.77+ 또는 5.1)

0

테이블이 작은 경우, (같은 버전) 또 다른 상자에 신선한 서버에서 다시로드 & 덤핑보십시오. 문제가 사라지면 내부 손상이 발생하며 기존 서버에서 테이블을 다시로드하거나 덤프에서 전체 데이터베이스를 다시 시작해야합니다.

동작이 깨끗한 데이터베이스에서 재현 가능하고 아무도 스키마를 게시 한 후에 아무도 그것을 설명 할 수없는 경우 버그를 제기하십시오.

+0

시도해 보았을 때 쿼리가 실제로 일관되었습니다. 우리는 마스터 - 슬레이브 복제를 사용하고 있으며 마스터가 손상되었습니다. 따라서이 데이터를 다시로드하는 가장 좋은 방법은 무엇입니까? –

+0

테이블이 작 으면 테이블을 mysqldumping하여 다시로드하십시오 (서비스 가용성에 영향을 미침). 테이블이 크면 테스트 시스템에서 다양한 옵션을 시도해보십시오. mk-parallel-dump가 상당히 빠르지 만 빠른 것은 아닙니다. SELECT INTO OUTFILE 다음에 LOAD DATA INFILE도 작동합니다. 프로덕션이 아닌 시스템에서 프로덕션 크기의 데이터로 실험하십시오. – MarkR

관련 문제