>  기사  >  데이터 베이스  >  mysqldump를 동시 내보내기 및 가져오기의 마법으로 만들어 보세요.

mysqldump를 동시 내보내기 및 가져오기의 마법으로 만들어 보세요.

高洛峰
高洛峰원래의
2016-11-21 15:18:581541검색

먼저 mysqldump의 내보내기 속도는 느리지 않습니다. 테스트 결과 50M/s의 속도에 도달할 수 있습니다. 10G 데이터는 3분 정도 소요됩니다. 병목 현상이 네트워크와 디스크 IO에 있음을 알 수 있습니다. 내보내기 도구가 아무리 많아도 이보다 더 빠를 수는 없지만 가져오는 데 60분이 걸렸고 디스크와 네트워크가 20% 정도만 사용되었습니다. 병목 현상은 대상 라이브러리의 쓰기 속도였습니다(일반 순차 쓰기). IOPS 제한에 도달할 수 없음) 따라서 myloader의 가져오기 속도와 mysqldump 내보내기 유연성을 고려하여 mypumpkin이 탄생했습니다.

95712e0b0bc62c64b1fddfac486f9cb8

파이썬을 사용하여 큐를 구성하고 내보내야 하는 모든 테이블을 한 번에 큐에 넣은 다음 N개의 파이썬 스레드를 시작합니다. 동시에 이 큐에서 테이블 이름이 검색되고 하위 프로세스는 운영 체제의 mysqldump 명령을 호출하여 데이터를 dbname.tablename.sql이라는 파일로 내보냅니다. 로드 인은 지정된 라이브러리 이름이나 테이블 이름에 따라 모든 sql 파일을 dump_dir 디렉터리에서 찾아 대기열로 푸시합니다. N 스레드는 동시에 새로운 명령을 구성하고 017c379dd2f3a40431495498c2056437은 사용할 수 없습니다. dump-dir에 지정된 디렉토리가 존재하지 않으면 자동으로 생성을 시도합니다.

--threads=N, N은 동시 내보내기 또는 가져오기 스레드 수를 지정합니다. 덤프 아웃을 위한 기본 스레드 수는 2이고, mypumpkin 로드 인을 위한 기본 스레드 수는 CPU 수 * 2입니다.
참고: 스레드 수가 많을수록 좋습니다. 여기서 주요 측정 지표는 네트워크 대역폭, 디스크 IO 및 대상 라이브러리 IOPS를 사용하여 관찰하는 것이 가장 좋습니다.

-B, --tables, --ignore-table은 다음과 같이 mysqldump와 동일하게 사용합니다.

mysqldump에서 --tables는 --databases/-B 옵션을 재정의합니다.

mysqldump에서 --tables와 --ignore-table은 동시에 나타날 수 없습니다.

mysqldump에서 -B가 지정되지 않은 경우 --tables 또는 --ignore-table은 반드시 나타나야 합니다. db를 따라가세요

다른 옵션 이름 뒤에 mypumpkin은 해당 옵션을 그대로 유지하고 실행을 위해 셸에 넣습니다. 따라서 다른 옵션에 오류가 있으면 기본 mysqldump에 검사가 맡겨집니다. 실행 중에 오류가 발생하면 스레드가 종료됩니다.

4.2 예

내보내기:

## 导出源库所有db到visit_dumpdir2目录 (不包括information_schema和performance_schema)
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \
 --single-transaction --opt -A --dump-dir visit_dumpdir2

## 导出源库db1,db2,会从原库查询所有表名来过滤
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \
 --single-transaction --opt -B db1 db2 --dump-dir visit_dumpdir2

## 只导出db1库的t1,t2表,如果指定表不存在则有提示
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \
 --single-transaction --opt -B db1 --tables t1 t2 --dump-dir visit_dumpdir2

## 导出db1,db2库,但忽略 db1.t1, db2.t2, db2.t3表
## mysqldump只支持--ignore-table=db1.t1这种,使用多个重复指令来指定多表。这里做了兼容扩展
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword --single-transaction \
 --opt -B db1 db2 --ignore-table=db1.t1 --ignore-table db2.t2 db2.t3 --dump-dir visit_dumpdir2 (如果-A表示全部db)

## 不带 -A/-B
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \
 --single-transaction --opt db1 --ignore-table=db1.t1 --dump-dir=visit_dumpdir2

## 其它选项不做处理
$ ./mypumpkin.py mysqldump -h dbhost_name -utest_user -pyourpassword -P3306 \
 --single-transaction --set-gtid-purged=OFF --no-set-names --skip-add-locks -e -q -t -n --skip-triggers \
 --max-allowed-packet=134217728 --net-buffer-length=1638400 --default-character-set=latin1 \
 --insert-ignore --hex-blob --no-autocommit \
 db1 --tables t1 --dump-dir visit_dumpdir2

가져오기:
-A, -B, --tables, --ignore-table, --threads, --dump-dir의 사용법과 기능은 위와 동일합니다. 다음은 몇 가지 예입니다.

## 导入dump-dir目录下所有表
$ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 -A \
 --dump-dir=visit_dumpdir2

## 导入db1库(所有表)
$ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 -B db1 \
 --dump-dir=visit_dumpdir2

## 只导入db.t1表
$ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 \
 --default-character-set=utf8mb4 --max-allowed-packet=134217728 --net-buffer-length=1638400 \
 -B db1 --tables t1 --dump-dir=visit_dumpdir2

## 导入db1,db2库,但忽略db1.t1表(会到dump-dir目录检查db1,db2有无对应的表存在,不在目标库检查)
$ ./mypumpkin.py mysql -h dbhost_name -utest_user -pyourpassword --port 3307 \
 -B db1 db2 --ignore-table=db1.t1 --dump-dir=visit_dumpdir2


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.