Azure Database Migration Service를 사용한 데이터 마이그레이션 준비 작업 이해
소개
가상 머신상에 호스팅하고 있던 MySQL을 Azure Database로 마이그레이션할 기회가 있었습니다만, 준비 작업에 수고가 걸렸으므로,ToDo로서 정리해 둡니다.
전제
우분투 18.04
MySQL 5.7
Azure Database for MySQL (ver 5.7)
SKU Standard
Private Link & Private Endpoint
구성
설정 변경이 필요했지만 요구사항의 편의상 다운타임이 허용되지 않기 때문에 마이그레이션용 소스 DB(복제본)를 작성하여 데이터 동기화를 수행했습니다.
할 일
자세한 내용은 여기을 참조하십시오.
이후 포인트 억제하여 소개합니다.
자세한 내용은 여기을 참조하십시오.
이후 포인트 억제하여 소개합니다.
다음 구성을 사용하여 원본 DB의 my.ini(Windows) 또는 my.cnf(Unix) 파일에 대한 바이너리 로깅을 활성화합니다. (요 재부팅)
[mysqld]
...
binlog_format = row
log_slave_updates = 1
...
소스 DB에 대한 마이그레이션 사용자를 준비합니다. ※유저명과 패스워드는 적절히 변경해 주세요
CREATE USER 'dms'@'%' IDENTIFIED BY 'secret';
GRANT REPLICATION SLAVE ON *.* TO 'dms'@'%';
GRANT REPLICATION CLIENT ON *.* TO 'dms'@'%';
GRANT ALL PRIVILEGES ON <migration db>.* TO 'dms'@'%';
FLUSH PRIVILEGES;
Azure Database를 만듭니다. 자세한 내용은 여기을 참조하십시오.
만들 때 일부 매개 변수를 변경합니다.
innodb_lock_wait_timeout = 1073741824
여기 필수는 아니지만 Azure Database가 VNet 내에서만 액세스 할 수 있도록 보안 요구 사항이 필요한 경우를 권장합니다. 자세한 내용은 여기을 참조하십시오.
소스 DB에 외래 키가 있는지 확인합니다.
쿼리 후반의
...KCU.REFERENCED_TABLE_SCHEMA = 'SchemaName'...
SchemaName은 적절하게 DB 이름으로 변경하십시오.존재하는 것으로 보이면 추출 결과의 drop 쿼리를 발행하고 해제하십시오.
마이그레이션 완료 후, 다시 외래 키를 설정할 때를 위해 설정(Add) 쿼리를 삼가도록.
SET group_concat_max_len = 8192;
SELECT SchemaName, GROUP_CONCAT(DropQuery SEPARATOR ';\n') as DropQuery, GROUP_CONCAT(AddQuery SEPARATOR ';\n') as AddQuery
FROM
(SELECT
KCU.REFERENCED_TABLE_SCHEMA as SchemaName,
KCU.TABLE_NAME,
KCU.COLUMN_NAME,
CONCAT('ALTER TABLE ', KCU.TABLE_NAME, ' DROP FOREIGN KEY ', KCU.CONSTRAINT_NAME) AS DropQuery,
CONCAT('ALTER TABLE ', KCU.TABLE_NAME, ' ADD CONSTRAINT ', KCU.CONSTRAINT_NAME, ' FOREIGN KEY (`', KCU.COLUMN_NAME, '`) REFERENCES `', KCU.REFERENCED_TABLE_NAME, '` (`', KCU.REFERENCED_COLUMN_NAME, '`) ON UPDATE ',RC.UPDATE_RULE, ' ON DELETE ',RC.DELETE_RULE) AS AddQuery
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU, information_schema.REFERENTIAL_CONSTRAINTS RC
WHERE
KCU.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
AND KCU.REFERENCED_TABLE_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA
AND KCU.REFERENCED_TABLE_SCHEMA = 'SchemaName') Queries
GROUP BY SchemaName;
마이그레이션시 데이터 무결성 담보를 위해 일시적으로 트리거를 해제합니다. 표시된 결과 내용을 발행합니다.
SELECT Concat('DROP TRIGGER ', Trigger_Name, ';') FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = 'your_schema';
mediumtext / longtext / blob /mediumblob / longblob
형식의 열을 찾아 32KB(32768byte)를 초과하지 않는지 확인합니다. 초과하면 대상 DB에서 잘립니다. 소스 DB에 대해 다음 쿼리에서 데이터의 길이를 확인합니다. SELECT max(length(foo)) as LEN from hoge;
마이그레이션 프로젝트를 만들 때 마이그레이션 마법사의 마이그레이션 설정 구성 단계에서 LOB에 대한 설정을 변경할 수 있으므로 여기에서 LOB의 데이터 길이를 입력하십시오.
소스 DB에서 DB 스키마를 내보냅니다.
mysqldump -h [servername] -u [username] -p[password] --databases [db name] --no-data > [schema file path]
ex) mysqldump -h 192.168.0.4 -u foo -p --databases soruce --no-data > ~/import.dump
내보낸 스키마에
DEFINER
가 포함되어 있는지 find
명령 등을 확인하고 존재하는 경우 제외합니다.ex) sed -i -e 's/DEFINER=`root`@`localhost`//g' [schema file path]
대상 DB로 가져오기
mysql -h [servername] -u [username] -p[password] [database] < [schema file path]
ex) mysql -h hoge.mysql.database.azure.com -u foo -p target < ~/import.dump
기타
가능했습니다.
당초 비용 억제를 위해 최소 사양(GP 2vCore)으로 타겟을 세웠습니다만, 프로덕션 가동에서는 메모리 최적화 타입으로의 가격 레벨 변경이 필요했습니다.
전환하기 전에 가격 수준을 변경해 보았지만 특히 문제없이 할 수있었습니다.
DMS 측에서 뭔가 오류가 발생했던 흔적은 없었다고 기억합니다.
참고
htps : // / cs. 미 c 로소 ft. 코 m / 자 jp / 아즈레 / dms / 쓰리 아 l mysql 아즈레 my sql
htps : // / cs. 미 c 로소 ft. 코 m / 쟈 jp / 아즈레 / dms / k의 w-이스에 s-t 브 b 쇼쇼 친 g dms
Reference
이 문제에 관하여(Azure Database Migration Service를 사용한 데이터 마이그레이션 준비 작업 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/hir0110/items/154b02cc1f3941a801ad
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(Azure Database Migration Service를 사용한 데이터 마이그레이션 준비 작업 이해), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hir0110/items/154b02cc1f3941a801ad텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)