mysql 5.0 -> 8.0 마이그레이션

| 2020년 5월 29일 | 0 Comments

Mysql 하위 버전에서 상위 버전으로 업그레이드 시 mysql의 버전에 따라 추가 혹은 삭제되는 기능이 존재합니다. 따라서 하위 버전에서 한 번에 상위 버전으로 올릴 경우 문제가 발생할 수 있어 mysql 버전 별로 업그레이드를 진행해야 합니다.
(php가 설치되어 있다면 mysql 재 컴파일 시, php 또한 재 컴파일이 동반될 수 있습니다.)

MySQL 백업 및 복구 명령어는 모두 동일합니다.

해당 메뉴얼은 Centos 7에서 진행하였으며 MySQL 5.0 → 5.1 → 5.5 → 5.7 → 8.0으로 버전을 업그레이드하며 설치 진행 및 데이터 무결성 체크 진행하였습니다.

1. MySQL 5.0 → 5.7 마이그레이션 진행

우선 MySQL 5.0 버전에서 덤프 생성을 진행하였습니다.
* 저는 mysql 공식 홈페이지에서 제공하는 데이터 샘플로 데이터를 넣었습니다.

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| employees | // 테스트를 진행할 database입니다.
| mysql |
| test |
+——————–+
4 rows in set (0.00 sec)

mysql> use employees;
Database changed

mysql> select * from employees limit 10;
+——–+————+————+———–+——–+————+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+——–+————+————+———–+——–+————+
| 10001 | 1953-09-02 | Georgi | Facello | M | 1986-06-26 |
| 10002 | 1964-06-02 | Bezalel | Simmel | F | 1985-11-21 |
| 10003 | 1959-12-03 | Parto | Bamford | M | 1986-08-28 |
| 10004 | 1954-05-01 | Chirstian | Koblick | M | 1986-12-01 |
| 10005 | 1955-01-21 | Kyoichi | Maliniak | M | 1989-09-12 |
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
+——–+————+————+———–+——–+————+
10 rows in set (0.01 sec)

테스트 데이터가 정상적으로 삽입되었으니 mysqldump 명령어를 통하여 전체 백업을 진행하겠습니다.

[root@techsmile-96643 smileserv]# mysqldump -u root -p –all-databases > all_mysql_5.0.sql
Enter password:

[root@techsmile-96643 smileserv]# ll
합계 164860
-rw-r–r– 1 root root 168815301 4월 29 21:42 all_mysql_5.0.sql

MySQL 5.1 설치 후 덤프 파일을 밀어넣도록 하겠습니다.
설치 직후 database 확인해보면 Mysql 설치 초기 상태인 점 확인할 수 있습니다.

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| mysql |
| test |
+——————–+
3 rows in set (0.00 sec)

확인이 완료되었으니 덤프 파일을 넣은 후 mysql_upgrade 명령어를 통하여 테이블 검사 등의 호환성을 검사합니다. mysql_upgrade 명령어는 내부에서 mysqlcheck –check-upgrade –all-database –auto-repair, mysql_fix_privileges_tables 등의 명령어를 실행하며 자동으로 테이블 검사, 복구 등을 진행합니다.

[root@techsmile-96643 smileserv]# mysql -u root -p < all_mysql_5.0.sql
Enter password:
[root@techsmile-96643 smileserv]# /usr/local/mysql/bin/mysql_upgrade -uroot -p
Enter password:
Looking for ‘mysql’ as: /usr/local/mysql/bin/mysql
Looking for ‘mysqlcheck’ as: /usr/local/mysql/bin/mysqlcheck
Running ‘mysqlcheck with default connection arguments
Running ‘mysqlcheck with default connection arguments
employees.departments OK
employees.dept_emp OK
employees.dept_manager OK
employees.employees OK
employees.salaries OK
employees.titles OK
mysql.columns_priv OK
mysql.db OK
mysql.event OK
mysql.func OK
mysql.general_log
Error : You can’t use locks with log tables.
status : OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.ndb_binlog_index OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.servers OK
mysql.slow_log
Error : You can’t use locks with log tables.
status : OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
Running ‘mysql_fix_privilege_tables’…
OK

mysql> show databases;
+——————–+
| Database |
+——————–+
| information_schema |
| employees |
| mysql |
| test |
+——————–+
4 rows in set (0.00 sec)

mysql> use employees;
Database changed

mysql> select * from employees limit 5;
+——–+————+————+———–+——–+————+
| emp_no | birth_date | first_name | last_name | gender | hire_date |
+——–+————+————+———–+——–+————+
| 10006 | 1953-04-20 | Anneke | Preusig | F | 1989-06-02 |
| 10007 | 1957-05-23 | Tzvetan | Zielinski | F | 1989-02-10 |
| 10008 | 1958-02-19 | Saniya | Kalloufi | M | 1994-09-15 |
| 10009 | 1952-04-19 | Sumant | Peac | F | 1985-02-18 |
| 10010 | 1963-06-01 | Duangkaew | Piveteau | F | 1989-08-24 |
+——–+————+————+———–+——–+————+
10 rows in set (0.00 sec)

