1. tmp table
검색해보면 tmp_table_size가 global 메모리 영역으로 계산하는 글이 많다.
나도 처음엔 global 메모리에서만 사용되는 설정값인 줄 알았으나,
session 메모리에서 사용되는 설정값이란 걸 나중에 알았다.
즉, 쿼리마다 각각의 tmp table을 사용하는 것이다. (mariadb도 마찬가지)
mysql 5.7 버전 이하에는 DB에 접속하는 세션이 많아질수록 tmp table은 끝없이 증가하여
메모리가 엄청 할당될 수 있다.
그러나, mysql 8.0에서는 tmp table의 메모리 한계치 설정값이 등장했다
이름하여, temptable_max_ram...
디폴트는 전체 메모리의 3%이고 최소 1GB에서 최대 4GB까지 늘릴 수 있다 라고 공식문서에 나와있는데
근데 막상 설치하면 1GB로 잡혔다..
뭐 어쨋든...
아무리 많은 세션이 들어와서 tmp table을 사용하더라도 최대 1GB까지 사용할 수 있는 것이다.
만약 1GB를 모두 사용하고 있다면, 세션들은 디스크를 사용하여 성능이 무척 느려질 것이다.
업그레이드 시 한번 주목해볼만하다
2. character set 및 collation
5.7의 utf8이 8.0부터는 utf8mb3로 이름이 바뀐다
우리는 한글을 쓰기에 보통 utf8을 사용할 것이다.
근데 기존 utf8로 인코딩되는 3bytes로는 요즘 사용되는 emoji 이모티콘을 저장할 수 없어서
utf8mb4라는 게 생겨나고 4bytes로 저장된다.
그렇다고 모든 문자가 4bytes로 저장되는 건 아니고
3bytes로 저장되는건 3bytes로 저장되고 4bytes로 저장되는건 4bytes로 저장된다
무엇보다 collation.... 문제...
5.7에도 utf8mb4가 있는데 collation 디폴트가 utf8mb4_general_ci 이다
근데 8.0의 디폴트는 utf8mb4_0900_ai_ci 이다.
이 두 개가 골때리는게... 한글 비교시 좀 안맞을 수 있다.
물론 정렬할 때도 달라질 수 있음
다음의 코드를 보면 이해가 빠를거 같다
mysql> insert into t_test values (1, '가'), (2, 'ㄱㅏ'),(3, '가 ');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t_test;
+----+--------+
| id | c1 |
+----+--------+
| 1 | 가 |
| 2 | ㄱㅏ |
| 3 | 가 |
+----+--------+
3 rows in set (0.01 sec)
-- utf8mb4_0900_ai_ci
mysql> select *, length(c1) from t_test where c1='가';
+----+--------+------------+
| id | c1 | length(c1) |
+----+--------+------------+
| 1 | 가 | 3 |
| 2 | ㄱㅏ | 6 |
+----+--------+------------+
2 rows in set (0.01 sec)
-- utf8mb4_general_ci
mysql> select *, length(c1) from t_test2 where c1 = '가';
+----+------+------------+
| id | c1 | length(c1) |
+----+------+------------+
| 1 | 가 | 3 |
| 3 | 가 | 4 |
+----+------+------------+
2 rows in set (0.00 sec)
3. 기타 등등
MySQL 8.0에서는 다음의 설정 파라미터들은 주석 처리 or 제거해줘야 한다.
- max_tmp_tables
- query_cache_type
- query_cache_size
- innodb_file_format
- innodb_file_format_max
그리고 sql_mode에서 NO_AUTO_CREATE_USER 옵션도 제거해줘야 하고...
또 rank 같은 예약어는 못사용하니 기존에 사용되는 프로시저 다 확인도 해봐야 한다.
마지막으로 lower_case_table_names 설정은 8.0부터 첫 기동시에만 설정할 수 있고 운영 중에는 변경이 불가능하다.
8.0 부터는 MySQL이 좀 더 엄격해진거 같은 느낌이 많이 든다.
기존 5.7에는 Datetime 데이터에 empty value를 비교해도 warning이 뜨고 동작되는 반면
8.0은 에러 뜨면서 쿼리가 작동하지 않는다.
부동소수점 관련해서도
5.7은 '1e+52' 값이 insert되긴 하는데... 8.0은 들어가지 않는다.
해당 데이터를 유지한채 업그레이드를 하면 기존에 들어간 데이터는 에러로 나오진 않는다.
일단 기억나는건 이정도로 일하다가 더 있으면 업데이트할 예정.
'Database > RDBMS' 카테고리의 다른 글
[Oracle] Oracle express 21c 설치 (feat. Rocky 8.9) (0) | 2024.03.16 |
---|---|
[MySQL/MariaDB] my.cnf 메모리 설정 (0) | 2022.06.11 |
[PostgreSQL] Architecture (0) | 2022.03.01 |
[MariaDB] mariabackup 백업 & 복구 (0) | 2022.02.15 |
[MySQL/MariaDB] 계정 정보 추출 (0) | 2021.11.11 |