2021년 6월 10일 목요일

결혼이민비자 신청방법(F-6-1 국민의 배우자)

 제가 일본인 여자친구와 결혼 후, 한국에 귀국하기 위해 신청한 결혼이민비자에 대하여 작성해보도록 하겠습니다.

필자는 일본에서 근무하고 있었으며, 한국에서의 소득은 없었습니다.
결혼이민비자를 신청한 날짜는 2021-04-21 이며, 사증이 발급된 날짜는 2021-05-14 입니다.

본론으로 들어가서, 신청 시 제출한 서류들을 나열해보겠습니다...!

  • 배우자의 여권
  • 배우자의 컬러사진(3.5 x 4.5)
  • 사증발급신청서
  • 초청인의 재직증명서, 납세증명서
  • 초천인의 가족관계증명서, 혼인관계증명서, 기본증명서, 주민등록등본, 본인신용조회서
  • 초청인 가족의 재직증명서, 납세증명서, 국체성 발행 소득증명원, 은행잔고증명서
  • 초청인이 대한민국에서 거주할 곳의 부동산 등기부등본
  • 외국인 배우자 초청장
  • 외국인 배우자 배경진술서
  • 신원보증서
  • 초청인의 일본어 자격증(배우자와 의사소통에 문제가 없다는 걸 증명하기 위함)
  • 초청인과 배우자의 주민표(일본 구약소에서 발급한)
  • 초청인의 재류카드 앞, 뒷면
  • 시설격리동의서(코로나로 인한 추가서류)
주일본대한민국대사관 영사부에 제출해야 하는 데, 비자 신청 시간과 수취 시간이 다르므로 주의가 필요합니다.

비자 신청 가능한 시간: 09:00 ~ 11:30
(참고자료에서는 10시 부터 라고 나와있지만, 직접 방문해보니 9시 부터 접수가능 했습니다)
비자 수취 가능한 시간: 14:00 ~ 16:00

# 참고자료
https://overseas.mofa.go.kr/jp-ko/wpge/m_20080/contents.do
https://overseas.mofa.go.kr/jp-ko/wpge/m_20079/contents.do

2021년 6월 3일 목요일

MySQL 5.7 기억해두면 좋은 것들

 MySQL 5.7을 사용할 때, 기억해두면 좋은 내용들을 정리해보도록 하겠습니다.


1. show_compatibility_56

global_variables, session_variables, global_status, session_status 의 결과 값을 information_schema 에서 출력할 지, performance_schema 에서 출력할 지 지정하는 변수입니다.

MySQL 5.7 에서 생긴 변수이며,
MySQL 5.6 과 동일하게 information_schema 에서 출력하려면 ON
performance_schema에서 출력하려면 OFF

MySQL 5.7.9 부터는 performance_schema에 SELECT grant없이도 검색할 수 있게 되었습니다.


2. default_password_lifetime

MySQL 5.7.10 까지의 기본 값은 360 입니다.
그로 인해, password_last_changed 부터 360일 이상 경과한 유저는 로그인 할 수 없게 되는 상황이 발생하게 되었습니다.

하지만, MySQL 5.7.11 부터는 기본 값이 0으로 되어 lifetime이 무기한으로 변경되었습니다.


3. 16 byte 해시 패스워드 폐지

old_passwords, skip_secure_auth 옵션은 16 byte 해시 패스워드와 관련있는 변수입니다.
- old_passwords: 비밀번호를 저장할 때 사용하는 암호화를 예전 버전의 알고리즘을 채용
- skip_secure_auth: 예전 버전의 암호화로 저장되어 있는 유저가 로그인 하기 위해 구사

MySQL 5.7부터는 아예 사용할 수 없게 되었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.6.51    |
+-----------+
1 row in set (0.00 sec)
 
mysql> SELECT user, host, password FROM user WHERE user <> 'root';
+--------------+-----------+-------------------------------------------+
| user         | host      | password                                  |
+--------------+-----------+-------------------------------------------+
| old_password | localhost | 5d2e19393cc5ef67                          |
| new_password | localhost | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 | # 새로운 암호화는 *로 시작
+--------------+-----------+-------------------------------------------+
2 rows in set (0.00 sec)
cs

4. sql_mode

- MySQL 5.6
NO_ENGINE_SUBSTITUTION: 존재하지 않는 스토리지 엔진을 지정하여 테이블을 작성하면 에러

