MySQL의 백만단계 데이터 마이그레이션 과정을 기록하는 데 집중하세요!

藏色散人
풀어 주다: 2021-12-20 14:44:15
앞으로
2121명이 탐색했습니다.

그런 시나리오가 있다고 가정하면, 소규모 프로그램이 개발되고, 더블 일레븐 이벤트의 인기를 살려 한 달 만에 100만 명 이상의 사용자를 빠르게 모으는 소규모 프로그램에 폼미드 수집 매장을 추가합니다. WeChat 사용자에게 템플릿 메시지 알림 보내기에 대한 프로그램 페이지입니다.

데이터 양이 늘어나면서 이전에 사용하던 서버 공간이 조금 부족해지기 시작했습니다. 최근에는 소규모 프로그램의 백엔드 개발을 위해 특별히 새로운 프레임워크를 작성해서 원본 데이터를 의 데이터베이스로 마이그레이션하려고 합니다. 새로운 시스템. 4코어 8G 머신을 구입하고 데이터 마이그레이션을 시작했습니다. 마이그레이션 프로세스를 간단하게 기록해 보겠습니다.

MySQL의 백만단계 데이터 마이그레이션 과정을 기록하는 데 집중하세요!

계획 선택

mysqldump migration

일반적인 개발에서 우리가 자주 사용하는 데이터 백업 및 마이그레이션 방법은 mysqldump 도구를 사용하여 sql 파일을 내보낸 다음 sql을 새 데이터베이스로 가져오는 것입니다. 데이터 마이그레이션을 완료합니다. [추천: mysql 동영상 튜토리얼]

실험 결과 mysqldump를 통해 백만 레벨 데이터베이스를 sql 파일로 내보내는 데 몇 분 정도 걸리는 것으로 나타났습니다. 내보낸 sql 파일의 크기는 약 1G이고 그 다음에는 1G sql입니다. scp 명령을 사용하여 파일을 다른 서버에 복사하는 데 몇 분 정도 걸릴 수 있습니다. source 명령을 사용하여 새 서버의 데이터베이스에 있는 데이터를 가져왔습니다. 밤새도록 실행했는데 CPU가 가득 찼습니다.

스크립트 마이그레이션

명령줄을 통해 데이터베이스를 직접 조작하여 데이터를 내보내고 가져오는 것이 더 편리한 방법이지만, 데이터 양이 많을 경우 시간이 더 많이 걸리고 더 높은 서버 성능이 필요한 경우가 많습니다. . 데이터 마이그레이션에 필요한 시간이 그리 길지 않은 경우 데이터 마이그레이션을 위한 스크립트를 작성할 수 있습니다. 실제로 시도하지는 않았지만 아마도 두 가지 스크립팅 솔루션이 있을 것이라고 생각합니다.

첫 번째 방법은 마이그레이션 대상 서버에서 마이그레이션 스크립트를 실행하고, 원본 데이터 서버의 데이터베이스에 원격으로 접속한 후, 쿼리 조건을 설정하여 원본 데이터를 청크 단위로 읽고, 읽은 후 대상 데이터베이스에 쓰는 방법이다. 이 마이그레이션 방법은 상대적으로 비효율적일 수 있습니다. 데이터 내보내기 및 가져오기는 동기식 프로세스와 동일하며 쓰기 전에 읽기가 완료될 때까지 기다려야 합니다. 쿼리 조건이 합리적으로 설계된 경우 다중 스레드 방식으로 여러 마이그레이션 스크립트를 시작하여 병렬 마이그레이션 효과를 얻을 수도 있습니다.

두 번째 방법은 redis와 결합하여 "생산 + 소비" 마이그레이션 솔루션을 구축할 수 있습니다. 소스 데이터 서버는 소스 데이터 서버에서 다중 스레드 스크립트를 실행하고 데이터베이스의 데이터를 병렬로 읽고 데이터를 Redis 대기열에 쓰는 데이터 생산자 역할을 할 수 있습니다. 소비자로서 대상 서버는 대상 서버에서 다중 스레드 스크립트를 실행하고, 원격으로 Redis에 연결하고, Redis 대기열의 데이터를 병렬로 읽고, 읽은 데이터를 대상 데이터베이스에 씁니다. 첫 번째 방법에 비해 이 방법은 데이터 가져오기와 데이터 내보내기를 동시에 수행할 수 있으며 데이터 전송 스테이션으로 Redis를 사용하면 효율성이 크게 향상됩니다.

