mysql 덤프 가져 오기가 개발자의 컴퓨터에서 엄청나게 느립니다.


22

SQL 덤프가 있는데 꽤 큰 (411MB) 서버 A에서 가져 오는 데 10 분이 걸렸으며 워크 스테이션 B의 동일한 가져 오기에서 가져 오는 데 8 시간의 예상 (파이프 뷰어)이 있습니다 (40 분 안에 31MB를 가져 왔습니다) ) 따라서 이것은 요소 53이 느립니다.

사양 :

Server A:
   MySQL Version: 5.5.30-1.1 (Debian)
   2 GB RAM
   1 core QEMU Virtual CPU version 1.0 - cpu MHz: 3400.020

Workstation B: 
   MySQL Version: 5.5.41-MariaDB-1ubuntu0.14.04.1
   14 GB RAM
   4 cores Intel(R) Core(TM) i5-2400 CPU @ 3.10GHz - cpu MHz: 1600.000

mysql / maria 설정은 stock 설정입니다.

어제 워크 스테이션에서 MariaDB로 전환했지만 MariaDB 이전에는 통계가 더 나빴습니다.

워크 스테이션에서 모든 데이터베이스를 이미 제거했지만 차이는 없습니다.

가장 큰 문제는 성능이 어떻게 53 배 느려질 수 있는가입니다. 나는 이렇게 할 수 없다 :-(

내 가져 오기 명령 :

pv sql/master.sql | mysql -h'localhost' -u'root' -p'root' 'master'

iostat -xm 5

서버 A :

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
      17,43    0,00   30,28   51,85    0,00    0,44

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00   254,03    0,00 1305,45     0,00     6,09     9,56     0,78    0,60    0,00    0,60   0,57  74,25

워크 스테이션 B :

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
       7,32    0,00    3,22    5,03    0,00   84,42

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0,00     1,40    0,80  172,40     0,00     0,56     6,72     1,17    6,75   12,00    6,72   5,40  93,52

dd if=/dev/zero of=tempfile bs=1M count=1024 conv=fdatasync,notrunc

서버 A :

1073741824 bytes (1,1 GB) copied, 18,6947 s, 57,4 MB/s

워크 스테이션 B :

1073741824 bytes (1,1 GB) copied, 8,95646 s, 120 MB/s

데이터베이스를 가져 오는 방법을 설명해 주시겠습니까? (구체적인 mysql 문장은 무엇입니까?) "show processlist;" 말하다? strace를 사용하여 프로세스가 구체적으로 수행하는 작업을 보셨습니까? 기계가 교체되고 있는지 살펴볼 수 있습니까?

내 질문을 편집했습니다.
Alex

InnoDB? innodb_buffer_pool_size각 기계 의 가치는 무엇입니까 ?
Rick James

답변:


47

이 답변은 모든 것을 가속화했습니다.

/programming//a/2167641/292408

나는 단순히

SET autocommit=0;
SET unique_checks=0;
SET foreign_key_checks=0;

처음에는

COMMIT;
SET unique_checks=1;
SET foreign_key_checks=1;

끝에.

이제 3 분이 걸렸습니다.

(트위터를 통한 @andreasemer 제공)


멋진 트릭. 내가 알아야 할 것이 있는데, 이렇게하면 부작용이 있습니까?
Dharma Saputra

1
데이터가 손상된 경우 가져 오기 후 외래 키 제약 조건이 충족되지 않을 수 있습니다.
Alex

대단한 일. 당신은 말 그대로 시간을 절약했습니다.
Jafo

나를 위해 성능을 높이 지 않았습니다. 이것이 없으면 23 분이었고 23 분 후에 (3GB .sql 파일).
Joshua Pinter

5

위에서 본 내용을 보완하는 중 ... 덤프 파일이 이미 다음과 같은 것으로 자동 생성되었습니다.

mysqldump my_db > db-dump-file.sql

나는라고 내 컴퓨터에 두 개의 파일을 만들 수 있도록이 가져 오기를 자동화 할 default-start-import.sqldefault-end-import.sql와 그 내용은 기본적으로 시작 import.sql :

SET autocommit=0;

default-end-import.sql :

COMMIT;
SET autocommit=1;

내가 실행하는 스크립트는 다음과 같습니다.

cat default-start-import.sql db-dump-file.sql default-end-import.sql | mysql my_other_db

같은 명령이지만 읽기 쉽습니다.

cat default-start-import.sql \
    db-dump-file.sql \
    default-end-import.sql \
| mysql my_other_db

이 경우 cat파일을 파이프로 보내기 전에 해당 파일을 연결하는 데 사용됩니다. cat명령이 파일 사이에 줄을 병합하지 않도록 모든 파일이 줄 바꿈 문자 (텍스트 편집기에서 볼 경우 파일 끝에 빈 줄)로 끝나는 것이 중요하다고 생각 합니다.

가져 오기가 제대로 작동하지만 활성화 및 비활성화 자동 커밋 기능이 향상되어 실제로 더 빠른지 테스트하지는 않았지만 더 빨라지면이 추가 단계로 인해 작업이 더 쉬워집니다.


1

나는 --compress뿐만 아니라 노력했지만 SET autocommit=0;그들은 소량을 도왔습니다 ...

여러 INSERT INTO ...문장을 하나의 큰 문장으로 변환하면 VALUES(...), (...)속도가 크게 향상되었습니다.

mysqlWAN 을 통한 SSL을 사용 하고 있습니다. 원격 MySQL 데이터베이스는 Amazon에서 호스팅됩니다.

9 열과 2,100 행 :

  • 2,100 개의 별도 INSERT진술 : 82
  • 2 개의 통합 INSERT진술 : <1s

7 열 42,000 행 :

  • 42,000 개의 별도 INSERT진술 : 1,740
  • 42 개의 통합 INSERT선언문 : 105s

따라서 데이터베이스 덤프를 생성하는 도구 (또는 INSERT명령문 의 형식 )에 따라 속도에 영향을 줄 수 있습니다.

참고 :.sql 테스트에서 덤프 파일 도 60 % 이상 감소 하므로 I / O도 절약됩니다.

경고 : 이되는 물리적 한계를이 기술로mysql 휴대 성을 필요로하는 사람들을 위해 ... SQL 서버 만 1,000 행으로 제한 될 것으로 보인다 번에.

여전히 42,000 행에 대해 한 번에 1,000 행을 수행하면 여전히 1,657 % 향상됩니다!

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