ssuperjun 님의 블로그
[과제 3-2] NHN Cloud 인스턴스에서 MySQL 설치 - 압축파일 이용 본문
요구사항
- 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
테스트 사진




'인턴' 카테고리의 다른 글
| AWS 교육(노션 백업) (0) | 2026.01.11 |
|---|---|
| [과제 4-2] MySQL 자동 설치 스크립트 생성 - 압축파일 이용 (1) | 2026.01.08 |
| [과제 4-1] MySQL 자동 설치 스크립트 생성 - apt 레포지터리 이용 (0) | 2026.01.07 |
| [과제 3-1] NHN Cloud 인스턴스에서 MySQL 설치 - apt 레포지터리 이용 (0) | 2026.01.06 |
| [과제 2] 사칙연산 계산기 만들기 (0) | 2026.01.06 |