여기서 Go 언어를 사용하여 마이그레이션 스크립트를 작성할 수도 있습니다. 기본 동시성 기능을 사용하면 데이터를 병렬로 마이그레이션하고 마이그레이션 효율성을 향상시킬 수 있습니다.

파일 마이그레이션

첫 번째 마이그레이션 솔루션은 너무 비효율적이고, 두 번째 마이그레이션 솔루션은 코딩 비용이 더 많이 들기 때문에 온라인에서 찾은 정보를 비교 분석한 결과 마침내 mysql을 사용하기로 결정했습니다.

select data into outfile file.txt、load data infile file.txt into table
로그인 후 복사

의 명령은 가져오기 및 내보내기 파일 형식으로 수백만 개의 데이터 마이그레이션을 완료합니다.

마이그레이션 프로세스

소스 데이터베이스에서 데이터 파일 내보내기

select * from dc_mp_fans into outfile '/data/fans.txt';
로그인 후 복사

데이터 파일을 대상 서버로 복사

zip fans.zip /data/fans.txtscp fans.zip root@ip:/data/
로그인 후 복사

대상 데이터베이스에서 파일 가져오기

unzip /data/fans.zipload data infile '/data/fans.txt' into table wxa_fans(id,appid,openid,unionid,@dummy,created_at,@dummy,nickname,gender,avatar_url,@dummy,@dummy,@dummy,@dummy,language,country,province,city,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy,@dummy);
로그인 후 복사

다음 몇 단계에 따라 100가지 작업을 완료하세요. 10,000개 수준의 데이터 테이블을 서버 간 마이그레이션하는 데 몇 분 걸립니다.

Notes

  • mysql 보안 항목 설정

mysql에서 데이터 infile 및 outfile 로드 명령을 실행하려면 mysql에서 secure_file_priv 옵션을 켜야 하며, 이는 '%'와 같은 전역 변수 표시를 통해 볼 수 있습니다. secure%'; mysql에서 이 옵션을 활성화했는지 여부에 관계없이 기본값 Null은 가져오기 및 내보내기 명령 실행이 허용되지 않음을 나타냅니다.

vim /etc/my.cnf를 통해 mysql 구성 항목을 수정하고 secure_file_priv 값을 빈 값으로 설정하세요.

[mysqld]  secure_file_priv=''
로그인 후 복사

그런 다음 명령을 통해 데이터 파일을 가져오고 내보낼 수 있습니다.

  • 가져온 데이터 테이블 필드와 내보낸 데이터 테이블 필드가 일치하지 않습니다.

위 예에서 데이터는 소스 데이터베이스의 dc_mp_fans 테이블에서 대상 데이터베이스의 wxa_fans 테이블로 마이그레이션됩니다. 두 데이터 테이블의 필드는 dc_mp_fans입니다.

MySQL의 백만단계 데이터 마이그레이션 과정을 기록하는 데 집중하세요!

wxa_fans

MySQL의 백만단계 데이터 마이그레이션 과정을 기록하는 데 집중하세요!

데이터를 가져올 때 대상 필드의 데이터와 일치하도록 필드 이름을 설정할 수 있으며, @dummy를 통해 불필요한 대상 필드 데이터를 삭제할 수 있습니다.

요약

이 데이터 마이그레이션 경험을 바탕으로 요약하면 다음과 같습니다.

  • mysqldump 명령을 사용하여 소량의 데이터를 가져오고 내보낼 수 있습니다. 이 방법은 간단하고 편리합니다.
  • 데이터 양이 많고 마이그레이션 인내심이 충분할 경우 자체 스크립트를 작성하고 적합한 병렬 솔루션을 선택하여 데이터를 마이그레이션할 수 있습니다. 이 방법은 코딩 비용이 더 높습니다.
  • 데이터의 양이 많아 단시간에 데이터 마이그레이션을 완료하고 싶을 때, mysql 가져오기 및 내보내기 파일을 통해 마이그레이션하면 더욱 효율적입니다. ~

위 내용은 MySQL의 백만단계 데이터 마이그레이션 과정을 기록하는 데 집중하세요!의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:learnku.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