덤프 파일에서 MySQL 복원 속도를 높이려면 어떻게해야합니까?


28

mysqldump 파일에서 30GB 데이터베이스를 새 서버의 빈 데이터베이스로 복원하고 있습니다. 덤프 파일에서 SQL을 실행하면 복원이 매우 빠르게 시작된 다음 느리고 느리게 시작됩니다. 개별 인서트는 이제 15 초 이상 걸립니다. 테이블은 대부분 하나의 작은 InnoDB를 가진 MyISAM입니다. 서버에 다른 활성 연결이 없습니다. SHOW PROCESSLIST;복원 및 삽입 프로세스 목록 자체의 삽입 만 표시합니다.

누구든지 극적인 속도 저하를 일으킬 수있는 아이디어가 있습니까?

복원이 진행되는 동안 복원 속도를 높이기 위해 변경할 수있는 MySQL 변수가 있습니까?


테이블 유형을 수정하도록 편집 됨
Dave Forgac

답변:


26

프로세스 속도를 늦출 수있는 한 가지는 인덱스 블록에 사용되는 버퍼 크기 인 key_buffer_size 입니다. 이것을 RAM의 30 % 이상으로 조정하십시오. 그렇지 않으면 재 인덱싱 프로세스가 너무 느릴 것입니다.

참고로 InnoDB 및 외래 키를 사용하는 경우 외래 키 검사를 비활성화하고 마지막에 ( SET FOREIGN_KEY_CHECKS=0및을 사용 하여 SET FOREIGN_KEY_CHECKS=1) 외래 키 검사를 다시 활성화 할 수도 있습니다 .


1
두 가지를 발견했습니다. key_buffer_size는 8MB로 설정되었고 외래 키와 혼합 된 InnoDB 테이블이 하나 있습니다. key_buffer_size를 1GB로 늘리고 외래 키 검사를 일시적으로 해제했습니다. 복원은 5 분 후에 완료되었습니다. 감사!
Dave Forgac

와우! 도움이 된 것을 기쁘게 생각합니다 :)
Marco Ramos

2
방금 '5 분'을 입력 한 것을 알았습니다. 나는 그것이 50 분 이상이지만 여전히 더 합리적이라고 확신합니다 ;-)
Dave Forgac

5
key_buffer_size는 MYISAM 용입니다.
Fernando Fabreti

@ 페르난도 파브 레티 (FernandoFabreti) – 그것은 많은 독자들에게 중요한 포인트이지만, OP는 대부분 MyISAM을 가지고 있다고 명시했습니다
mc0e

22

이 링크는 복원 프로세스 속도를 높이기 위해 수행 할 수있는 작업을 보여줍니다.

http://dev.mysql.com/doc/refman/5.5/en/optimizing-innodb-bulk-data-loading.html

덤프 파일의 맨 위에 명령을 넣을 수 있습니다

SET @OLD_AUTOCOMMIT=@@AUTOCOMMIT, AUTOCOMMIT = 0;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS = 0;

그리고이 문장들을 덤프 파일의 끝에 넣으십시오

SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET AUTOCOMMIT = @OLD_AUTOCOMMIT;
COMMIT;

이것은 나를 위해 일했습니다. 행복한 복원 :-)


8
이것은 꽤 도움이되었습니다. 파일을 편집하는 대신 위의 스 니펫에서 pre.sql 및 post.sql을 작성하여 db를 복원하는 데 사용했습니다.cat pre.sql dump.sql post.sql | mysql ...
Jason R. Coombs

1

복원이 점차 느려지는 이유를 이미지화 할 수있는 유일한 이유는 인덱싱뿐입니다. 끝날 때까지 인덱싱을 끄고 전체 로트를 한 번에 수행하도록하십시오.


1

덤프 파일 (DB 디렉토리)의 실제 사본이있는 경우 새 서버의 MySQL 버전이 동일하고 제대로 작동하면 새 서버로 복사 할 수 있습니다. 이것은 MyISAM에서 잘 작동하며 논리 SQL 덤프 파일을 기반으로 데이터를 복원하는 것보다 낫다고 생각합니다.


0

여러 테이블 기회가있는 경우 mk-parallel-restore의 이점이 있습니다 .


이 기능은 더 이상 사용되지 않으며 실제 백업을 복원하기위한 것이 아니라 테스트 데이터를 복원하는 데만 사용해야합니다.
svandragt

0

이것은 할 것이다 :

mysql --init-command = "SET SESSION FOREIGN_KEY_CHECKS = 0; SET UNIQUE_CHECKS = 0;" -u root -p <Backup_Database.mysql


-1

나는 당신에게 제안했다.

  1. 테이블 확인 : 트리거가 있습니까? 모든 트리거 지우기
  2. SET : AUTOCOMMIT=0, UNIQUE_CHECKS=0, FOREIGN_KEY_CHECKS=0( AND TO ROLLBACK 본의 변경을 잊지 마십시오 )
  3. 명령 줄처럼 사용 mysql -u root -pPasss requests < mydb.sql
  4. 데이터베이스 파일 크기 확인

행운을 빕니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.