############################################
# 1. AWS CLI - RDS / Aurora 리소스 조회
############################################

# 현재 계정/리전에 있는 모든 RDS DB 인스턴스 정보를 조회
# 일반 RDS MySQL 인스턴스 정보 확인할 때 사용
aws rds describe-db-instances

# 특정 DB 인스턴스 하나만 조회
# mydbinstance 자리에 실제 DB 인스턴스 식별자 입력
aws rds describe-db-instances --db-instance-identifier mydbinstance

# 현재 계정/리전에 있는 모든 Aurora DB 클러스터 정보를 조회
# Aurora는 인스턴스보다 클러스터 중심으로 관리되는 경우가 많음
aws rds describe-db-clusters

# 특정 Aurora 클러스터 하나만 조회
# my-aurora-cluster 자리에 실제 클러스터 식별자 입력
aws rds describe-db-clusters --db-cluster-identifier my-aurora-cluster

# 특정 Aurora 클러스터의 상세 정보를 조회
# 결과에서 Writer Endpoint, Reader Endpoint 등을 확인 가능
aws rds describe-db-clusters --db-cluster-identifier my-aurora-cluster

# 모든 RDS 스냅샷 조회
# 일반 DB 인스턴스 백업 상태 확인할 때 사용
aws rds describe-db-snapshots

# 모든 Aurora 클러스터 스냅샷 조회
# Aurora는 클러스터 단위 스냅샷을 따로 봄
aws rds describe-db-cluster-snapshots

############################################
# 2. AWS CLI - RDS / Aurora 생성
############################################

# 일반 RDS MySQL DB 인스턴스 생성
# db.t3.micro 인스턴스 타입, mysql 엔진, 저장소 20GB로 생성
aws rds create-db-instance \\
  --db-instance-identifier mydbinstance \\
  --db-instance-class db.t3.micro \\
  --engine mysql \\
  --allocated-storage 20 \\
  --master-username admin \\
  --master-user-password 'MyPassword123!' \\
  --backup-retention-period 7 \\
  --publicly-accessible

# Aurora MySQL 클러스터 생성
# Aurora는 먼저 클러스터를 만든 뒤 그 안에 인스턴스를 붙이는 구조
aws rds create-db-cluster \\
  --db-cluster-identifier my-aurora-cluster \\
  --engine aurora-mysql \\
  --master-username admin \\
  --master-user-password 'MyPassword123!'

# Aurora 클러스터에 DB 인스턴스를 추가
# 위에서 만든 my-aurora-cluster 안에 실제 동작할 인스턴스를 생성
aws rds create-db-instance \\
  --db-instance-identifier aurora-instance-1 \\
  --db-instance-class db.t3.medium \\
  --engine aurora-mysql \\
  --db-cluster-identifier my-aurora-cluster

############################################
# 3. AWS CLI - 수정 / 재부팅 / 시작 / 중지
############################################

# RDS DB 인스턴스 타입 변경
# 예: db.t3.micro -> db.t3.small
# --apply-immediately 옵션으로 즉시 반영
aws rds modify-db-instance \\
  --db-instance-identifier mydbinstance \\
  --db-instance-class db.t3.small \\
  --apply-immediately

# Aurora 클러스터 설정 수정
# 백업 보관 기간을 7일로 설정
aws rds modify-db-cluster \\
  --db-cluster-identifier my-aurora-cluster \\
  --backup-retention-period 7 \\
  --apply-immediately

# 특정 RDS DB 인스턴스를 재부팅
# 엔진 재시작이 필요할 때 사용
aws rds reboot-db-instance --db-instance-identifier mydbinstance

# 일반 RDS DB 인스턴스 중지
# 비용 절감이나 일시 중단 목적
aws rds stop-db-instance --db-instance-identifier mydbinstance

# 일반 RDS DB 인스턴스 시작
# 중지된 인스턴스를 다시 실행
aws rds start-db-instance --db-instance-identifier mydbinstance

# Aurora 클러스터 중지
# Aurora는 인스턴스보다 클러스터 단위 중지/시작을 자주 사용
aws rds stop-db-cluster --db-cluster-identifier my-aurora-cluster

# Aurora 클러스터 시작
aws rds start-db-cluster --db-cluster-identifier my-aurora-cluster

############################################
# 4. AWS CLI - 삭제
############################################

# 일반 RDS 인스턴스를 최종 스냅샷 없이 바로 삭제
# 시험/실습에서는 빠르게 지울 때 자주 사용
aws rds delete-db-instance \\
  --db-instance-identifier mydbinstance \\
  --skip-final-snapshot

