설치와 설정 (2)

MySQL 업그레이드

1. 업그레이드 종류

서버를 업그레이드 하는 방법으로 크게 두가지 방법이 있다.

  • In-Place Upgrade
    MySQL 서버의 데이터 파일을 그대로 두고 업그레이드 하는 방법.
  • Logical Upgrade
    mysqldump 도구 등을 이용해 MySQL 서버의 데이터를 SQL 문장이나 텍스트 파일로 덤프한 후,새로 업그레이드된 버전의 mysql 서버에서 덤프된 데이터를 적재하는 방법.

In-Place Upgrade는 제약사항이 많고 업그레이드가 빠르며
Logical Upgrade은 제약사항이 거의 없고 업그레이드 느리다.

In-Place Upgrade의 제약사항으로는 직전 메이저버전에서만 업그레이드가 가능하다.
예를들어 5.5 to 8.0 업그레이드 시 5.5 > 5.6 > 5.7 > 8.0 의 과정을 거쳐야 한다.
Logical Upgrade도 업그레이드 시 인코딩, sql/procedure 문법을 확인해야 한다.


2. MySQL 8.0 업그레이드 시 고려 사항

MySQL 8.0에서는 개선,변경,삭제된 기능이 있다.
업그레이드 하기 전에 영향을 미치는 내용을 검토한다.

  • 사용자 인증 방식 변경
    MySQL 8.0 부터는 Caching SHA-2 Authentication (이하 SHA-2) 인증 방식을 Default 로 사용한다. Native Authenticatio을 계속 사용하고자 한다면--default-authentication-plugin=mysql_native_password 파라미터를 활성화 하면된다.

  • MySQl 8.0과의 호환성 체크
    mysqlcheck 유틸리티로 확인 가능. 호환불가 타입, 손상된 데이터 파일을 체크

  • 외래키 이름의 길이
    MySQL 8.0에서는 외래키 이름 길이를 64자로 제한했다.

  • 인덱스 힌트
    MySQL 5.x에서 사용하던 인덱스 힌트가 있다면 MySQL 8.0 업그레이드 이후 성능 테스트를 수행한다.구버전에서는 성등향상에 도움이 되었지만 MySQL 8.0에서는 성능저하를 유발할 수 있다.

  • GROUP BY에 사용된 정렬 옵션
    MySQL8.0부터 해당 구문을 지원하지 않는다.

  • 파티션을 위한 공용 테이블스페이스
    MySQL 8.x에서는 각 테이블스페이스를 공용 테이블스페이스에 저장 할 수 없다. 공용 테이블스페이스에 저장된지 확인하고 저장되었다면 ALTER TABLE ... REORGANIZE 명령을 실행해 개별 테이블스페이스를 사용하도록 변경한다.


3. MySQL 8.0 업그레이드

MySQL 5.7 to 8.0 업그레이드는 두단계로 진행된다.

  1. 데이터 딕셔너리 업그레이드
    • 메타정보를 담는 FRM 파일 -> IBD(테이블스페이스) 파일에서 관리
    • 기존 MyIsam 엔진 -> InnoDB엔진
  2. 서버 업그레이드
    • performance_schema, Information_schema 구조 변경

MySQL 8.0.16미만 버전은 5번까지, 8.0.16버전부터는 4번까지 진행하면 된다.

  1. MySQL 셧다운
  2. MySQL 5.7 프로그램 삭제
  3. MySQL 8.0 프로그램 설치
  4. MySQL 8.0 서버 시작
  5. mysql_upgrade 프로그램 실행

MySQL 8.0.16버전 미만은 4번에서 데이터딕셔너리 업그레이드, 5번에서 서버업그레이드를 진행한다.


서버 설정

일반적으로 MySQL 서버는 단 하나의 설정 파일을 사용하는데, 유닉스 계열은 "my.cnf", 윈도우 계열은 "my.ini"라는 이름을 사용한다. MySQL 서버는 시작될 때만 이 설정 파일을 참조하는데, 이 설정 파일의 경로가 고정되어 있는 것은 아니다. MySQL 서버는 지정된 여러 개의 디렉토리를 순차적으로 탐색하며 처음 발견한 my.cnf를 사용한다.

설정파일의 경로는 다음 명령어를 통해 확인 가능하며 가급적 데몬을 사용한 확인은 지양해야 한다.

