환경 준비 및 저장소 구성
리눅스 시스템, 특히 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;