Skip to main content

mysql to mariadb 업그레이드 수행

사전사항

  1. Centos6버전에서 사용할 수 있는 Mariadb는 Mariadb 10.5.16버전이 사용할 수 있는 최고 높은 버전(이후 버전은 glibc버전에 종속되어서 설치가 안됨)
  2. Cnetos7 / Rocky8버전에서는 Mariadb 10.6, 10.7버전 설치 가능 (OS교체까지 이루어지는 경우, 10.6이상으로 설치 / 운영하면 됨), 다만 업그레이드 plan은 Mariadb + Galera Cluster + Keepalived 구조가 아닌 Mariadb +  Replication + Mysql-MMM 구조로 유지
  3. Mariadb 10.0버전에서 gtid값에 slave pos를 저장하는 기능이 추가되었는데, gtid값을 이용해 리플리케이션 슬레이브모드에서 에러가 발생해도 sync할수 있도록 위치를 저장하는 테이블
    이 기존 mysql과는 다른 스키마로 되어 있어서 warning 메시지가 출력되기 때문에 추가 조치가 필요

작업절차

  1. DB#2에서 리플리케이션 중지

    mysql> stop slave;
    Query OK, 0 rows affected (0.007 sec)
  2. mysql-mmm-agent / mysql 프로세스 중지

    $> /etc/init.d/mysql-mmm-agent sotp
    $> /etc/init.d/mysqld stop
  3. DB데이터, DB엔진 데이터 백업

    $> mv /usr/local/mysql /usr/local/mysql_ori
    $> mv /home/data/mysql /home/data/mysql_ori
  4. Mariadb 엔진설치

    $> tar -zxvf mariadb-10.5.16-linux-x86_64.tar.gz  -C /usr/local/
    $> cd /usr/local/mariadb-10.5.16-linux-x86_64/ /usr/local/mysql
    $> cd /usr/local/mysql
    $> ./support-files/mysql.server start
  5. DB데이터 업그레이드

    $> cd /usr/local/mysql
    $> ./mysql_upgrade  -u root -p
    Enter password:
    MariaDB upgrade detected
    Phase 1/7: Checking and upgrading mysql database
    Processing databases
    mysql
    mysql.columns_priv                                 OK
    mysql.db                                           OK
    mysql.event                                        OK
    mysql.func                                         OK
    ...
    mysql.user                                         OK
    Upgrading from a version before MariaDB-10.1
    Phase 2/7: Installing used storage engines
    Checking for tables with unknown storage engine
    Phase 3/7: Fixing views from mysql
    Phase 4/7: Running 'mysql_fix_privilege_tables'
    Phase 5/7: Fixing table and database names
    Phase 6/7: Checking and upgrading tables
    Processing databases
    ...
    information_schema
    performance_schema
    Phase 7/7: Running 'FLUSH PRIVILEGES'
    OK
  6. 리플리케이션 재구성을 위한 테이블 정보 수정

    1. 리플리케이션 오류메시지 출력 확인

      mysql> show slave status \G;
      *************************** 1. row ***************************
      ...
                    Slave_IO_Running: Yes
                   Slave_SQL_Running: Yes
                   ...
                          Last_Errno: 1146
                          Last_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table 'mysql.gtid_slave_pos' doesn't exist
                        Skip_Counter: 0
                        ...
                       Last_IO_Errno: 0
                       Last_IO_Error:
                      Last_SQL_Errno: 1146
                      Last_SQL_Error: Unable to load replication GTID slave state from mysql.gtid_slave_pos: Table 'mysql.gtid_slave_pos' doesn't exist
         Replicate_Ignore_Server_Ids:
                    Master_Server_Id: 101
                      Master_SSL_Crl:
                  Master_SSL_Crlpath:
                          Using_Gtid: No
                         Gtid_IO_Pos:
             Replicate_Do_Domain_Ids:
         Replicate_Ignore_Domain_Ids:
                       Parallel_Mode: optimistic
                           SQL_Delay: 0
                 SQL_Remaining_Delay: NULL
             Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                    Slave_DDL_Groups: 0
      Slave_Non_Transactional_Groups: 0
          Slave_Transactional_Groups: 0
      1 row in set (0.000 sec)
       
      ERROR: No query specified
    2. slave 중지

      mysql> stop slave;
      Query OK, 0 rows affected (0.007 sec)
    3. gtid테이블 form 파일 삭제

      $> rm -rf /home/data/mysql/mysql/gtid*
      
    4. gtid 테이블 재생성

      mysql> CREATE TABLE `gtid_slave_pos` (
      `domain_id` int(10) unsigned NOT NULL,
      `sub_id` bigint(20) unsigned NOT NULL,
      `server_id` int(10) unsigned NOT NULL,
      `seq_no` bigint(20) unsigned NOT NULL,
      PRIMARY KEY (`domain_id`,`sub_id`)
      ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Replication slave GTID state';
    5. slave 시작 후 리플리케이션 오류 수정 확인

      mysql> start slave;
      Query OK, 0 rows affected (0.007 sec)
       
      MariaDB [mysql]> show slave status\G
      *************************** 1. row ***************************
                      Slave_IO_State: Waiting for master to send event
      ...
                   Slave_SQL_Running: Yes
                     Replicate_Do_DB:
                 Replicate_Ignore_DB:
                  Replicate_Do_Table:
              Replicate_Ignore_Table:
             Replicate_Wild_Do_Table:
         Replicate_Wild_Ignore_Table:
                          Last_Errno: 0
                          Last_Error:
                        Skip_Counter: 0
                 Exec_Master_Log_Pos: 976074661
                     Relay_Log_Space: 5142886
                     Until_Condition: None
                      Until_Log_File:
                       Until_Log_Pos: 0
                  Master_SSL_Allowed: No
                  Master_SSL_CA_File:
                  Master_SSL_CA_Path:
                     Master_SSL_Cert:
                   Master_SSL_Cipher:
                      Master_SSL_Key:
               Seconds_Behind_Master: 0
       Master_SSL_Verify_Server_Cert: No
                       Last_IO_Errno: 0
                       Last_IO_Error:
                      Last_SQL_Errno: 0
                      Last_SQL_Error:
         Replicate_Ignore_Server_Ids:
                    Master_Server_Id: 101
                      Master_SSL_Crl:
                  Master_SSL_Crlpath:
                          Using_Gtid: No
                         Gtid_IO_Pos:
             Replicate_Do_Domain_Ids:
         Replicate_Ignore_Domain_Ids:
                       Parallel_Mode: optimistic
                           SQL_Delay: 0
                 SQL_Remaining_Delay: NULL
             Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
                    Slave_DDL_Groups: 0
      Slave_Non_Transactional_Groups: 0
          Slave_Transactional_Groups: 0
      1 row in set (0.000 sec)
  7. DB#1에서도 동일한 절차 반복 수행