# 일반 RDS 인스턴스를 최종 스냅샷 남기고 삭제
# 삭제 전 마지막 백업을 보존하고 싶을 때 사용
aws rds delete-db-instance \\
  --db-instance-identifier mydbinstance \\
  --final-db-snapshot-identifier mydb-final-snapshot

# Aurora 인스턴스를 먼저 삭제
# Aurora는 보통 클러스터 안의 인스턴스를 먼저 지워야 함
aws rds delete-db-instance \\
  --db-instance-identifier aurora-instance-1 \\
  --skip-final-snapshot

# Aurora 클러스터를 최종 스냅샷 없이 삭제
# 클러스터 내 인스턴스를 먼저 정리한 뒤 실행하는 경우가 많음
aws rds delete-db-cluster \\
  --db-cluster-identifier my-aurora-cluster \\
  --skip-final-snapshot

############################################
# 5. AWS CLI - 로그 / 백업 / 복원
############################################

# 특정 DB 인스턴스의 로그 파일 목록 조회
# 에러 로그, 일반 로그 등 확인 가능
aws rds describe-db-log-files --db-instance-identifier mydbinstance

# 특정 로그 파일 내용을 일부 다운로드해서 확인
# mysql-error.log 파일의 내용을 읽어볼 때 사용
aws rds download-db-log-file-portion \\
  --db-instance-identifier mydbinstance \\
  --log-file-name error/mysql-error.log

# 일반 RDS 인스턴스의 수동 스냅샷 생성
aws rds create-db-snapshot \\
  --db-instance-identifier mydbinstance \\
  --db-snapshot-identifier mydb-snapshot-01

# Aurora 클러스터 수동 스냅샷 생성
aws rds create-db-cluster-snapshot \\
  --db-cluster-identifier my-aurora-cluster \\
  --db-cluster-snapshot-identifier mycluster-snapshot-01

# 일반 RDS 인스턴스를 스냅샷으로 복원
# 복원 결과로 새 DB 인스턴스가 생성됨
aws rds restore-db-instance-from-db-snapshot \\
  --db-instance-identifier mydb-restored \\
  --db-snapshot-identifier mydb-snapshot-01

# Aurora 클러스터를 클러스터 스냅샷으로 복원
# 복원 시 새 Aurora 클러스터가 생성됨
aws rds restore-db-cluster-from-snapshot \\
  --db-cluster-identifier restored-aurora-cluster \\
  --snapshot-identifier mycluster-snapshot-01 \\
  --engine aurora-mysql

############################################
# 6. MySQL 접속 명령어
############################################

# MySQL / Aurora MySQL 서버에 접속
# -h 는 엔드포인트 주소
# -P 는 포트 번호(기본 3306)
# -u 는 사용자명
# -p 는 비밀번호 입력 프롬프트 표시
mysql -h 엔드포인트 -P 3306 -u admin -p

# 특정 데이터베이스를 바로 선택해서 접속
mysql -h 엔드포인트 -P 3306 -u admin -p 데이터베이스명
############################################################
# 1. 데이터베이스(Database) 관련
############################################################

-- 현재 MySQL 서버 안에 존재하는 모든 데이터베이스 목록을 보여줌
-- 예: information_schema, mysql, performance_schema, appdb 등
SHOW DATABASES;

-- appdb 라는 이름의 새 데이터베이스를 생성
-- DATABASE 는 여러 테이블을 담는 큰 저장 공간이라고 생각하면 됨
CREATE DATABASE appdb;

-- 이미 있는 데이터베이스를 사용 대상으로 선택
-- 이 뒤에 만드는 테이블은 appdb 안에 생성됨
USE appdb;

-- appdb 데이터베이스를 삭제
-- 안에 들어있는 테이블, 데이터, 구조가 전부 사라짐
DROP DATABASE appdb;

############################################################
# 2. 테이블(Table) 생성과 구조 이해
############################################################

-- 현재 선택한 데이터베이스 안에 있는 테이블 목록 조회
SHOW TABLES;