정상적으로 데이터가 삽입되어 조회 되는 것 확인 가능합니다.

2. Mysql 5.7 → 8.0.16 미만 마이그레이션

(해당 메뉴얼에서는 MySQL 8.0.11 버전으로 테스트 진행하였습니다. )

Mysql 5.7에서 8.0 버전으로 마이그레이션 시에는 옵션을 추가하여 dump를 생성합니다.

만일 옵션을 추가하지 않고 덤프를 생성하여 밀어넣을 경우 다음과 같은 에러 메세지가 출력됩니다.

[root@techsmile-98055 smileserv]# mysql -u root -p < all_mysql_5.7.sql
Enter password:
ERROR 3554 (HY000) at line 726: Access to system table ‘mysql.innodb_index_stats’ is rejected

해결을 위하여 5.7 버전에
–ignore-table=mysql.innodb_index_stats –ignore-table=mysql.innodb_table_stats 옵션을 추가하여 덤프를 생성합니다. 해당 테이블은 mysql 8점대와 호환되지 않아 덤프 생성 시 제외합니다.

[root@techsmile-96643 smileserv]# mysqldump -uroot -p –all-databases –ignore-table=mysql.innodb_index_stats –ignore-table=mysql.innodb_table_stats > all_mysql_5.7.sql
Enter password:

생성한 덤프를 밀어 넣은 후 mysql_upgrade 명령어를 수행합니다. 다만 해당 방법은 8.0.16 버전 미만에서만 수행하여야 합니다.

[root@techsmile-98055 smileserv]# mysql -u root -p < all_mysql_5.7.sql
Enter password:
[root@techsmile-98055 smileserv]# /usr/local/mysql/bin/mysql_upgrade -uroot -p
Enter password:
Checking if update is needed.
Checking server version.
Running queries to upgrade MySQL server.
Upgrading system table data.
Checking system database.
mysql.columns_priv OK
mysql.component OK
mysql.db OK
mysql.default_roles OK
mysql.engine_cost OK
mysql.event OK
mysql.func OK
mysql.general_log OK
mysql.global_grants OK
mysql.gtid_executed OK
mysql.help_category OK
mysql.help_keyword OK
mysql.help_relation OK
mysql.help_topic OK
mysql.host OK
mysql.innodb_index_stats OK
mysql.innodb_table_stats OK
mysql.ndb_binlog_index OK
mysql.password_history OK
mysql.plugin OK
mysql.proc OK
mysql.procs_priv OK
mysql.proxies_priv OK
mysql.role_edges OK
mysql.server_cost OK
mysql.servers OK
mysql.slave_master_info OK
mysql.slave_relay_log_info OK
mysql.slave_worker_info OK
mysql.slow_log OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user OK
The sys schema is already up to date (version 2.0.0).
Checking databases.
employees.departments OK
employees.dept_emp OK
employees.dept_manager OK
employees.employees OK
employees.salaries OK
employees.titles OK
sys.sys_config OK
Upgrade process completed successfully.
Checking if update is needed.

3. MySQL 8.0.16 이상 마이그레이션

MySQL 8.0.16 버전부터는 mysql_upgrade 명령어가 아닌 mysqld 명령어와 –upgrade 옵션을 통하여 업그레이드를 진행합니다. 옵션9 값으로는 NONE, AUTO, MINIMAL, FORCE가 있습니다.

1.  NONE

업그레이드를 시도하지 않으며 업그레이드가 필요한 경우 서버가 중단됩니다.
이 옵션을 사용하면 이미 실행중인 것과 동일한 서버 버전 만 다시 시작할 수 있습니다. 버전 번호 이외의 기존 서버와 새 서버간에 차이가 없더라도 새 서버 버전을 시작할 수 없습니다.

2. AUTO

서버가 데이터 사전 업그레이드와 서버 업그레이드를 모두 시도하게하는 이 옵션의 기본 값입니다.

3. MINIMAL

서버를 시작할 때 서버 업그레이드가 아닌 데이터 사전 업그레이드 만 시도합니다. 서버의 이 상태는 8.0.16 이전의 업그레이드와 정확히 동일합니다. 이 시점에서 8.0.16 이전에는 mysql_upgrade 클라이언트 를 실행해야 합니다 . 이제 업그레이드 옵션 (또는 AUTO 또는 FORCE 옵션)없이 서버를 다시 시작하면 서버 업그레이드가 완료됩니다.

4. FORCE

서버가 이미 업그레이드 된 경우에도 FORCE 는 서버 업그레이드를 시도합니다. 이 동작은 –force 옵션으로 mysql_upgrade 클라이언트를 실행 한 이전 동작과 유사합니다 .

* 참고 – https://mysqlserverteam.com/mysql-8-0-16-mysql_upgrade-is-going-away/

Category: LINUX, 솔루션/IT기타

Avatar

About the Author ()