리눅스 환경 기반 MySQL 8.0 설치 과정과 기본 쿼리 활용법

환경 준비 및 저장소 구성

리눅스 시스템, 특히 CentOS 또는 RHEL 계열 OS 에서 최신 버전의 MySQL 8.0 을 배포하기 위해서는 먼저 공식 저장소를 등록해야 합니다. Oracle 이 제공하는 패키지를 직접 설치하는 방식보다 yum 레포지토리를 활용하는 것이 업데이트 관리를 용이하게 합니다.

먼저 해당 아키텍처에 맞는 RPM 파일 다운로드 후 인스톨을 진행합니다. 예시는 CentOS 7 환경 기준입니다.

sudo yum install mysql80-community-release-el7-9.noarch.rpm

저장소가 정상적으로 추가되었는지 확인하려면 다음 명령어로 리스트를 조회할 수 있습니다.

sudo yum repolist | grep mysql

출력 결과 mysql80-community/x86_64 항목이 활성화되어 있어야 서버 설치 패키지를 가져올 수 있습니다.

서버 패키지 설치 및 서비스 시작

저장소 등록이 완료되면 커뮤니티 에디션을 설치합니다. Fedora 등 dnf 를 사용하는 시스템일 경우 yum 대신 dnf 명령어를 사용합니다.

sudo yum install mysql-community-server

패키지 설치가 종료되면 데몬 프로세스를 활성화하고 상태 모니터링을 설정합니다.

sudo systemctl start mysqld
sudo systemctl enable mysqld
sudo systemctl status mysqld

status 명령 실행 시 active (running) 상태를 확인하여 정상 부팅 여부를 체크합니다.

초기 루트 계정 비밀번호 설정

MySQL 8.0 은 보안 강화를 위해 초기 설치 시 생성된 임시 암호로만 접근 가능합니다. 영구적인 인증 정보를 변경하지 않는 한 연결이 차단됩니다.

임시 비밀번호는 로그 파일 내에 기록되어 있습니다. grep 명령을 통해 추출할 수 있습니다.

sudo grep 'temporary password' /var/log/mysqld.log

출력 내용 중 콜론 (:) 뒤에 표시된 문자열이 현재 사용 가능한 패스워드입니다. 이를 사용하여 터미널 접속을 시도합니다.

mysql -uroot -p

성공적으로 로그인하면 강력한 비밀번호로 변경 작업을 수행해야 합니다. MySQL 8 은 ALTER USER 구문을 표준으로 권장합니다.

ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewSecureP@ss!';

비밀번호 분실 시 복구 절차

인증 정보를 잊어버린 경우 권한 부여 테이블을 우회하여 진입하는 방법이 있습니다. 먼저 머신 코딩 설정 파일 /etc/my.cnf를 수정합니다.

[mysqld]
skip-grant-tables

추가 후 서비스를 재부팅합니다.

sudo systemctl restart mysqld

이제 인증 없이 루트로 접속 가능하며 사용자 비밀번호를 비우거나 새로 지정할 수 있습니다. 주의할 점은 다시 보안 모드로 돌아오기 위해 설정 파일을 원상복구하고 서비스를再起動해야 합니다.

# 설정 파일 내 skip-grant-tables 주석 처리
sudo systemctl restart mysqld

-- SQL 세션 내에서
ALTER USER 'root'@'localhost' IDENTIFIED BY 'ResettedPassword';

데이터베이스 객체 관리 기초

설치된 인스턴스에서 스키마 (Database) 와 테이블 생성 과정을 익혀보겠습니다. 운영체제의 대소문자 구분 여부에 따라 데이터베이스 명은 민감할 수 있으므로 일관된 카멜케이스나 스네이크케이스를 유지하는 것이 좋습니다.

스키마 생성 및 선택

COUNT(*) FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'blog_system'; -- 기존 존재 여부 간접 확인

CREATE DATABASE IF NOT EXISTS blog_system;
USE blog_system;

테이블 구조 정의

예시로 게시판을 위한 글 정보를 담을 테이블을 설계합니다. 필드 타입과 제약조건을 명확히 합니다.

CREATE TABLE posts (
    post_id INT AUTO_INCREMENT PRIMARY KEY,
    author_name VARCHAR(50) NOT NULL,
    category ENUM('notice', 'free', 'qa') DEFAULT 'free',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    view_count INT UNSIGNED DEFAULT 0
);

정의가 끝난 테이블의 메타데이터를 확인하려면 DESCRIBE 또는 줄임말 DESC 를 사용합니다.

DESC posts;

데이터 인서트 및 검증

초기 데이터를 투입합니다. 문자열 값은 큰따옴표 혹은 작은따옴표를 사용해야 하며, 날짜 형식은 정해진 포맷을 따릅니다.

INSERT INTO posts (author_name, category, view_count) VALUES
    ('AdminUser', 'notice', 100),
    ('DevTeam', 'free', 50),
    ('GuestWriter', 'qa', 25);

전체 데이터를 조회하여 입력이 정확했는지 점검합니다.

SELECT * FROM posts;

조회 문법 확장 및 조건부 필터링

단순 선택 외에도 정렬과 행 제한 기능을 결합하면 효율적인 데이터 탐색이 가능합니다. 예를 들어 조회수 상위 순위를 가져오는 경우는 비즈니스 로직에서 빈번하게 쓰입니다.

-- 조회수 기준으로 오름차림 정렬
SELECT author_name, view_count 
FROM posts 
ORDER BY view_count ASC;

-- 조회수 기준으로 내림차림 하되 상위 2 개만 제한
SELECT author_name, view_count 
FROM posts 
ORDER BY view_count DESC 
LIMIT 2;

복합 실습: 기업 인사 관리 모델

다양한 데이터 타입을 활용한 더 구체적인 예시를 제공합니다. 회사 직원 정보를 관리하는 staff_records 테이블을 생성하고 다양한 속성을 갖춥니다.

CREATE DATABASE corporate_db;
USE corporate_db;

CREATE TABLE staff_records (
    emp_id INT PRIMARY KEY AUTO_INCREMENT,
    full_name VARCHAR(60) NOT NULL,
    gender ENUM('male', 'female') NOT NULL DEFAULT 'male',
    join_date DATE NOT NULL,
    department_code TINYINT,
    position_title VARCHAR(30) NOT NULL,
    annual_salary DECIMAL(10, 2) NOT NULL
);

테스트 목적으로 샘플 데이터를 배치합니다. 결측치가 있는 경우도 고려하여 테스트합니다.

INSERT INTO staff_records (full_name, gender, join_date, department_code, position_title, annual_salary) VALUES
    ('KimMinSu', 'male', '2023-01-15', 101, 'Engineer', 45000000),
    ('ParkJiHyun', 'female', '2023-02-20', 102, 'Designer', 42000000),
    ('LeeSooHyun', 'male', '2023-03-10', 101, 'Manager', 60000000);

연봉 정보를 기준으로 데이터를 가공하여 출력해 봅니다.

SELECT full_name, position_title, annual_salary 
FROM staff_records 
WHERE department_code = 101 
ORDER BY annual_salary DESC;

태그: MySQL linux rpm yum SQL

5월 30일 01:36에 게시됨