# 데몬을 사용하여 조회
$ mysqld --verbose --help |grep my.cnf

# 클라이언트 유틸을 사용하여 조회
$ mysql --help |grep my.cnf

#출력
[root@191 mysql]# mysqld --verbose --help |grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
                      my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
                      
[root@191 mysql]# mysql --help |grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf

설정파일 경로 탐색 순서

  1. /etc/my.cnf
  2. /etc/mysql/my.cnf
  3. /usr/etc/my.cnf
  4. ~/.my.cnf

설정파일의 구성

MySQL 설정 파일은 여러 개의 설정그룹을 담을 있으며, 대체로 실행 프로그램 이름을 그룹명으로 사용한다.

[mysqld]
port            = 3306
.
.
.
 
[mysqldump]
quick
max_allowed_packet = 64M
default_character_set = utf8
 
[mysql]
no_auto_rehash
prompt=mysql (\d)>
 
[mysqld_safe]
open-files-limit = 65535

시스템 변수의 특징

MySQL 서버는 기동하면서 설팡 파일의 내용을 읽어 메모리나 작동 방식을 초기화하고, 접속된 사용자를 제어하기 위해 이러한 값을 별도로 저장해 둔다.

mysql> show variables\G;
*************************** 1. row ***************************
Variable_name: activate_all_roles_on_login
        Value: OFF
*************************** 2. row ***************************
Variable_name: admin_address
        Value:
*************************** 3. row ***************************
Variable_name: admin_port
        Value: 33062
*************************** 4. row ***************************
Variable_name: admin_ssl_ca
        Value:
*************************** 5. row ***************************
Variable_name: admin_ssl_capath
        Value:
*************************** 6. row ***************************
Variable_name: admin_ssl_cert
        Value:
*************************** 7. row ***************************
Variable_name: admin_ssl_cipher
        Value:
*************************** 8. row ***************************
Variable_name: admin_ssl_crl
        Value:
*************************** 9. row ***************************
Variable_name: admin_ssl_crlpath
        Value:
*************************** 10. row ***************************
Variable_name: admin_ssl_key
        Value:
*************************** 11. row ***************************
Variable_name: admin_tls_ciphersuites
        Value:

💡 도큐먼트에 시스템 변수 설명이 있으며 5가지속성으로 분류한다.

YUM
Cmd-LineCLI로 변경 가능여부
Option file설정파일(my.cnf)로 제어여부
System Var시스템변수인지 아닌지 여부. '-','_'구분에 주의
Var Scope시스템 변수의 적용 범위 ( GLOBAL/SESSION )
Dynamic동적변경 가능 여부

1. 글로벌 변수와 세션 변수

  • 글로벌 변수
    글로벌 범위의 시스템 변수는 하나의 MySQL 서버 인스턴스에서 전체적으로 영향을 미치는 시스템 변수
    MySQL 서버에 단 하나만 존재하는 innodb_buffer_pool등이 이에 해당한다.

  • 세션 변수
    세션 범위의 시스템 변수는 MySQL 클라이언트가 MySQL 서버에 접속할 때 기본으로 부여하는 옵션의 기본값을 제어하는데 사용된다.
    DEFAULT 값은 글로벌 변수이며 대표적으로 autocommit이 이에 해당한다.


2. 정적 변수와 동적 변수

서버 기동중에 변경이 가능하면 동적 변수, 변경 불가능하다면 정적 변수 이다.

mysql> show variables where variable_name like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 1     |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL innodb_fast_shutdown=0;

mysql> show variables where variable_name like 'innodb_fast_shutdown';
+----------------------+-------+
| Variable_name        | Value |
+----------------------+-------+
| innodb_fast_shutdown | 0     |
+----------------------+-------+
1 row in set (0.00 sec)

동적 변수는 재기동 시 default옵션과 my.cnf옵션으로 초기화 주의


3. 👍SET PERSIST

MySQL 8.0버전에서 추가된 SET PERSIST 명령어를 사용하면, 반영된 동적변수를 mysqld-auto.cnf에 기록해 둔다. MySQL 서버 재기동 시 my.cnf와 mysqld-auto.cnf 둘 다 참조하여 시스템 변수를 반영한다.




# 참조
백은빈,이성욱. 2021. Real MySQL 8.0 (1권). 위키북스.
MySQL 8.0 Reference Manual

좋은 웹페이지 즐겨찾기