Notice
Recent Posts
Recent Comments
Link
«   2026/06   »
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
Tags
more
Archives
Today
Total
관리 메뉴

ssuperjun 님의 블로그

[과제 3-2] NHN Cloud 인스턴스에서 MySQL 설치 - 압축파일 이용 본문

인턴

[과제 3-2] NHN Cloud 인스턴스에서 MySQL 설치 - 압축파일 이용

ssuperjun 2026. 1. 8. 16:33

요구사항

  • NHN Cloud를 이용하여 환경 셋팅
  • MySQL 설치
    • 압축파일을 이용하여 설치 (데이터 경로 분리)
  • 설치 후 테스트한 화면 캡쳐
    • user 생성, 권한 부여
    • db 생성, 테이블 생성
    • 데이터 입출력
    • mysql config 내용 확인

설치할 때 최대한 공식 문서를 참고

 

*데이터 경로 분리 이유: ssd 마운트된 data 쓰고 싶어서, data mysql 분리

압축파일을 이용하여 설치 (데이터 경로 분리)

새로운 압축파일로 재시도

[문제]

게시글 하단의 Deprecated 부분에선 공식 홈페이지에서 OS = Ubuntu Linux를 선택해 다운로드했는데, 이는 apt + dpkg로 설치되는 파일들을 tar로 묶어놓은 걸 다운받은 것이다. 이 경우 datadir가 기본 디렉토리에서 바뀌지 않는 등 설치 구조가 자유롭지 못하다.

[해결책]

그래서 tar 파일 다운로드 시 OS = Linux - Generic을 선택해야 하며, 이는 "MySQL 바이너리"를 받아 수동 설치하는 개념이다. 이를 통해 디렉토리를 비롯해 사용자 임의대로 DB를 구축할 수 있다.

[기대 효과]

새로운 압축파일로 과제를 재시도해, 기존에 datadir가 기본 디렉토리에서 바뀌지 않는 문제가 해결될 것으로 기대된다.

 

다운로드 사이트

https://dev.mysql.com/downloads/mysql/

https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.17-x86_64-minimal.tar.xz

 

Version: 8.0.44

OS: Linux - Generic

OS Version: Linux - Generic (glibc 2.17) (x86, 64-bit)

    glibc 2.28 대신 더 오래되고 안정적인 2.17 선택

Compressed TAR Archive, Minimal Install 다운로드

 

인스턴스 접속

ssh -i key.pem ubuntu@ip


MySQL 바이너리 설치

cd /usr/local

sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.17-x86_64-minimal.tar.xz

sudo tar -xvf mysql-8.0.44-linux-glibc2.17-x86_64-minimal.tar.xz

디렉토리 이름 변경

sudo mv mysql-8.0.44-linux-glibc2.17-x86_64-minimal mysql

 

 

mysql 전용 사용자 생성

시스템 계정(로그인용 계정 아님)을 생성하여, 오직 mysql 프로세스만 /usr/local/mysql에 위치한 mysql 바이너리 파일을 정상적으로 읽고 쓸 수 있도록 함

목적: root 유저의 서비스 권한을 최소화하여 보안을 강화하고, 로그인과 시스템 접근을 차단하며, 파일 소유권과 프로세스 권한을 명확히 분리하기 위함

sudo useradd -r -s /bin/false mysql
sudo chown -R mysql:mysql /usr/local/mysql

 

mysqld.cnf 작성

sudo mkdir -p /etc/mysql
sudo vi /etc/mysql/mysqld.cnf
[mysqld]

user=mysql


basedir=/usr/local/mysql
datadir=/usr/local/data
socket=/usr/local/data/mysql.sock
pid-file=/usr/local/data/mysqld.pid

skip-name-resolve

# root 비밀번호 없이 접속
skip-grant-tables

# 네트워크
port=3306
bind-address=0.0.0.0

 

데이터베이스 초기화

sudo /usr/local/mysql/bin/mysqld \
  --defaults-file=/etc/mysql/mysqld.cnf \
  --initialize-insecure \
  --user=mysql

 

권한 설정

sudo chown -R mysql:mysql /usr/local/data

 

systemd 서비스 파일 생성

systemd 서비스 파일: MySQL을 systemd(init) 서비스로 등록하여 부팅 시 자동 실행되도록 하고, 실패 시 재시작하며, mysqld를 명시적 경로와 설정 파일로 실행하도록 정의