- MySQL 5.7
ONLY_FULL_GROUP_BY: GROUP BY 절에 지정한 컬럼 이외에는 검색할 수 없게 되었습니다(집계함수 제외)

STRICT_TRANS_TABLES: MySQL이 멋대로 행을 자른다던가, 문자를 숫자로 캐스팅 할 때 warning을 출력하면서 실행되었지만. 해당 설정으로 인해 에러를 반환하도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
mysql> set sql_mode = 'NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected (0.00 sec)
 
mysql> DESC jg;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| text_col | varchar(20| YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
1 row in set (0.01 sec)
 
mysql> insert into jg (text_col) values (REPEAT('Aa'11));
Query OK, 1 row affected, 1 warning (0.00 sec)
 
mysql> show warnings;
+---------+------+-----------------------------------------------+
| Level   | Code | Message                                       |
+---------+------+-----------------------------------------------+
| Warning | 1265 | Data truncated for column 'text_col' at row 1 |
+---------+------+-----------------------------------------------+
1 row in set (0.01 sec)
 
mysql> select * from jg;
+----------------------+
| text_col             |
+----------------------+
| AaAaAaAaAaAaAaAaAaAa |
+----------------------+
1 row in set (0.00 sec)
 
mysql>  set sql_mode = 'STRICT_TRANS_TABLES';
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into jg (text_col) values (REPEAT('Aa'11));
ERROR 1406 (22001): Data too long for column 'text_col' at row 1
cs

NO_ZERO_IN_DATE: date, datetime 타입의 month, day에 0을 넣으면 warning을 출력하면서 0000-00-00 으로 저장됩니다.
(STRICT_TRANS_TABLES 랑 같이 사용하면 에러를 반환하도록 합니다)

NO_ZERO_DATE: date, datetime 타입에 0000-00-00을 넣으면 warning이 출력됩니다.(NO_ZERO_IN_DATE와 동일하게 warning 이므로 STRICT_TRANS_TABLES 랑 같이 사용하면 에러를 반환하도록 합니다)

ERROR_FOR_DIVISION_BY_ZERO: x를 0으로 나누면 warning을 출력 후 NULL을 반환합니다.(MySQL 5.6에서는 warning이 없었음)
(STRICT_TRANS_TABLES 랑 같이 사용하면 에러를 반환하도록 합니다)

NO_AUTO_CREATE_USER: 패스워드 없는 유저를 CREATE USER가 아닌 GRANT로 생성 시 에러를 반환합니다.


5. log_error_verbosity

MySQL 5.7.2 부터 추가된 로그 레벨 제어 옵션입니다.
특징
- log_warnings + 1 의 값이 log_error_verbosity 로 지정됩니다
- log_warnings, log_error_verbosity 가 혼재되어 있을 경우 높은 쪽으로 설정됩니다

value noteswarningserrors
log-warnings = 0
log-error-verbosity = 1
NoNo Yes
log-warnings = 1
log-error-verbosity = 2
NoYesYes
log-warnings >= 2
log-error-verbosity >= 3
Yes YesYes

6. Temporary table

CREATE TEMPORARY TABLE 은 default_tmp_storage_engine 변수로 제어합니다(5.6 ~)

MySQL 5.7 부터 internal_tmp_disk_storage_engine 변수가 추가되었습니다.
내부 임시 테이블(Using temporary)는 해당 변수로 제어되며, 기본 값은 InnoDB 입니다.

임시 테이블을 이용하는 경우는 redo log, x lock 이 필요 없으므로 전용 ibtmp1 파일을 작성합니다. 관련 변수의 기본 값은 innodb_temp_data_file_path = ibtmp1:12M:autoextend

주의 점은 한번 확보한 용량은 mysqld를 재시작하기 전까지 줄어들지 않습니다.
이와 달리, MyISAM 임시 테이블은 쿼리가 끝나면 용량이 바로 회수됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mysql> select * from (select name from test_table group by name order by age, id) as a, (select age from test_table group by age order by created_at, updated_at) as b ORDER BY a.name, b.age ASC;
 
[root@08d751da1200 tmp]# ls -al
total 50524
-rw-rw---- 1 mysql mysql 24379392 Jun  3 22:03 #sql_cfe_2.MYD
-rw-rw---- 1 mysql mysql 27345920 Jun  3 22:03 #sql_cfe_2.MYI
drwxr-xr-2 mysql mysql     4096 Jun  3 22:03 .
drwxr-xr-1 root  root      4096 Jun  3 18:24 ..
 
# Query end
518983 rows in set (4.31 sec)
 
[root@08d751da1200 tmp]# ls -al
total 8
drwxr-xr-2 mysql mysql 4096 Jun  3 22:03 .
drwxr-xr-1 root  root  4096 Jun  3 18:24 ..
cs

7. mysql.user.password column 폐지

MySQL 5.7 부터 패스워드 해시는 mysql.user.authentication_string 컬럼에 격납되게 되었습니다.
MySQL 5.6 이전은 mysql.user.password 이었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.6.51    |
+-----------+
1 row in set (0.00 sec)
 
mysql> SELECT user, host, password, authentication_string FROM user WHERE user <> 'root';
+--------------+-----------+-------------------------------------------+------------------------
---------------+
| user         | host      | password                                  | authentication_string |
+--------------+-----------+-------------------------------------------+------------------------
---------------+
| old_password | localhost | 5d2e19393cc5ef67                          |                       |
               |
| new_password | localhost | *2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19 |                       |
               |
+--------------+-----------+-------------------------------------------+------------------------
---------------+
2 rows in set (0.00 sec)
 
mysql> SELECT @@version;
+-----------+
| @@version |
+-----------+
| 5.7.34    |
+-----------+
1 row in set (0.00 sec)
 
mysql> SELECT user, host, password, authentication_string FROM user WHERE user <> 'root';
ERROR 1054 (42S22): Unknown column 'password' in 'field list'
 
mysql> SELECT user, host, authentication_string FROM user WHERE user <> 'root';
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
+---------------+-----------+-------------------------------------------+
2 rows in set (0.01 sec)
cs

8. log_timestamps

slow query, error, general log Default timestamp 가 UTC 로 되었습니다.
UTC 또는 SYSTEM 로 설정하며, 온라인으로 변경 가능합니다.

binary log 는 해당 변수와 상관 없습니다.


9. innodb_buffer_pool_dump_pct

MySQL 5.7 부터 innodb_buffer_pool_dump_at_shutdown, innodb_buffer_pool_load_at_startup Default 값이 ON 으로 변경되었습니다.

새로 추가된 innodb_buffer_pool_dump_pct 변수는 mysqld 를 정상종료 할 때 버퍼 풀 전체의 25% 페이지를 텍스트 파일에 남기도록 하는 설정입니다.
(MySQL 5.6 이전은 100% 다 남김)

개인적으로는 innodb_buffer_pool_dump_at_shutdown = ON, innodb_buffer_pool_load_at_startup = OFF 가 좋다고 생각합니다.


10. binlog_format

Default 가 ROW 로 변경되었습니다.

관련된 변수들을 나열해보면
- binlog_row_image: format 이 row 일 때, row image를 최소 컬럼셋으로 로깅하도록 설정
- binlog_rows_query_log_events: format 이 row 일 때, Row query log event 같은 정보성 로그 이벤트들이 기록됩니다(original query)

mysqlbinlog 를 사용할 땐, --vv 또는 --verbose --verbose 옵션 사용을 추천합니다.


11. secure_file_priv

File_priv grant 가 부여되어 있는 유저의 SELECT ... INTO OUTFILE 또는 LOAD DATA INFILE statement에 관련된 설정입니다.

secure_file_priv 가 지정되어 있지 않은 경우, mysqld 실효한 유저 권한으로 모든 파일에 접근할 수 있습니다.

온라인 변경 불가능

MySQL 5.7 부터의 변경내용
- rpm, deb 등의 패키지의 경우, Default 값이 /var/lib/mysql-files 로 설정됩니다.
- secure_file_priv = NULL 로 설정하는 경우, File 권한을 이용하는 모든 동작이 불가능 해졌습니다.
- secure_file_priv 가 설정되어 있지 않은 경우, warning 을 출력하도록 되었습니다.

* 기존 유저에 새롭게 FILE grant 을 부여했는 데도 불구하고, 동작하지 않는 경우는 세션 재접속 후 시도해보시길 바랍니다.


12. generated column

실제 column 값을 계산한 결과를 격납하는 전용 column 을 작성할 수 있습니다.

- STORED 타입은 ALTER TABLE 실행 시 값이 계산되어 디스크에 고정화 됩니다.
- VIRTUAL 타입은 SELECT 실행 시 계산됩니다(Default)
- 어느 타입이라도 secondary index 를 작성할 수 있으며, 디스크에 고정화 됩니다.
- 생성된 열에 NOT NULL, UNIQUE 제약을 걸 수 있습니다.
- column 으로 정의되기 때문에, SELECT * 이랑 INSERT INTO ... VALUES 에 주의가 필요합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# Covering index
mysql> ALTER TABLE t2 ADD v_lang varchar(16) AS (CONCAT('OK-', lang)), ADD KEY(v_lang);
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> EXPLAIN SELECT v_lang, COUNT(*FROM t2 GROUP BY v_lang;
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type  | possible_keys | key    | key_len | ref  | rows | filtered | Extra       |
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | t2    | NULL       | index | v_lang        | v_lang | 19      | NULL |   10 |   100.00 | Using index |
+----+-------------+-------+------------+-------+---------------+--------+---------+------+------+----------+-------------+
1 row in set1 warning (0.01 sec)
 
# 범위 검색으로 ORDER BY 까지 KEY가 사용되지 않을 때, 활용법
mysql> SHOW INDEX FROM t2;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| t2    |          0 | PRIMARY  |            1 | id          | A         |          17 |     NULL | NULL   |      | BTREE      |         |               |
| t2    |          1 | age      |            1 | age         | A         |           8 |     NULL | NULL   | YES  | BTREE      |         |               |
| t2    |          1 | age      |            2 | created_at  | A         |          17 |     NULL | NULL   | YES  | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
 
mysql> EXPLAIN SELECT * FROM t2 WHERE age < 20 ORDER BY created_at;
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------------+
| id | select_type | table | partitions | type  | possible_keys | key  | key_len | ref  | rows | filtered | Extra                                 |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------------+
|  1 | SIMPLE      | t2    | NULL       | range | age           | age  | 2       | NULL |    2 |   100.00 | Using index condition; Using filesort |
+----+-------------+-------+------------+-------+---------------+------+---------+------+------+----------+---------------------------------------+
1 row in set1 warning (0.00 sec)
 
mysql> ALTER TABLE t2 ADD is_adult tinyint AS (IF(age < 2010)), ADD KEY (is_adult, created_at);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> EXPLAIN SELECT * FROM t2 WHERE is_adult = 1 ORDER BY created_at DESC;
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key      | key_len | ref   | rows | filtered | Extra       |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+
|  1 | SIMPLE      | t2    | NULL       | ref  | is_adult      | is_adult | 2       | const |    2 |   100.00 | Using where |
+----+-------------+-------+------------+------+---------------+----------+---------+-------+------+----------+-------------+
1 row in set1 warning (0.01 sec)
 
# CHECK 제약으로 응용
mysql> ALTER TABLE t2 ADD age_check tinyint AS (IF(age > 100 , null1)) NOT NULL;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> INSERT INTO t2 (lang, age) VALUES ('test'101);
ERROR 1048 (23000): Column 'age_check' cannot be null
 
 
cs

generated column 을 CHECK 제약으로 사용할 때의 주의사항

- VIRTUAL 타입이고 secondary index 가 없는 경우
기존의 데이터가 CHECK 제약을 위반해도 ALTER TABLE 은 성공합니다. 그 이후에 발생하는 갱신에 관해서는 에러를 반환하게 됩니다.
- STORED 타입 또는 secondary index 가 있는 경우
기존의 데이터가 CHECK 제약을 위반하면 ALTER TABLE 가 에러납니다.

1
2
3
4
5
6
7
mysql> ALTER TABLE t2 ADD age_check tinyint AS (IF(age > 100 , null1)) STORED NOT NULL;
ERROR 1048 (23000): Column 'age_check' cannot be null
mysql> ALTER TABLE t2 ADD age_check tinyint AS (IF(age > 100 , null1)) NOT NULLADD KEY (age_check);
ERROR 1048 (23000): Column 'age_check' cannot be null
mysql> ALTER TABLE t2 ADD age_check tinyint AS (IF(age > 100 , null1)) NOT NULL;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
cs

# 참고자료
https://www.slideshare.net/yoku0825/mysql-57-53449734

2021년 2월 10일 수요일

MySQL 8.0.16 미만에서 동작하는 TempTable storage engine에 대하여

MySQL 8.0.13에서 메모리 사용률이 60% 미만인 데, 대량의 임시테이블 사용 시 가상 메모리 사용률이 급격히 올라가는 경우가 있었다.
MySQL 공식문서를 찾아보았지만, 정보가 부실하여 소스코드를 해석하면서 알아보기로 하였다.

TempTable 이란?
TempTable 스토리지 엔진에 대한 설명은 아래의 글을 참고
https://jongguheo.blogspot.com/2020/11/temptable-storage-engine.html

버전에 따른 차이
동작의 차이는 아래와 같은 기준으로 나뉘어져 있다.
  1. MySQL 8.0.15 이하
  2. MySQL 8.0.16 이상
  3. MySQL 8.0.23 이상
MySQL 8.0.15 이하
해당 버전에서는 "temptable_use_mmap" 라고 하는 시스템 변수가 존재하지 않는다.
변수의 의미는 설정 해놓은 "temptable_max_ram"를 초과 했을 때 메모리 맵 파일 or 디스크 임시 테이블 사용여부를 결정한다.
(temptable_max_ram의 기본 값은 1G)

temptable_use_mmap가 존재하지 않으므로 temptable_max_ram 초과 시 메모리 맵 파일을 사용하게 된다. 이로 인해 임시 테이블을 사용하는 SQL이 많은 경우 가상메모리 사용률이 높아질 수 있다.

소스코드를 해석해보면..
// 설정해놓은 temptable_max_ram 보다 많은 메모리를 임시 테이블에서 사용하고 있을 경우 True
// 작은 경우 False
if (bytes_allocated_in_ram > temptable_max_ram) { 
    t = Mem_type::DISK;
  } else {
    const size_t new_bytes_allocated_in_ram =
        bytes_allocated_in_ram.fetch_add(bytes) + bytes;

    DBUG_ASSERT(new_bytes_allocated_in_ram - bytes <=
                std::numeric_limits<decltype(bytes)>::max() - bytes);

    // 현재 임시 테이블이 사용하고 있는 메모리와 처리하려고 하는 데이터량을 합산
// 합산 한 후에 temptable_max_ram와 비교
// temptable_max_ram 보다 작은 경우 True. 큰 경우 False if (new_bytes_allocated_in_ram <= temptable_max_ram) { t = Mem_type::RAM; } else { t = Mem_type::DISK; bytes_allocated_in_ram.fetch_sub(bytes); } } void *ptr;
  // 아래의 조건문을 MySQL 8.0.16에서 유심히 보도록 하자.
  if (t == Mem_type::RAM) {
    ptr = mem_fetch_from_ram(bytes);
    if (ptr == nullptr) {
      throw Result::OUT_OF_MEM;
    }
  } else {
    DBUG_ASSERT(t == Mem_type::DISK);
    ptr = mem_fetch_from_disk(bytes);
    if (ptr == nullptr) {
      throw Result::RECORD_FILE_FULL;
    }
  }
https://github.com/mysql/mysql-server/blob/mysql-8.0.15/storage/temptable/include/temptable/allocator.h#L636

MySQL 8.0.16 이상
temptable_use_mmap이 추가되어 메모리 맵 파일을 사용할 지, 디스크 임시 테이블을 사용할 지 컨트롤할 수 있게 되었다.
if (t == Mem_type::RAM) {
    ptr = mem_fetch_from_ram(bytes);
    if (ptr == nullptr) {
      throw Result::OUT_OF_MEM;
    }
  } else {
    DBUG_ASSERT(t == Mem_type::DISK);
    // temptable_use_mmap가 OFF로 설정되어 있는 경우 True
    // 즉, 디스크 임시 테이블을 사용하도록 한다.
    if (!temptable_use_mmap) {
      throw Result::RECORD_FILE_FULL;
    }
    ptr = mem_fetch_from_disk(bytes);
    if (ptr == nullptr) {
      throw Result::RECORD_FILE_FULL;
    }
  }
https://github.com/mysql/mysql-server/blob/mysql-8.0.16/storage/temptable/include/temptable/allocator.h#L655

MySQL 8.0.23 이상
해당 버전에서는 "temptable_max_mmap" 라고 하는 시스템 변수가 추가되었다.
변수의 의미는 temptable_use_mmap가 ON인 경우 메모리 맵 파일이 사용할 수 있는 맥시멈을 나타낸다.
해당 수치를 초과하는 경우는 디스크 임시 테이블을 사용하게 된다.
(temptable_max_mmap의 기본 값은 1G)

# Refer
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
https://dev.mysql.com/doc/refman/8.0/en/internal-temporary-tables.html

2021년 1월 30일 토요일

MySQL 8.0.21 소스 컴파일로 설치하기 / CentOS 7

MySQL 8.0.21 소스를 컴파일 하여 설치하는 방법에 대해 알아보자.

설치 환경
CentOS 7.6(64 bit)

선행 작업
1. 유저 및 그룹 생성

# 그룹 생성
groupadd mysql

# 유저 생성
# options means
# -M: 홈 디렉토리를 생성하지 않는다.
# -s: 해당 유저로 로그인 할 수 없게 한다.
useradd -M -s /sbin/nologin -g mysql mysql

2. 패키지 설치

2-1. boost 1.72.0

# MySQL 8.0.21 컴파일 하기 위해서 boost 1.72.0 버전이 필요하다.
cd /opt & wget https://dl.bintray.com/boostorg/release/1.72.0/source/boost_1_72_0.tar.gz
tar -xvf boost_1_72_0.tar.gz


2-2. gcc

# MySQL 8.0.21 컴파일 하기 위해서 gcc 5.3 이상의 버전이 필요하다.
# CentOS 7에서는 gcc 7을 간단하게 설치할 수 있다. yum -y install centos-release-scl make yum -y install devtoolset-7-gcc* scl enable devtoolset-7 bash

2-3. cmake 3.15.1
# MySQL 8.0.21 컴파일 하기 위해서 cmake 3.15.1 이상의 버전이 필요하다.
# cmake 설치하기 위해서는 make 패키지가 필요하다.
yum install -y make

cd /opt & wget https://github.com/Kitware/CMake/releases/download/v3.15.1/cmake-3.15.1.tar.gz
tar xvfz cmake-3.15.1.tar.gz
cd cmake-3.15.1
./bootstrap 
make
make install 


2-4. etc

# 그 외에 필요한 패키지 설치
yum install -y ncurses-devel openssl-devel cyrus-sasl-plain openldap-devel libtirpc-devel bison git


MySQL 설치

# MySQL 8.0.21 다운로드
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.21.tar.gz
tar -xvf mysql-8.0.21.tar.gz
cd mysql-8.0.21
# cmake 실행 cmake \ -DCMAKE_INSTALL_PREFIX=/mysql\ -DMYSQL_DATADIR=/mysql/data \ -DSYSCONFDIR=/mysql/etc \ -DINSTALL_SBINDIR=/mysql/bin \ -DINSTALL_BINDIR=/mysql/bin \ -DINSTALL_SCRIPTDIR=/mysql/script \ -DMYSQL_USER=mysql \ -DMYSQL_GROUP=mysql \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_PARTITION_STORAGE_ENGINE=1 \ -DWITH_FEDERATED_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_MEMORY_STORAGE_ENGINE=1 \ -DWITH_READLINE=1 \ -DMYSQL_UNIX_ADDR=/mysql/tmp/mysql.sock \ -DMYSOL_TCP_PORT=3306 \ -DENABLED_LOCAL_INFILE=1 \ -DENABLE_DOWNLOADS=1 \ -DWITH_EXTRA_CHARSETS=all \ -DDEFAULT_CHARSET=utf8mb4 \ -DDEFAULT_COLLATION=utf8mb4_general_ci \ -DWITH_DEBUG=0 \ -DMYSQL_MAINTAINER_MODE=0 \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/opt/boost_1_72_0 \ -DCMAKE_C_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/gcc \ -DCMAKE_CXX_COMPILER=/opt/rh/devtoolset-7/root/usr/bin/g++ \ -DFORCE_INSOURCE_BUILD=1 # 빌드 및 설치 # 빌드 하는 시간이 꽤 오래 걸린다. 2코어, 4G메모리 가상 서버에서 9시간 정도 걸렸다. make make install # data directory 초기화 /mysql/bin/mysqld --initialize --basedir=/mysql--datadir=/mysql/data --user=mysql # MySQL 기동 /mysql/bin/mysqld_safe --user=mysql & # MySQL 접속 및 버전 확인 /mysql/bin/mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.21 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql>


# Refer
https://dev.mysql.com/doc/mysql-sourcebuild-excerpt/8.0/en/source-installation.html

결혼이민비자 신청방법(F-6-1 국민의 배우자)

 제가 일본인 여자친구와 결혼 후, 한국에 귀국하기 위해 신청한 결혼이민비자에 대하여 작성해보도록 하겠습니다. 필자는 일본에서 근무하고 있었으며, 한국에서의 소득은 없었습니다. 결혼이민비자를 신청한 날짜는 2021-04-21 이며, 사증이 발급된 날짜...