mysqldump를 사용하여 mysql innodb 데이터베이스를 덤프하고로드하는 가장 빠른 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/131085

  •  02-07-2019
  •  | 
  •  

문제

MySQLDUMP 및 MYSQL 5.1을 사용하여 약 40 개의 InnoDB 테이블과 약 1.5GB의 데이터가있는 데이터베이스 사본을 만들고 싶습니다.

데이터의 가장 빠른 덤프와로드를 초래하는 가장 좋은 매개 변수 (예 : -Single-Transaction)는 무엇입니까?

또한 데이터를 두 번째 DB에로드 할 때 더 빠릅니다.

1) 결과를 두 번째 MySQL 서버 인스턴스로 직접 파이프하고 -코프 프레스 옵션을 사용하십시오.

또는

2) 텍스트 파일에서로드 (예 : mysql <my_sql_dump.sql)

도움이 되었습니까?

해결책

디스크 오버 헤드를 피하려면 다른 인스턴스로 직접 파이프하십시오. 귀찮게하지 마십시오 --compress 빠른 LAN 또는 루프백에서는 네트워크 오버 헤드가 중요하지 않기 때문에 느린 네트워크를 통해 실행되지 않는 한.

다른 팁

Quiesced 데이터베이스를 신속하게 덤핑 :

mysqldump와 함께 "-t"옵션을 사용하면 지정된 디렉토리에 많은 .sql 및 .txt 파일이 생성됩니다. 삽입 문이있는 단일 .SQL 파일보다 큰 테이블을 덤프하는 데 ~ 50% 더 빠릅니다 (월 클록 시간이 1/3 적은 시간이 걸립니다).

또한 여러 테이블을 병렬로로드하고 여러 코어를 포화시킬 수있는 경우 복원 할 때 큰 이점이 있습니다. 8 코어 박스에서 이것은 "-t"가 제공 한 효율 개선 위에 덤프를 복원하기위한 벽 클록 시간의 8 배 차이 일 수 있습니다. "-t"는 각 테이블이 별도의 파일에 저장되기 때문에 대규모 .SQL 파일을 분리하는 것보다 병렬로로드하는 것이 더 쉽습니다.