sudo vi /etc/systemd/system/mysql.service
[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld \
  --defaults-file=/etc/mysql/mysqld.cnf

LimitNOFILE=65535
Restart=on-failure

[Install]
WantedBy=multi-user.target

 

MySQL 기동

sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql

 

확인

sudo systemctl status mysql

 

root 접속 테스트

/usr/local/mysql/bin/mysql -u root

 

접속이 안돼서, 호환 라이브러리 설치

sudo apt update

sudo apt install libncurses5 -y

 

root 접속 완료

sudo /usr/local/mysql/bin/mysql -u root --socket=/usr/local/data/mysql.sock

 

--socket처럼 일일이 소켓을 지정하지 않도록 만들기

sudo vi /etc/mysql/my.cnf
[client]
socket=/usr/local/data/mysql.sock

 

이후 root 접속 완료

sudo /usr/local/mysql/bin/mysql -u root

 

sudo가 없이도 접속 가능하도록 만들기

whoami

mysql 그룹에 사용자(whoami를 통해 출력된 ubuntu) 추가

sudo usermod -aG mysql ubuntu

logout

ssh 재접속

 

/usr/local/mysql/bin/mysql -u root

 

mysql -u root 명령어로 root 접속하기 위해, PATH 설정

echo 'export PATH=/usr/local/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
source /etc/profile

mysql -u root

 

프롬프트

클라우드 인스턴스 상에서 mysql을 설치한다 가정하고, 압축파일을 이용해 mysql을 설치하는 방법을 알려줘. 

[조건] 
1. mysqld.cnf에서 기본 디렉토리 변경만으로도 mkdir을 하지 않아도 data 디렉토리가 자동적으로 생성된다면, 굳이 mysql 설치 전에 data 디렉토리를 생성할 필요 없음
2. root 유저 접속 시, 비밀번호 없이 mysql -u root 명령만으로 mysql에 접속 가능해야 한다. sudo mysql로 접속해 ALTER USER로 'root'@'localhost'의 비밀번호를 수정하는 대신, config 파일 수정만으로 유저 비밀번호 수정이 가능하다면 config 파일을 수정하도록 해야 한다.

추가 요구사항

26.1.13(화) 추가

 

1. 기본 datadir를 /home/ubuntu로 설정해서, mysql 디렉토리는 /home/ubuntu/mysql에, data 디렉토리는 /home/ubuntu/data에 위치시키기

2. mysqld.cnf 작성 시 skip-grant-tables를 작성하면 보안에 취약하기에, skip-grant-tables를 작성하지 않고도 root 유저 접속 시, 비밀번호 없이 mysql -u root 명령만으로 mysql에 접속 가능하게 만들기

 

UNIX Socket 인증 방식

vs

root 계정에 빈 비밀번호 설정하는 방식

 

두 방식 모두 비밀번호 없이 mysql -u root 명령만으로 mysql에 접속 가능하다.

 

Unix Socket 인증 방식은

ALTER USER 'root'@'localhost' IDENTIFIED WITH auth_socket; 또는

ALTER USER 'root'@'localhost' IDENTIFIED WITH unix_socket;

명령어로  MySQL root 계정 인증 플러그인을 변경해

MySQL root 계정이 리눅스 root 사용자와 1:1 매핑되고, OS 레벨에서 이미 인증이 끝났기 때문에 MySQL 비밀번호가 필요 없다.

 

하지만, Unix Socket 인증 방식은 root OS 계정만 mysql -u root 명령어를 통해 접속이 가능하다.

즉, ubuntu$ mysql -u root 명령어를 실행하려는 현 상황에선 root$ mysql 명령어로만 접속에 성공하는 Unix Socket 인증 방식을 사용할 수 없다.

 

물론, root 계정에 빈 비밀번호 설정하는 방식은 Unix Socket 인증 방식에 비해 보안적으로 뛰어나지 않지만

root@localhost만 존재하고(root@% 처럼 외부에서 접근하는 건 허용하지 않음),

이 root@localhost만 /home/ubuntu/data/mysql.sock socket 파일 통해 접속할 수 있고,

3306 포트를 서버 내부만 허용하는 방화벽을 사용했기 때문에

보안 상 문제가 일어나지 않을 것이다.

 

명령어 모음

// 인스턴스 접속
ssh -i key.pem ubuntu@ip

// 필수 라이브러리 설치
sudo apt update
sudo apt install libncurses5 -y

// MySQL 바이너리 설치
cd /home/ubuntu

sudo wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.44-linux-glibc2.17-x86_64-minimal.tar.xz

sudo tar -xvf mysql-8.0.44-linux-glibc2.17-x86_64-minimal.tar.xz

sudo mv mysql-8.0.44-linux-glibc2.17-x86_64-minimal mysql

// mysql 전용 사용자 생성
sudo useradd -r -s /bin/false mysql
sudo chown -R mysql:mysql /home/ubuntu/mysql

// 데이터 디렉토리 생성(자동 생성 시 mysql 유저가 부모 디렉토리 접근 권한이 없음)
sudo mkdir /home/ubuntu/data
sudo chown mysql:mysql /home/ubuntu/data
sudo chmod 750 /home/ubuntu/data
sudo chmod o+x /home/ubuntu

// mysqld.cnf 작성
sudo mkdir -p /etc/mysql
sudo vi /etc/mysql/mysqld.cnf

// mysql.cnf
[mysqld]
user=mysql

basedir=/home/ubuntu/mysql
datadir=/home/ubuntu/data

socket=/home/ubuntu/data/mysql.sock
pid-file=/home/ubuntu/data/mysqld.pid

skip-name-resolve

# 네트워크
port=3306
bind-address=0.0.0.0

// 데이터베이스 초기화
sudo /home/ubuntu/mysql/bin/mysqld \
  --defaults-file=/etc/mysql/mysqld.cnf \
  --initialize-insecure \
  --user=mysql

sudo chown -R mysql:mysql /home/ubuntu/data
  
// systemd 서비스 파일 생성
sudo vi /etc/systemd/system/mysql.service

[Unit]
Description=MySQL Server
After=network.target

[Service]
Type=simple
User=mysql
Group=mysql

ExecStart=/home/ubuntu/mysql/bin/mysqld \
  --defaults-file=/etc/mysql/mysqld.cnf

LimitNOFILE=65535
Restart=on-failure

[Install]
WantedBy=multi-user.target

// MySQL 기동
sudo systemctl daemon-reload
sudo systemctl enable mysql
sudo systemctl start mysql

// 확인
sudo systemctl status mysql

// socket 자동 인식 설정 (mysql -u root 시 --socket 제거)
sudo vi /etc/mysql/my.cnf

[client]
socket=/home/ubuntu/data/mysql.sock

// sudo 없이 mysql 접속 가능하게 설정
whoami
sudo usermod -aG mysql ubuntu
logout

// 재접속
ssh -i key.pem ubuntu@ip

// PATH 설정 (mysql 명령어 바로 사용)
echo 'export PATH=/home/ubuntu/mysql/bin:$PATH' | sudo tee /etc/profile.d/mysql.sh
source /etc/profile

// 접속 확인
mysql -u root



Deprecated

다운로드 사이트

https://dev.mysql.com/downloads/mysql/

https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-server_8.0.44-1ubuntu22.04_amd64.deb-bundle.tar

 

Version: 8.0.44

OS: Ubuntu Linux

OS Version: All (  옵션은 22.04, 24.04)

인스턴스 접속

ssh -i key.pem ubuntu@ip

mysql 디렉토리 생성

mkdir ~/mysql
cd mysql

 

.tar 번들 파일 다운로드, 압축 해제

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-server_8.0.44-1ubuntu22.04_amd64.deb-bundle.tar

// 압축 해제
tar -xvf mysql-server_8.0.44-1ubuntu22.04_amd64.deb-bundle.tar

 

필수 라이브러리, 패키지 설치

// 필수 라이브러리 설치
// 패키지 목록 갱신
sudo apt update
// 시스템 라이브러리 설치(MySQL(InnoDB)이 디스크를 비동기로 읽고 쓰도록, 멀티코어/멀티CPU 환경에서 메모리 접근 최적화하도록)
sudo apt install -y libaio1 libnuma1

// 필요한 패키지 설치
sudo dpkg -i mysql-common_*.deb
sudo dpkg -i libmysqlclient21_*.deb
sudo dpkg -i mysql-community-client-core_*.deb
sudo dpkg -i mysql-community-client-plugins_*.deb
sudo dpkg -i mysql-community-client_*.deb
sudo dpkg -i mysql-client_*.deb
sudo dpkg -i mysql-community-server-core_*.deb
sudo dpkg -i mysql-community-server_*.deb
sudo dpkg -i mysql-server_*.deb
// 의존성 해결(Ubuntu 기본 패키지)
sudo apt --fix-broken install -y

// (선택사항)
sudo dpkg -i libmysqlclient-dev_8.0.44-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-server-debug_8.0.44-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-test_8.0.44-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-community-test-debug_8.0.44-1ubuntu22.04_amd64.deb
sudo dpkg -i mysql-testsuite_8.0.44-1ubuntu22.04_amd64.deb

기본 데이터 디렉토리 변경

MySQL 설치 후 기본 데이터 디렉토리는 /var/lib/mysql 이다.

현재 datadir 확인용 명령어: sudo mysql -e "SHOW VARIABLES LIKE 'datadir';"

mysql 설치 직후이므로 기존 데이터 복사(sudo rsync -av /var/lib/mysql/ /home/ubuntu/data/) 생략

sudo systemctl stop mysql
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
	여기서 datadir를 /var/lib/mysql에서 /home/ubuntu/data로 수정

Ubuntu AppArmor 설정 수정

mysqld.cnf 수정만으론 기본 데이터 디렉토리 변경이 안됨.

테스트용으로 db와 테이블을 생성했지만, 여전히 /var/lib/mysql에 저장됐음.

그래서 Ubuntu AppArmor 설정 수정 필요

sudo vi /etc/apparmor.d/usr.sbin.mysqld
파일 마지막(중괄호 안쪽)에 아래줄을 추가
# Allow custom MySQL datadir
  /home/ r,
  /home/ubuntu/ r,
  /home/ubuntu/data/ r,
  /home/ubuntu/data/** rwk,

변경사항 적용
sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

데이터 디렉토리 생성, 권한 부여

mkdir /home/ubuntu/data
sudo chown mysql:mysql /home/ubuntu/data
sudo chmod 750 /home/ubuntu/data

// /home/ubuntu에 traverse 권한 부여
sudo chmod o+x /home/ubuntu

MySQL 실행 및 접속 테스트

sudo systemctl start mysql
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
FLUSH PRIVILEGES;
SELECT user, host, plugin FROM mysql.user;
exit

mysql -u root

MySQL 데이터 저장한  data 디렉토리에 저장됐는지 확인

mysql -u root
CREATE DATABASE TEST_DB;
USE TEST_DB;
CREATE TABLE EMPLOYEES(
	EMP_NO VARCHAR(255) PRIMARY KEY,
	EMP_NAME VARCHAR(100) NOT NULL,
	DEPT_ID VARCHAR(100) NOT NULL,
	POSITION VARCHAR(100) NOT NULL,
	EMAIL VARCHAR(255) NOT NULL,
	COMP_TEL VARCHAR(50) NOT NULL,
	HIRE_DATE DATE NOT NULL,
	SAL INT NOT NULL
);

INSERT INTO EMPLOYEES VALUES
('2019003', '한동희', 'D0005', '팀장', 'donghee_han@grep.com', '031-8000-1122', '2019-03-01', 57000000),
('2020032', '한명지', 'D0005', '팀원', 'mungji_han@grep.com', '031-8000-1123', '2020-03-01', 52000000),
('2022003', '김보라', 'D0005', '팀원', 'bora_kim@grep.com', '031-8000-1126', '2022-03-01', 47000000),
('2018005', '이재정', 'D0006', '팀장', 'jaejung_lee@grep.com', '031-8000-1127', '2018-03-01', 60000000),
('2019032', '윤성희', 'D0006', '팀원', 'sunghee_yoon@grep.com', '031-8000-1128', '2019-03-01', 57000000),
('2020009', '송영섭', 'D0006', '팀원', 'yungseop_song@grep.com', '031-8000-1130', '2020-03-01', 51000000),
('2021006', '이성주', 'D0006', '팀원', 'sungju_lee@grep.com', '031-8000-1131', '2021-03-01', 49000000),
('2018004', '이주리', 'D0007', '팀장', 'joori_lee@grep.com', '031-8000-1132', '2018-03-01', 61000000),
('2020012', '김사랑', 'D0007', '팀원', 'sarang_kim@grep.com', '031-8000-1133', '2020-03-01', 54000000),
('2021018', '김히라', 'D0007', '팀원', 'heera_kim@grep.com', '031-8000-1136', '2021-03-01', 49000000);

SHOW TABLES;
SELECT * FROM EMPLOYEES;
EXIT

// TEST_DB 저장 여부 확인
sudo ls data

테스트 사진