PaaS 제품 DB 이관
Azure MariaDB 가 올해로 끝나서 이관을 해야되는데 PaaS 제품이라서 이관 지원이 안된다는 답변을 받음.
그래서 MS 직원이 추천해준 mysqlsh 방식으로 이관을 진행할 예정임.
필요한 재원
새로운 VM (Disk I/O, RAM, CPU 등 좋은 재원으로...)
특히 Disk I/O 가 큰 VM 이 필요함.
MariaDB
일단 새로운 VM 에 mysqlsh 를 설치 후 다음과 같은 명령어를 실행한다.
mysqlsh --uri root@localhost:3307 # mariadb
\js
util.dumpInstance("\\backup", {
threads: 16,
users: false,
consistent: true,
chunking: true,
showProgress: true,
excludeSchemas: ["제외할스키마"]
})
threads : MySQL 인스턴스에서 데이터 청크를 덤프하는 데 사용할 병렬 스레드 수임. 기본값은 4.
VM 의 CPU 상태를 보고 Threads 를 할당해야한다. 아니면 Lock 걸릴 수 있음.
users : (인스턴스 덤프 유틸리티 전용) 덤프에 사용자와 해당 역할 및 권한을 포함(true) 하거나 제외(false)
consistent : 덤프 중 백업을 위해 인스턴스를 잠그어 일관된 데이터 덤프를 활성화(true) 또는 비활성화 함.
chunking : 테이블 데이터에 대한 청킹을 활성화(true) 또는 비활성화(false) 하여 각 테이블의 데이터를 여러 파일로 분할함.
위 명령어 실행 시 루트 디렉토리에 backup 이라는 폴더가 생성됨.
MySQL
Azure Portal 의 PaaS 제품을 사용하려고 한다면 /etc/my.cnf 가 아닌 portal 에 있는 환경변수 편집 탭에서 하면됨.
local_infile = 1
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 16G
innodb_log_file_size = 10G
innodb_doublewrite = 0
sync_binlog = 0
lock_wait_timeout = 36000
해당 환경 변수를 검색하여 설정값을 변경 후 재시작
재시작이 완료 되었으면
mysqlsh --uri root@localhost:3308 # MySQL
\js
util.loadDump("\\backup", {
loadDdl: true,
loadData: true,
loadUsers: false,
ignoreVersion: true,
analyzeTables: 'on',
threads : 16,
waitDumpTimeout: 36000,
showProgress: true
})
이렇게 하면 됨.
SET GLOBAL local_infile = ON;
LOAD DATA LOCAL INFILE
을 사용할 수 있도록 허용함. 원격이나 로컬 파일에서 데이터를 빠르게 삽입할 수 있음.
성능 영향
빠른 데이터 로드 가능 =>
Insert
보다 최대 20밴 빠르게 데이터 삽입 가능대량 데이터 마이그레이션 최적화 =>
.tsv.zst
파일을 복원할 때 필수적하지만 보안 위협이 있음. => 원격지에다가 파일을 로드 할 수 있으므로...
SET GLOBAL innodb_flush_log_at_trx_commit = 2;
트랜잭션 커밋 시 디스크 쓰기를 줄여 성능을 높임.
기본값
1
=> 모든 트랜잭션 커밋마다 로그를 디스크에 기록(안전하지만 느림)변경 값
2
=> 1초마다 로그를 디스크에 기록(안정성은 조금 낮추지만 빠름)
성능 영향
대량 데이터 삽입 속도 향상 =>
INSERT
,LOAD DATA INFILE
실행 속도 최대 2~3배 빨라짐디스크 I/O 감소 => 트랜잭션마다 디스크 쓰기를 하지 않아서 디스크 부담이 줄어듦
하지만 데이터 유실 위험이 있음... => MariaDB 가 갑자기 크래시(정전, 장애 등) 나면 최근 1초 내의 트랜잭션이 손실 될 수도 있음.
SET GLOBAL innodb_buffer_pool_size = 10 * 1024 * 1024 * 1024 (10GB)
InnoDB의 가장 중요한 메모리 캐시 크기 조정
buffer_pool 이 크면, 더 많은 데이터를 메모리 캐싱할 수 있어서 성능이 향상됨.
성능 영향
읽기/쓰기 성능 향상 => 더 많은 데이터를 메모리에서 처리 => 디스크 I/O 감소
대량 삽입(
INSERT
,LOAD DATA
) 속도 향상 => 데이터가 캐시에 저장되면서 디스크 병목 방지하지만... 메모리 부족 주의 => 대상 DB 서버의 RAM 이 16GB 이상이어야 안정적으로 사용 가능함. 예: 서버 RAM이 32GB라면 16G까지 설정 가능
SET GLOBAL innodb_buffer_pool_size = 16 * 1024 * 1024 * 1024; -- 16GB
SET sql_log_bin = 0;
Binary Log 기록 비활성화 기본적으로 모든 SQL 변경 사항 (INSERT
, UPDATE
, DELETE
) 이 binary log 에 기록됨. => 복제 및 PITR 에 사용됨. binary_log 를 끄고, 데이터 로드 속도를 향상 시킴.
성능 향상
대량 데이터 삽입 속도 최대 3~5배 증가
불필요한 로그 생성을 방지하여 디스크 부담 감소
하지만... Replication (복제) 사용중이면 주의 -> binary_log 가 꺼지면 슬레이브 서버에 복제되지 않음. Point-in-Time Recovery 불가능 => 특정 시점으로 복구하는 기능 사용할 수 없음
Last updated
Was this helpful?