위의 전략을 논리적으로 극단으로 가져 가면 데이터베이스를 널리 병렬로 덤프하는 스크립트를 만들 수 있습니다. 글쎄, 그것이 바로 Maakit MK-Parallel-Dump입니다 (참조 http://www.maatkit.org/doc/mk-parallel-dump.html) 및 MK-Parallel-Restore 도구는 다음과 같습니다. 기본 mysqldump 프로그램에 여러 번 호출하는 Perl 스크립트. 그러나 이것을 사용하려고 할 때 바닐라 덤프로 발생하지 않은 중복 키 오류없이 복원을 완료하는 데 어려움이 있었으므로 마일리지가 다를 수 있습니다.

라이브 데이터베이스에서 데이터 덤프 (서비스 중단 w/o 서비스 중단) :

-Single-Transaction Switch는 실시간 데이터베이스를 덤프하지 않고 노예를 중지하지 않고 슬레이브 데이터베이스를 덤프하지 않고도 라이브 데이터베이스를 덤프하는 데 매우 유용합니다.

안타깝게도 -t는 -single transaction과 호환되지 않으므로 하나만 얻습니다.

일반적으로 덤프를 복원하는 것이 복원하는 것보다 훨씬 빠릅니다. 들어오는 모 놀리 식 덤프 파일을 가져 와서 여러 조각으로 나누어 병렬로로드하는 도구를위한 공간이 여전히 있습니다. 내 아는 한, 그러한 도구는 아직 존재하지 않습니다.


네트워크를 통해 덤프를 전송하는 것은 일반적으로 승리입니다.

하나의 호스트 실행에서 들어오는 덤프를 들으려면 :

nc -l 7878 > mysql-dump.sql

그런 다음 DB 호스트에서 실행하십시오

mysqldump $OPTS | nc myhost.mydomain.com 7878

이것은 마스터의 디스크 스핀들에 대한 경합이 덤프에 덤프에 디스크를 작성하는 것에서 덤프를 약간 속도를 높이는 것에서 덤프 속도를 약간 빠르게 감소시킵니다 (네트워크가 유지하기에 충분히 빠르다고 가정합니다. 동일한 데이터 센터의 두 호스트에 대한 상당히 안전한 가정). 또한 새 슬레이브를 구축하는 경우 덤프 파일이 완료된 후 덤프 파일을 전송 해야하는 단계가 저장됩니다.

경고 - 분명히, 당신은 견딜 수 없을 정도로 속도를 늦추지 않기 위해 충분한 네트워크 대역폭이 있어야하며, TCP 세션이 시작되면 모든 것을 시작해야하지만 대부분의 덤프의 경우 큰 관심사는 아닙니다.


마지막으로, 나는 일반적인 혼란의 한 지점을 정리하고 싶습니다.

MySQLdump 예제 및 튜토리얼에서 이러한 깃발을 얼마나 자주 볼 수 있는지에도 불구하고, 기본적으로 켜져 있기 때문에 불필요합니다.

  • --opt
  • --add-drop-table
  • --add-locks
  • --create-options
  • --disable-keys
  • --extended-insert
  • --lock-tables
  • --quick
  • --set-charset.

에서 http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html:

-opt 사용은 -add-drop-table, -add-locks, --create-options,-disable-keys, extended-insert,-lock-tables,-를 지정하는 것과 동일합니다. 빠르고 -set-charset. -opt가 기본적으로 켜져 있기 때문에 -opt가 나타내는 모든 옵션도 기본적으로 켜져 있습니다.

이러한 동작 중 "-Quick"은 가장 중요한 것 중 하나입니다 (첫 번째 행을 전송하기 전에 MySQLD에서 전체 결과 세트를 캐시하는 스크리핑). 큰 결과 세트를 반환하는 쿼리 속도를 크게 높이려면 (예 : 큰 테이블의 모든 행을 버리는).

시도하면 훨씬 빠르고 디스크 공간을 절약 할 수 있다고 생각합니다. 데이터베이스 복제 mysqldump를 사용하는 것과 반대로. 개인적으로 나는 사용합니다 Sqlyog Enterprise 정말 무거운 리프팅을 위해 다른 도구 동일한 서비스를 제공 할 수 있습니다. 물론 mysqldump 만 사용하고 싶지 않다면.

innodb의 경우-ordorder-by-primary-extrended-insert는 일반적으로 최고의 콤보입니다. 마지막 성능과 대상 상자에 많은 CPU 코어가있는 경우 결과적인 덤프 파일을 분할하고 많은 스레드에서 병렬 인서트 (innodb_thread_concurrency/2까지 병렬 인서트를 수행 할 수 있습니다.

또한, 대상의 innodb_buffer_pool_size를 최대에 감당할 수있는 최대로 조정하고, innodb_log_file_size를 128 또는 256MB로 늘리십시오 (이에주의하십시오. 그렇지 않으면 mySQL 데몬을 다시 시작하기 전에 이전 로그 파일을 제거해야합니다. 그렇지 않으면 다시 시작하지 않음).

Maatkit의 MK-Parallel-Dump 도구를 사용하십시오.

적어도 그것은 아마도 더 빠를 것입니다. 나는 mysqldump를 더 믿을 것입니다.

얼마나 자주이 일을하고 있습니까? 실제로 응용 프로그램 성능 문제입니까? 아마도 전체 데이터를 덤프 할 필요가없는이 작업을 수행해야 할 수도 있습니다 (복제?).

반면에 1.5G는 꽤 작은 데이터베이스이므로 문제가 많지 않을 것입니다.

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