먼저 mysqldump의 내보내기 속도는 느리지 않습니다. 테스트 결과 50M/s의 속도에 도달할 수 있습니다. 10G 데이터는 3분 정도 소요됩니다. 병목 현상이 네트워크와 디스크 IO에 있음을 알 수 있습니다. 내보내기 도구가 아무리 많아도 이보다 더 빠를 수는 없지만 가져오는 데 60분이 걸렸고 디스크와 네트워크가 20% 정도만 사용되었습니다. 병목 현상은 대상 라이브러리의 쓰기 속도였습니다(일반 순차 쓰기). IOPS 제한에 도달할 수 없음) 따라서 myloader의 가져오기 속도와 mysqldump 내보내기 유연성을 고려하여 mypumpkin이 탄생했습니다.
파이썬을 사용하여 큐를 구성하고 내보내야 하는 모든 테이블을 한 번에 큐에 넣은 다음 N개의 파이썬 스레드를 시작합니다. 동시에 이 큐에서 테이블 이름이 검색되고 하위 프로세스는 운영 체제의 mysqldump 명령을 호출하여 데이터를 dbname.tablename.sql이라는 파일로 내보냅니다. 로드 인은 지정된 라이브러리 이름이나 테이블 이름에 따라 모든 sql 파일을 dump_dir 디렉터리에서 찾아 대기열로 푸시합니다. N 스레드는 동시에 새로운 명령을 구성하고 < 작업.
매개변수 구문 분석은 원래 자체 구문 분석에서 argparse 모듈을 사용하는 방식으로 거의 리팩터링되었습니다.
--tables가 지정되지 않은 경우 프로그램은 모든 테이블 이름에 대해 라이브러리를 적극적으로 쿼리한 다음 이를 대기열로 필터링합니다.
대상 라이브러리에 로드합니다. 옵션은 덤프 아웃만큼 풍부하며, 어떤 DB를 가져올지, 어떤 테이블을 가져올지, 어떤 테이블을 무시할지 지정할 수 있습니다.
핵심은 테이블 관련 옵션(-B, -A, --tables, --ignore=)을 분석하고 새로운 실행으로 결합해야 하기 때문에 원본 mysqldump와 호환된다는 것입니다. 명령에는 고려해야 할 많은 예외가 있습니다.
제한 사항
중요: 내보낸 데이터는 라이브러리 수준 일관성을 보장하지 않습니다.
이전 불변 테이블에는 영향을 주지 않습니다.
한 가지에만 해당됩니다. 테이블의 크기는 mysqldump 자체에서 사용하는 옵션에 따라 결정됩니다.
다양한 테이블 내보내기 작업은 다양한 mysqldump 명령에서 수행되며 트랜잭션이 보장되지 않습니다. 내 경우에는 개발 동급생이 binlog 구문 분석 프로그램을 사용하여 지원하고 완료 후 모든 변경 사항을 재생하여 최종 일관성을 보장했습니다.
또한 데이터를 가져올 때 완전하거나 일관된 데이터가 필요하지 않은 경우가 많습니다. 오프라인 분석이나 임시 내보내기에만 데이터를 빠르게 개발하는 데 중점을 둡니다.
특이한 옵션 식별 프로그램은 mysqldump 명령과 호환되도록 최선을 다했습니다. mypumpkin.py를 추가하고 dump-dir을 지정하면 동시성 마법이 완료되는 경우도 있습니다. 구문 분석이 불편하고 아직 지원되지 않습니다. 형식:
db1 table1 table2 db2 db3
즉, 위의 내용은 db1 및 table1이 명령줄의 라이브러리 이름인지 표면인지 확인할 수 없습니다. -A|-B], [--tables], [--ignore-table]" 세 그룹 중 하나가 나타나야 함: db1 table1 table2는 db1 --tables table1 table2로 변경되고 db2는 -B로 변경됨 DB2 DB3.
비밀번호는 당분간 명시적으로만 입력할 수 있습니다
4. 사용설명
설치는 Python 2.7을 기반으로 개발되었으며, 다른 버전은 테스트되지 않았습니다. MySQLdb 라이브러리가 필요합니다.
4.1 도움말
./mypumpkin.py --help Only mysqldump or mysql allowed after mypumpkin.py usage: mypumpkin.py {mysqldump|mysqls} [--help] This's a program that wrap mysqldump/mysql to make them dump-out/load-in concurrently. Attention: it can not keep consistent for whole database(s). optional arguments: --help show this help message and exit -B db1 [db1 ...], --databases db1 [db1 ...] Dump one or more databases -A, --all-databases Dump all databases --tables t1 [t1 ...] Specifiy tables to dump. Override --databases (-B) --ignore-table db1.table1 [db1.table1 ...] Do not dump the specified table. (format like --ignore-table=dbname.tablename). Use the directive multiple times for more than one table to ignore. --threads =N Threads to dump out [2], or load in [CPUs*2]. --dump-dir DUMP_DIR Required. Directory to dump out (create if not exist), Or Where to load in sqlfile At least one of these 3 group options given: [-A,-B] [--tables] [--ignore-table]
--dump-dir, 필수, 원래 쉘 표준 입력 및 출력 >은 사용할 수 없습니다. 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