수년 전에 Docker용 MariaDB 10.4(mariadb:latest가 10.4.22이던 시절) 기반으로 만든 C# ASP.NET Core 3.1 프로그램을 만들어서 사용/운영 중인데, 이 MariaDB가... 은근 버그도 많고 성능도 좀 거시기...한 점이 있어 가급적 최신버전을 사용하려고 노력했으나 몇 가지 심각한 문제가 있어 업그레이드를 하지 못하고 있었다.

 

우선, 10.6 버전부터는 데이터베이스 UTF8 기본 문자셋이 utf8mb3가 되었다는 점.

이게 뭐가 문제냐면... .NET MySql 라이브러리인 MySql.Data v8.0.20을 사용하고 있었는데, 여기에서 utf8mb3를 지원하지 않기 때문에 접속 자체가 되지 않는다. 문자셋이 호환되지 않는다는 오류만 뻑뻑~

 

>> 참조: https://jira.mariadb.org/browse/MDEV-26105

 

[MDEV-26105] MariaDB 10.6 cannot be used from C# client applications - Jira

This is because the character set 'utf8mb3' is not supported by the .Net Framework. Since version 10.6 utf8 defaults to utf8mb3 but the this can be prevented by starting the server with the option 'old_mode='. However the system character set is utf8mb3 an

jira.mariadb.org

 

다행히 작년 초에 업데이트된 MySql.Data v8.0.28부터는 utf8mb3가 지원된다고 하는 뉴스를 최근에야 접하고,

이제 MariaDB를 최신버전으로 업그레이드를 한번 해보려고 큰 결심을 했는데...

 

 

 

당연하게도?!! 여러가지 문제를 겪고 있다.

 

우선, 위 utf8mb3 지원 문제부터 해결하기 위해 현재 시점 기준 최신버전인 MySql.Data v8.0.33으로 업데이트부터.

그 다음에 MariaDB 최신버전이 어디까지 나왔나 확인해 봤다. 음... latest 안정화 버전은 10.11.3이군.

무턱대고 일단 최신버전부터 다운로드 받아서 설치, 테스트해 봤다.

 

 

 

엇! 이전 10.4에서 사용하던 DB 스키마를 볼륨(volume) 그대로 10.11에다 올렸더니 동작이 안된다.

10.11 기본 스키마를 기반으로 데이터베이스마다 일일이 백업/복원하는 방식으로 올려야 한다. ㄷㄷ

이건 좀... 시간 많이 잡아 먹으면 안되는 작업인데... 제길슨!

 

아무튼, 일일이 한땀한땀 작업해서 올렸다.

정상 동작 확인!

 

 

 

그 다음으로, 기존 사용하던 프로그램을 올려봤다.

읭???? 접속부터 안된다.

 

 

"Object cannot be cast from DBNull to other types."

 

이런 해괴망측한 오류가 접속 시점부터 발생한다.

인터넷을 뒤져보니 MariaDB 10.10 버전부터 기본 문자셋 정렬 ID가 Nullable로 바뀌었는데, MySql.Data에서는 이 ID를 Not Null로 취급하기 때문에 오류가 발생해서 접속 자체가 되지 않는 것이라고 한다.

 

>> 참조: https://stackoverflow.com/questions/74060289/mysqlconnection-open-system-invalidcastexception-object-cannot-be-cast-from-d

 

MySqlConnection.Open() System.InvalidCastException: Object cannot be cast from DBNull to other types

I have simple connectionstring to MySql (MariaDB 5.5.5-10.11.0) written in c#: MySqlConnection Database = new MySqlConnection("Server=127.0.0.1; Port=3306; Database=test; Uid=user; Pwd=MyPassw...

stackoverflow.com

 

해결 방법은 10.10 이전 버전, 즉 10.9 버전을 쓰거나, MySql.Data를 삭제하고 MySqlConnector를 사용하는 것뿐이라고.

 

응? MySqlConnector? 그런 게 생겼나?

찾아봤다.

 

>> 참조: https://mysqlconnector.net/tutorials/migrating-from-connector-net/

 

MySqlConnector vs MySql.Data - MySqlConnector

MySqlConnector is a high-performance, asynchronous C# ADO.NET driver for MySQL Server, MariaDB, Amazon Aurora, Azure Database for MySQL, Google Cloud SQL for MySQL, Percona Server and more.

mysqlconnector.net

 

오... 뭔가 성능이나 안정성이 더 좋은 라이브러리라고 한다. 왜 이걸 몰랐지?

바로 바꾸기로 했다.

 

MySql.Data v8.0.28 삭제!

MySqlConnector v.2.2.6 설치! (현재 최신버전은 2.2.6이다.)

 

using 네임스페이스만 바꾸니 바로 정상 동작한다. 완벽한 대체품!

접속도 되지 않던 문제가 바로 해결됐다. 대충 확인해 본 바로는 모든 기능들이 다 정상인 듯.

 

이제 AKS Kubenetes 운영 환경에 반영하는 일만 남았군.

 

 

 

마지막으로,
MariaDB 버전 업그레이드를 하기 위한 필요 검토 사항들을 정리하고 마친다.
(Docker 환경, Spider 엔진을 통한 Sharding/Partitioning 사용 시 기준)

  1. 기존 DB 스키마와의 호환성 검토
    • 마이너 업데이트/버그 패치 수준이 아닌 이상 스키마 호환성이 거의 유지가 안됨...
    • 즉, 새로 처음부터 만들어야 한다는 의미
  2. 신규 버전 다운로드 후 Spider 엔진 설치
    • Docker용 MariaDB에는 기본적으로 Vim 및 Spider 엔진이 설치되어 있지 않음.
    • 컨테이너 실행 후 수동으로 설치해야 함.
  3. DB 스키마 복제/백업
    • 별도 저장공간(Volume)으로 탑재하기 위해
    • (*Volume: Docker/Container 생명주기와 별도로 존재하는 저장공간. 유지보수 용이)
  4. 기존 DB 백업 및 신규 DB에 복원
    • 각 데이터베이스 별로 백업/복원 처리
    • 신규 DB에 복원 후 정상 동작하는지 테스트/검증 필요
  5. 개발도구와의 호환성 검토
    • C# (ASP.NET Core 3.1)에서 사용 가능한 라이브러리인지
    • MariaDB 버전에 따라 제약/버그는 없는지 사전 인터넷을 통해 검색
    • 10.10 버전은 MySqlConnector v2.2.2로 사용 가능, 10.11에 대한 내용은 확인 불가 -> 직접 설치 후 검토 필요

 

 

 



Posted by 떼르미
,


자바스크립트를 허용해주세요!
Please Enable JavaScript![ Enable JavaScript ]