문제

우리는 어젯밤 Solaris MySQL 데이터베이스 엔진을 제대로 실행하지 못했습니다. 트랜잭션 로그에서 순서 오류가 발생하지 않고 인덱스가 손상된 인덱스 오류가 발생하면 적어도 일부 InnoDB 테이블이 손상되어 손상되었습니다.

우리는 MyISAM 테이블 수리에 사용할 수있는 도구에 대해 알고 있지만 InnoDB에는 아무것도 찾을 수 없습니다.

참고 사항 : 테이블 최적화를 시도하면 (손상된 인덱스를 재건하려는 시도에서) 데이터베이스 서버가 충돌합니다.

도움이 되었습니까?

해결책

가장 먼저 서버를 멈추고 디스크를 이미지를 이미지화하십시오. 이것에 한 번만 촬영 한 것은 없습니다. 그런 다음 살펴보십시오 여기.

다른 팁

신청을 중지하거나 새 행이 추가되지 않도록 노예를 중지하십시오.

create table <new table> like <old table>;
insert <new table> select * from <old table>;
truncate table  <old table>;
insert <old table> select * from <new table>;

서버 또는 슬레이브를 다시 시작하십시오

다음 솔루션은 위의 Sandro의 팁에서 영감을 받았습니다.

경고: 그것은 나를 위해 일했지만, 그것이 당신에게 효과가 있는지 알 수는 없습니다.

내 문제는 다음과 같습니다. 테이블에서 특정 행을 읽으십시오 (이 테이블이라고 부르겠습니다. broken) MySQL 충돌. 조차 SELECT COUNT(*) FROM broken 그것을 죽일 것입니다. 나는 당신이 가지고 있기를 바랍니다 PRIMARY KEY 이 테이블에서 (다음 샘플에서는 id).

  1. 깨진 MySQL 서버의 백업 또는 스냅 샷이 있는지 확인하십시오 (1 단계로 돌아가서 다른 것을 시도 할 경우를 대비하여!)
  2. CREATE TABLE broken_repair LIKE broken;
  3. INSERT broken_repair SELECT * FROM broken WHERE id NOT IN (SELECT id FROM broken_repair) LIMIT 1;
  4. DB가 충돌 할 때까지 3 단계를 반복합니다 (사용할 수 있습니다. LIMIT 100000 그런 다음 사용될 때까지 낮은 값을 사용하십시오 LIMIT 1 DB를 충돌시킵니다).
  5. 모든 것이 있는지 확인하십시오 (비교할 수 있습니다 SELECT MAX(id) FROM broken 행의 수에 broken_repair).
  6. 이 시점에서, 나는 분명히 내 모든 행을 가졌다 (아마도 innodb에 의해 야만적으로 잘린 것들을 제외하고). 당신이 몇 줄을 놓치면, 당신은 OFFSET ~로 LIMIT.

행운을 빕니다!

MySQL에서 제공하는 솔루션은 다음과 같습니다.http://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html

이 기사를 참조하십시오 : http://www.unilogica.com/mysql-innodb-recovery/ (포르투갈어에 있습니다)

사용 방법에 대해 설명합니다 innodb_force_recovery 그리고 innodb_file_per_table. 나는 단일로 추락 된 데이터베이스를 복구해야 할 필요성을 발견했다. IBDATA1.

innodb_file_per_table을 사용하면 InnoDB의 모든 테이블은 MyISAM과 같은 분리 된 테이블 파일을 만듭니다.

1 단계.

MySQL 서버를 중지하십시오

2 단계.

이 줄을 my.cnf에 추가합니다 (Windows에서는 my.ini라고합니다)

set-variable=innodb_force_recovery=6

3 단계.

삭제 IB_LOGFILE0 그리고 IB_LOGFILE1

4 단계.

MySQL 서버를 시작하십시오

5 단계.

이 명령 실행 :

mysqlcheck --database db_name table_name -uroot -p

충돌 된 InnoDB 테이블을 성공적으로 수정 한 후 My.cnf에서 #set-variable = innodb_force_recovery = 6을 제거한 다음 MySQL 서버를 다시 다시 시작하는 것을 잊지 마십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top