2008-09-17 8 views
3

RHEL 5 시스템에 MySQL 서버 전용으로 새롭게 추가 된 새로운 하드 드라이브가 있습니다. 일을 시작하기 위해서, 나는 "mysqldump --host otherhost -A | mysql"을 사용했는데, 분명히 이것을 시도하는 맨페 (manqage)는 절대 권장하지 않는다. (mysqldump는 파일에 들어 가지 않고, 우리는 500G의 데이터베이스를 사용한다.)mysqldump | mysql이 '너무 많은 열린 파일'오류를 생성합니다. 왜?

이 프로세스는 너무 많은 파일이 열려 있다는 (어떤 시점에서 mysqld가 관련 신호를 받고 죽고 다시 포진하는지) 불평하는 임의의 간격으로 실패합니다.

나는 그것을 sysctl과 ulimit에서 올리려고했지만 문제는 지속된다. 그것에 대해 무엇을해야합니까?

답변

6

기본적으로 mysqldump는 관련된 모든 테이블에 대해 테이블 ​​당 잠금을 수행합니다. mysql 서버 프로세스의 파일 디스크립터 수를 초과 할 수있는 테이블이 많은 경우. --skip-lock-tables를 시도하거나 잠금이 필수 인 경우 --lock-all-tables.
http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html

--lock-all-tables, -x

Lock all tables across all databases. This is achieved by acquiring a global read lock for the duration of the whole dump. This option automatically turns off --single-transaction and --lock-tables.

3

mysqldump를가 큰 데이터베이스 (1, 2, 3)에 해당 오류 yeld에보고되었다. MySQL Bugs에서 설명 및 해결 방법 :이 정말 버그가 아닙니다 [2007년 2월 3일 22시] 세르게이 Golubchik

.

기본적으로 mysqldump에는 --lock-tables가 활성화되어 있습니다. 즉, 덤프를 시작하기 전에 에있는 모든 테이블을 잠그려고합니다. 그리고 LOCK TABLES t1, t2, ...를 실제로 수행하면 LOCK은 모든 테이블을 열어야하므로 테이블 수는 필연적으로 사용 가능한 모든 파일 설명자를 소모합니다.

해결 방법 : --skip-lock-tables는 이러한 잠금을 완전히 비활성화합니다. 또는 --lock-all-tables는 mysqldump가 모든 데이터베이스의 모든 테이블을 열지 않고 FLOCKH TABLES WITH READ LOCK을 사용하도록 만듭니다. 이 경우, mysqldump는 자동적으로 --lock-tables를 disable 할 것이고, 이는 --lock-all-tables가 사용될 때 의미가 없기 때문이다.

편집 : 아래 코멘트에 InnoDB의 데이브의 해결 방법을 확인하시기 바랍니다.

+0

또는 innodb 테이블을 사용하는 경우 파일 핸들 실행 문제를 피하고 모든 테이블을 잠그는 try -single-transaction을 사용하십시오 –

0

데이터베이스가 크다면 몇 가지 문제가 있습니다.

  1. 데이터를 덤프하려면 테이블을 잠 가야합니다.

  2. mysqldump는 매우 오랜 시간이 걸리며이 시간 동안 테이블을 잠 가야합니다.

  3. 또한 새 서버에서 데이터를 가져 오는 데 오랜 시간이 걸립니다.

데이터베이스가 실제로 데이터베이스를 중지하고 다른 서버로 파일을 복사 할 rsync를 사용하는 것이 좋습니다 것입니다 일어나고 기본적으로 사용할 수 없게 동안 # 1과 # 2가 될 것입니다 때문에. mysqldump를 사용하는 것보다 빠르며, 인덱스 생성에 IO와 CPU가 추가되지 않아 가져 오기보다 훨씬 빠릅니다.

Linux의 프로덕션 환경에서 많은 사람들이 Mysql 데이터를 LVM 파티션에 저장합니다. 그런 다음 데이터베이스를 중지하고 LVM 스냅 샷을 작성한 다음 데이터베이스를 시작하고 중지 된 데이터베이스의 상태를 여유롭게 복사합니다.