Azure MySQL 마이그레이션

이기현·2021년 11월 22일
0

Cloud Database

목록 보기
8/11

1. mysqldump를 통해 마이그레이션하고자 하는 서버 데이터 백업 받기

mysqldump -u dbalkh -p --database mssdb --single-transaction --routines --events > 20211109.sql

2. migration을 하는 서버에 대한 방화벽 정책 설정

Dashboard -> 인스턴스 -> Settings -> Connection Security

  • 로컬 PC에서 Migration 진행시,
    설치 시 로컬 IP에 대한 방화벽 설정하였으므로, 따로 설정할 필요 없음

3. Migration

백업받은 dump 파일을 통해 Migration 진행

C:\Program Files\MariaDB 10.5>mysql -hazuremaria.mysql.database.azure.com -P3306 -udbalkh -p < mysql_dump_20211122.sql

오류 조치

1.

ERROR 1064 (42000) at line 30: You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for the right 
syntax to use near 'SEQUENCE IF EXISTS `sq_biz_msg`' at line 1
  • Sequence 생성에 따른 MySQL과 MariaDB 구문 차이로 오류 발생
  • 해당 시퀀스 생성부분 DDL 삭제 후 Resotre 다시 진행

2.

ERROR 1030 (HY000) at line 1683: Got error 1 from storage engine

이유는 Azure Database for MySQL이 MyISAM 엔진을 지원하지 않기 때문이다.

As mention earlier, we are explicitly not supporting MyISAM due to 
the lack of transaction support which can lead to cases of data loss.

따라서 MyISAM으로 되어있는 엔진설정을 InnoDB로 변경해서 생성한다

ENGINE=MyISAM 찾아서
ENGINE=InnoDB 로 변경

3.

ERROR 1227 (42000) at line 1732: Access denied; 
you need (at least one of) the SUPER privilege(s) for this operation

해당 오류는 CREATE DEFINER 구문 때문에 발생한 오류이다.
소스를 확인 결과 CREATE DEFINER=mssdba@% FUNCTION ... 형식으로 DEFINER를 'mssdba'@'%' 로 지정해 놓고 있다.
DIFINER란 해당 오브젝트의 권한을 설정하는 부분이다.
기본적으로 함수를 생성할 때에 DEFINER를 지정하지 않고 CREATE FUNCTION ...으로 생성하면 명령어를 친 유저 소유로 생성이 된다. 하지만 다른 유저 소유로 생성이 될 수 있게 하는 명령어 구문이 DEFINER=유저명 명령어 이다.
따라서 DB내에 mssdba@% 유저가 없기 때문에 해당 구문이 오류가 발생하는 것이다.

  • 해결방법
  1. DEFINER 구문 삭제

CREATE DEFINER=mssdba@% 찾아서
CREATE OR REPLACE 변경

  1. 해당 유저 생성
    mssdba@'%' 유저를 생성하고 해당 유저에 적당한 권한을 부여하여 restore 진행

4.

ERROR 1044 (42000) at line 1727: Access denied for user 'dbalkh'@'%' to database 'mysql'

모든 DB를 다 Migration 하다보니 , mysql database또한 dump안에 포함되어 있다.
Azure에서 superuser 권한 및 DBA권한은 사용할 수 없기 때문에
mysql database는 삭제하고 새로 생성할 수 없다.

따라서 필요한 DB만 따로 dump받고 , 해당 db만 복구하는 방식으로 사용해야 한다.

mysqldump -u dbalkh -p --database mssdb --single-transaction 
--routines --events > 20211109.sql

5.

ERROR 1418 (HY000) at line 1732: This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA 
in its declaration and binary logging is enabled 
(you *might* want to use the less safe log_bin_trust_function_creators variable)

해당 오류는 mysql에서는 create function 할때 DETERMINISTIC, NO SQL, or READS SQL DATA 중에 하나를 명시해야 한다.
해당 구문없이 생성하기 위해서는
log_bin_trust_function_creators = ON; 으로 설정해야 한다

SET GLOBAL log_bin_trust_function_creators = 1;

하지만 해당 권한은 SUPER권한이 필요함으로 Azure에서는 실행할 수 없다. 따라서 함수 생성 구문을 변경해야 한다.

지금은 해당 함수생성 구문 삭제 후 복원을 진행한다.

4. 복원이 완료된 후 정상적으로 복원 되었는지 확인

mysql -hazuremaria.mysql.database.azure.com -P3306 -udbalkh -p

show databases;

profile
실력을 쌓아가는 하루하루

0개의 댓글