-- users 라는 테이블 생성
CREATE TABLE users (
    -- id 컬럼
    -- INT: 정수형 숫자
    -- AUTO_INCREMENT: 새 행이 들어올 때 1씩 자동 증가
    -- PRIMARY KEY: 기본키, 각 행을 구분하는 대표값, 중복 불가, NULL 불가
    id INT AUTO_INCREMENT PRIMARY KEY,

    -- name 컬럼
    -- VARCHAR(100): 최대 100자의 가변 길이 문자열
    -- NOT NULL: 반드시 값이 있어야 함, 비워둘 수 없음
    name VARCHAR(100) NOT NULL,

    -- email 컬럼
    -- VARCHAR(100): 최대 100자 문자열
    -- UNIQUE: 중복 불가, 같은 이메일 두 번 저장 불가
    email VARCHAR(100) UNIQUE,

    -- age 컬럼
    -- INT: 나이를 숫자로 저장
    -- NULL 허용이므로 입력 안 해도 됨
    age INT,

    -- created_at 컬럼
    -- TIMESTAMP: 날짜와 시간을 저장
    -- DEFAULT CURRENT_TIMESTAMP:
    -- 값을 따로 안 넣으면 현재 시간이 자동 저장됨
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- users 테이블의 구조를 간단히 확인
-- Field, Type, Null, Key, Default, Extra 등을 보여줌
DESC users;

-- 같은 의미로 컬럼 구조를 확인하는 명령어
SHOW COLUMNS FROM users;

-- 테이블 생성문 자체를 다시 보고 싶을 때 사용
-- 어떤 컬럼, 어떤 옵션으로 만들었는지 그대로 확인 가능
SHOW CREATE TABLE users;

-- users 테이블 자체를 삭제
-- 구조 + 데이터 모두 삭제됨
DROP TABLE users;

-- users 테이블의 데이터만 전부 비움
-- 테이블 구조는 남겨둠
TRUNCATE TABLE users;

############################################################
# 3. INSERT - 데이터 넣기
############################################################

-- users 테이블의 name, email, age 컬럼에 값을 넣음
-- id는 AUTO_INCREMENT 이므로 자동 생성됨
-- created_at도 DEFAULT CURRENT_TIMESTAMP 이므로 자동 입력됨
INSERT INTO users (name, email, age)
VALUES ('Kim', '[email protected]', 20);

-- 여러 행을 한 번에 삽입
-- VALUES 뒤에 괄호를 여러 개 쓰면 됨
INSERT INTO users (name, email, age)
VALUES
('Lee', '[email protected]', 21),
('Park', '[email protected]', 22),
('Choi', '[email protected]', 23);

-- 일부 컬럼만 넣기
-- age를 안 넣으면 NULL로 들어갈 수 있음
INSERT INTO users (name, email)
VALUES ('Hong', '[email protected]');

-- 현재 날짜/시간을 직접 넣고 싶으면 NOW() 함수 사용 가능
INSERT INTO users (name, email, age, created_at)
VALUES ('Song', '[email protected]', 25, NOW());

############################################################
# 4. SELECT - 데이터 조회
############################################################

-- users 테이블의 모든 컬럼(*)과 모든 행을 조회
SELECT * FROM users;

-- users 테이블에서 id, name 컬럼만 조회
-- 필요한 컬럼만 가져오는 게 보통 더 좋음
SELECT id, name FROM users;

-- id가 1인 행만 조회
-- WHERE 는 조건 필터 역할
SELECT * FROM users
WHERE id = 1;

-- age가 20 이상인 사용자 조회
-- >= 는 크거나 같다
SELECT * FROM users
WHERE age >= 20;

-- age가 20 이상이고 25 이하인 사용자 조회
-- AND 는 두 조건을 모두 만족해야 함
SELECT * FROM users
WHERE age >= 20 AND age <= 25;

-- age가 20이거나 name이 Kim인 사용자 조회
-- OR 는 둘 중 하나만 만족해도 됨
SELECT * FROM users
WHERE age = 20 OR name = 'Kim';

-- name이 Kim이 아닌 사용자 조회
-- != 는 같지 않다
SELECT * FROM users
WHERE name != 'Kim';

-- email 값이 비어있는(NULL) 행 조회
-- NULL 비교는 = NULL 이 아니라 IS NULL 을 써야 함
SELECT * FROM users
WHERE age IS NULL;

-- age 값이 NULL이 아닌 행 조회
SELECT * FROM users
WHERE age IS NOT NULL;

-- 이름에 kim 이 포함된 사용자 조회
-- LIKE 는 패턴 검색
-- % 는 앞뒤 어떤 문자열이 와도 허용
SELECT * FROM users
WHERE name LIKE '%kim%';

-- 이름이 K로 시작하는 사용자 조회
SELECT * FROM users
WHERE name LIKE 'K%';

-- 이름이 m으로 끝나는 사용자 조회
SELECT * FROM users
WHERE name LIKE '%m';

-- age가 20, 22, 25 중 하나인 사용자 조회
-- 여러 OR를 줄여서 쓸 수 있음
SELECT * FROM users
WHERE age IN (20, 22, 25);

-- age가 20~25 범위 안인 사용자 조회
SELECT * FROM users
WHERE age BETWEEN 20 AND 25;

-- created_at 기준으로 최신순 정렬
-- DESC = 내림차순
SELECT * FROM users
ORDER BY created_at DESC;

-- age 기준 오름차순 정렬
-- ASC = 오름차순, 기본값이라 생략 가능
SELECT * FROM users
ORDER BY age ASC;

-- 5개만 조회
-- LIMIT 는 가져올 행 수 제한
SELECT * FROM users
LIMIT 5;

-- 0번째부터 5개 조회
SELECT * FROM users
LIMIT 0, 5;

-- 5번째 다음부터 5개 조회
-- 페이징할 때 자주 씀
SELECT * FROM users
LIMIT 5, 5;

-- 전체 행 개수 조회
-- COUNT(*) 는 행 수를 셈
SELECT COUNT(*) FROM users;

-- age 값이 있는 행만 개수 조회
-- COUNT(age)는 age가 NULL이 아닌 행만 셈
SELECT COUNT(age) FROM users;

-- age 평균값 조회
SELECT AVG(age) FROM users;

-- age 최솟값 조회
SELECT MIN(age) FROM users;

-- age 최댓값 조회
SELECT MAX(age) FROM users;

-- age 총합 조회
SELECT SUM(age) FROM users;

-- 중복 제거한 name만 조회
SELECT DISTINCT name FROM users;

############################################################
# 5. UPDATE - 데이터 수정
############################################################

-- id가 1인 사용자의 이름을 수정
-- WHERE가 없으면 전체 행이 바뀌므로 매우 주의
UPDATE users
SET name = 'Kim Minsu'
WHERE id = 1;

-- 여러 컬럼을 한 번에 수정
UPDATE users
SET name = 'Lee Minsu',
    email = '[email protected]',
    age = 30
WHERE id = 2;

-- 조건에 맞는 모든 행의 age를 1 증가
-- age = age + 1 은 기존 값에 1을 더한다는 뜻
UPDATE users
SET age = age + 1
WHERE age IS NOT NULL;

-- 이름에 kim이 들어가는 사용자의 email 도메인 변경 예시
UPDATE users
SET email = '[email protected]'
WHERE name LIKE '%kim%';

############################################################
# 6. DELETE - 데이터 삭제
############################################################

-- id가 1인 행만 삭제
DELETE FROM users
WHERE id = 1;

-- age가 NULL인 행 삭제
DELETE FROM users
WHERE age IS NULL;

-- 조건 없이 전체 행 삭제
-- 테이블 구조는 남고 데이터만 사라짐
DELETE FROM users;

############################################################
# 7. ALTER TABLE - 테이블 구조 변경
############################################################

-- users 테이블에 phone 컬럼 추가
-- VARCHAR(20): 전화번호 같은 짧은 문자열 저장
ALTER TABLE users
ADD COLUMN phone VARCHAR(20);

-- 컬럼 위치까지 지정 가능
-- email 컬럼 뒤에 address 컬럼 추가
ALTER TABLE users
ADD COLUMN address VARCHAR(255) AFTER email;

-- age 컬럼 타입을 BIGINT로 변경
-- MODIFY COLUMN 은 컬럼 속성을 변경할 때 사용
ALTER TABLE users
MODIFY COLUMN age BIGINT;

-- phone 컬럼 이름을 mobile 로 바꾸고 타입도 지정
-- CHANGE COLUMN 은 기존 컬럼명 + 새 컬럼명 둘 다 적어야 함
ALTER TABLE users
CHANGE COLUMN phone mobile VARCHAR(20);

-- mobile 컬럼 삭제
ALTER TABLE users
DROP COLUMN mobile;

-- 테이블 이름 변경
RENAME TABLE users TO members;

############################################################
# 8. INDEX - 인덱스
############################################################

-- name 컬럼에 인덱스를 생성
-- 검색 속도 향상 가능
-- 대신 INSERT/UPDATE/DELETE 시 약간의 부담이 늘어날 수 있음
CREATE INDEX idx_users_name ON users(name);

-- email 컬럼에 유니크 인덱스 생성
-- 중복을 허용하지 않음
CREATE UNIQUE INDEX idx_users_email ON users(email);

-- 테이블에 걸린 인덱스 목록 조회
SHOW INDEX FROM users;

-- 인덱스 삭제
DROP INDEX idx_users_name ON users;

############################################################
# 9. 사용자(User) / 권한(Privilege)
############################################################

-- MySQL 사용자 생성
-- 'appuser' : 사용자 이름
-- '@'       : 사용자명과 접속 호스트를 구분
-- '%'       : 어떤 호스트에서든 접속 가능
-- IDENTIFIED BY : 이 계정의 비밀번호를 설정
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppPass123!';

-- localhost 에서만 접속 가능한 사용자 생성
-- 즉 같은 서버 내부에서만 허용
CREATE USER 'localuser'@'localhost' IDENTIFIED BY 'LocalPass123!';

-- 특정 IP 에서만 접속 가능한 사용자 생성
CREATE USER 'ipuser'@'192.168.0.10' IDENTIFIED BY 'IpPass123!';

-- appdb 데이터베이스의 모든 테이블에 대해 모든 권한 부여
-- appdb.* 에서:
--   appdb = 데이터베이스명
--   *     = 그 DB 안의 모든 테이블
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';

-- 조회만 가능하게 권한 부여
GRANT SELECT ON appdb.* TO 'readonly'@'%' IDENTIFIED BY 'ReadOnly123!';

-- 조회/삽입/수정/삭제 권한만 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON appdb.* TO 'worker'@'%';

-- 특정 테이블만 조회 권한 부여
GRANT SELECT ON appdb.users TO 'viewer'@'%';

-- 권한 회수
REVOKE INSERT, UPDATE, DELETE ON appdb.* FROM 'worker'@'%';

-- 현재 사용자의 권한 확인
SHOW GRANTS FOR 'appuser'@'%';

-- 비밀번호 변경
ALTER USER 'appuser'@'%' IDENTIFIED BY 'NewPass123!';

-- 사용자 삭제
DROP USER 'appuser'@'%';

-- 권한 변경 사항 반영
-- 최신 버전에서는 꼭 필요하지 않은 경우도 있지만 시험에선 자주 같이 적음
FLUSH PRIVILEGES;

############################################################
# 10. 트랜잭션(Transaction)
############################################################

-- 트랜잭션 시작
-- 지금부터 여러 작업을 하나의 묶음으로 처리
START TRANSACTION;

-- 예시 작업 1
UPDATE users
SET age = age + 1
WHERE id = 1;

-- 예시 작업 2
UPDATE users
SET age = age - 1
WHERE id = 2;

-- 지금까지 작업을 확정
COMMIT;

-- 또는 문제가 생기면 전부 취소
ROLLBACK;

############################################################
# 11. JOIN - 여러 테이블 함께 조회
############################################################

-- orders 테이블 예시
CREATE TABLE orders (
    order_id INT AUTO_INCREMENT PRIMARY KEY,
    user_id INT,
    product_name VARCHAR(100),
    amount INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- users 와 orders 를 연결해서 조회
-- u, o 는 별칭(alias)
-- users.id 와 orders.user_id 가 같은 것끼리 연결
SELECT u.id, u.name, o.order_id, o.product_name, o.amount
FROM users u
JOIN orders o
ON u.id = o.user_id;

-- LEFT JOIN
-- users 는 모두 보여주고, 주문이 없는 사람도 포함
SELECT u.id, u.name, o.product_name
FROM users u
LEFT JOIN orders o
ON u.id = o.user_id;

############################################################
# 12. GROUP BY / HAVING - 그룹 집계
############################################################

-- age 별 사용자 수 조회
-- 같은 age끼리 묶어서 개수 계산
SELECT age, COUNT(*) AS cnt
FROM users
GROUP BY age;

-- 주문 테이블에서 사용자별 주문 수 조회
SELECT user_id, COUNT(*) AS order_count
FROM orders
GROUP BY user_id;

-- 사용자별 총 주문 금액 조회
SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id;

-- 그룹 결과에 조건 걸기
-- HAVING 은 GROUP BY 이후 집계 결과에 조건을 거는 것
SELECT user_id, SUM(amount) AS total_amount
FROM orders
GROUP BY user_id
HAVING SUM(amount) >= 10000;

############################################################
# 13. 서브쿼리(Subquery)
############################################################

-- 평균 나이보다 많은 사용자 조회
-- 괄호 안 SELECT가 먼저 실행되어 평균값을 구함
SELECT *
FROM users
WHERE age > (
    SELECT AVG(age)
    FROM users
);

-- 주문이 한 번이라도 있는 사용자 조회
SELECT *
FROM users
WHERE id IN (
    SELECT user_id
    FROM orders
);

############################################################
# 14. 문자열 / 날짜 / 숫자 함수
############################################################

-- 문자열 길이
SELECT name, LENGTH(name) FROM users;

-- 문자열 이어붙이기
SELECT CONCAT(name, ' / ', email) AS user_info FROM users;

-- 대문자 변환
SELECT UPPER(name) FROM users;

-- 소문자 변환
SELECT LOWER(name) FROM users;

-- 앞뒤 공백 제거
SELECT TRIM(name) FROM users;

-- 현재 날짜와 시간
SELECT NOW();

-- 현재 날짜만
SELECT CURDATE();

-- 현재 시간만
SELECT CURTIME();

-- created_at 에서 연도만 추출
SELECT YEAR(created_at) FROM users;

-- 오늘 이후 7일 날짜 계산
SELECT DATE_ADD(NOW(), INTERVAL 7 DAY);

-- 숫자 반올림
SELECT ROUND(123.456, 2);

############################################################
# 15. 조건문 / NULL 처리
############################################################

-- IF 함수
-- age가 20 이상이면 adult, 아니면 teen 표시
SELECT name,
       IF(age >= 20, 'adult', 'teen') AS age_group
FROM users;

-- IFNULL
-- age가 NULL이면 0으로 표시
SELECT name,
       IFNULL(age, 0) AS safe_age
FROM users;

-- CASE 문
SELECT name,
       CASE
           WHEN age >= 30 THEN '30대 이상'
           WHEN age >= 20 THEN '20대'
           ELSE '미성년/기타'
       END AS category
FROM users;

############################################################
# 16. 테이블/컬럼 정보 조회
############################################################

-- appdb 안의 모든 테이블 목록 조회
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'appdb';

-- appdb 안의 테이블별 컬럼 정보 조회
SELECT table_name, column_name, data_type, is_nullable, column_key
FROM information_schema.columns
WHERE table_schema = 'appdb';

-- 각 테이블 크기 조회(MB)
SELECT
    table_name,
    ROUND((data_length + index_length) / 1024 / 1024, 2) AS size_mb
FROM information_schema.tables
WHERE table_schema = 'appdb';

############################################################
# 17. 상태 조회 / 운영용
############################################################

-- 현재 로그인 계정 확인
SELECT USER();

-- 현재 DB 확인
SELECT DATABASE();

-- MySQL 버전 확인
SELECT VERSION();

-- 현재 연결 수 확인
SHOW STATUS LIKE 'Threads_connected';

-- 실행 중인 세션/쿼리 확인
SHOW PROCESSLIST;

-- InnoDB 내부 상태 확인
SHOW ENGINE INNODB STATUS;

-- 서버 변수 확인
SHOW VARIABLES;

-- 문자셋 관련 변수만 조회
SHOW VARIABLES LIKE 'character_set%';

-- 현재 상태값 일부 조회
SHOW STATUS LIKE 'Connections';

############################################################
# 18. 잠금/세션 관리 관련
############################################################

-- 현재 실행 중인 프로세스(세션) 목록 조회
SHOW PROCESSLIST;

-- 특정 프로세스 ID를 강제 종료
-- 예: 15번 세션 종료
KILL 15;

############################################################
# 19. 테이블 유지보수
############################################################

-- 테이블 상태 확인
SHOW TABLE STATUS LIKE 'users';

-- 테이블 최적화
OPTIMIZE TABLE users;

-- 테이블 검사
CHECK TABLE users;

-- 테이블 분석
ANALYZE TABLE users;

-- 테이블 복구 시도 (일부 엔진/상황에서 사용)
REPAIR TABLE users;

CREATE DATABASE IF NOT EXISTS appdb;
CREATE TABLE IF NOT EXISTS users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE test1 (
    id INT AUTO_INCREMENT PRIMARY KEY,
    status VARCHAR(20) DEFAULT 'active'
);

INSERT INTO users (id, name, email)
VALUES (1, 'Kim', '[email protected]')
ON DUPLICATE KEY UPDATE
name = 'Kim Updated',
email = '[email protected]';