<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
	<id>https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=MySQL_%EC%9E%85%EB%AC%B8</id>
	<title>MySQL 입문 - 편집 역사</title>
	<link rel="self" type="application/atom+xml" href="https://dbstudy.co.kr/w/index.php?action=history&amp;feed=atom&amp;title=MySQL_%EC%9E%85%EB%AC%B8"/>
	<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=MySQL_%EC%9E%85%EB%AC%B8&amp;action=history"/>
	<updated>2026-11-04T09:16:39Z</updated>
	<subtitle>이 문서의 편집 역사</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://dbstudy.co.kr/w/index.php?title=MySQL_%EC%9E%85%EB%AC%B8&amp;diff=2046&amp;oldid=prev</id>
		<title>Dbstudy: MySQL 초보 입문자용 문서 생성</title>
		<link rel="alternate" type="text/html" href="https://dbstudy.co.kr/w/index.php?title=MySQL_%EC%9E%85%EB%AC%B8&amp;diff=2046&amp;oldid=prev"/>
		<updated>2026-11-04T06:48:22Z</updated>

		<summary type="html">&lt;p&gt;MySQL 초보 입문자용 문서 생성&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{타이틀 주제&lt;br /&gt;
|부제 = MYSQL · FOUNDATION COURSE&lt;br /&gt;
|제목 = MySQL 입문&lt;br /&gt;
|설명 = 웹 서비스에서 가장 많이 쓰이는 오픈소스 RDBMS — 설치와 접속부터 InnoDB 구조, 인덱스, 트랜잭션·락, 복제와 백업까지&amp;lt;br/&amp;gt;처음 시작하는 사람과 Oracle 사용자를 위한 단계별 가이드&lt;br /&gt;
|색상1 = #0b3c49&lt;br /&gt;
|색상2 = #00617a&lt;br /&gt;
|색상3 = #00758f&lt;br /&gt;
|배지1 = 난이도 · 입문&lt;br /&gt;
|배지2 = 학습기간 · 10주&lt;br /&gt;
|배지3 = 기준 · MySQL 8.0 / 8.4 LTS&lt;br /&gt;
|배지4 = 비교 · Oracle 19c&lt;br /&gt;
}}&lt;br /&gt;
{{단계양식&lt;br /&gt;
|제목1 = 개념 · 설치&lt;br /&gt;
|설명1 = MySQL의 특징, 설치와 mysql 클라이언트&lt;br /&gt;
|제목2 = SQL · 데이터 타입&lt;br /&gt;
|설명2 = DDL·DML, AUTO_INCREMENT, utf8mb4, JSON&lt;br /&gt;
|제목3 = InnoDB 구조&lt;br /&gt;
|설명3 = 클러스터드 인덱스, 버퍼 풀, Redo·Undo·Binlog&lt;br /&gt;
|제목4 = 성능 · 운영&lt;br /&gt;
|설명4 = 인덱스·EXPLAIN, 락, 권한, 백업·복제&lt;br /&gt;
}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== 1. MySQL이란 ==&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;MySQL&amp;#039;&amp;#039;&amp;#039;은 1995년 스웨덴 MySQL AB가 공개한 &amp;#039;&amp;#039;&amp;#039;오픈소스 관계형 데이터베이스&amp;#039;&amp;#039;&amp;#039;로, 현재는 Oracle Corporation이 개발한다. 가볍고 빠르며 설치·운영이 쉬워 웹 서비스, 쇼핑몰, 게임, SaaS 등에서 가장 널리 쓰인다. 같은 뿌리에서 갈라진 &amp;#039;&amp;#039;&amp;#039;MariaDB&amp;#039;&amp;#039;&amp;#039;도 대부분 문법이 호환된다.&lt;br /&gt;
&lt;br /&gt;
{{요점|제목=한 줄 정의|내용=단순하고 빠른 읽기·쓰기에 강한, &amp;#039;&amp;#039;&amp;#039;InnoDB 스토리지 엔진&amp;#039;&amp;#039;&amp;#039; 기반의 대표적인 오픈소스 RDBMS}}&lt;br /&gt;
&lt;br /&gt;
=== 1.1 주요 특징 ===&lt;br /&gt;
{{카드묶음|최소너비=230px|&lt;br /&gt;
{{학습카드|번호=STORAGE ENGINE|제목=플러그인 스토리지 엔진|설명=SQL 계층과 저장 계층이 분리되어 있다. 기본이자 사실상 표준은 트랜잭션을 지원하는 InnoDB.}}&lt;br /&gt;
{{학습카드|번호=CLUSTERED|제목=PK 순서로 저장|설명=InnoDB 테이블은 기본키(PK) 순서로 정렬된 클러스터드 인덱스 구조다. PK 설계가 성능을 좌우한다.}}&lt;br /&gt;
{{학습카드|번호=REPLICATION|제목=손쉬운 복제|설명=Binlog 기반 소스-레플리카 복제, GTID, Group Replication / InnoDB Cluster로 확장과 고가용성을 구성한다.}}&lt;br /&gt;
{{학습카드|번호=EDITIONS|제목=에디션|설명=Community Edition(GPL, 무료)과 Enterprise Edition(상용, 백업·감사·방화벽 등 추가 기능).}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== 1.2 Oracle과 한눈에 비교 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 구분 !! Oracle !! MySQL (InnoDB)&lt;br /&gt;
|-&lt;br /&gt;
| 라이선스 || 상용 || Community(GPL) / Enterprise(상용)&lt;br /&gt;
|-&lt;br /&gt;
| 프로세스 구조 || 백그라운드 프로세스 + 서버 프로세스 || &amp;#039;&amp;#039;&amp;#039;단일 프로세스(mysqld) + 접속마다 스레드&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 테이블 저장 구조 || 힙 테이블 (기본), IOT 선택 || &amp;#039;&amp;#039;&amp;#039;PK 기준 클러스터드 인덱스 (Oracle IOT와 유사)&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| Undo / MVCC || Undo 테이블스페이스 || Undo 로그 기반 MVCC (Oracle과 비슷한 방식)&lt;br /&gt;
|-&lt;br /&gt;
| 리두 로그 || Redo Log / Archive Log || InnoDB Redo Log + &amp;#039;&amp;#039;&amp;#039;Binary Log(binlog)&amp;#039;&amp;#039;&amp;#039; (복제·시점 복구용)&lt;br /&gt;
|-&lt;br /&gt;
| 논리 구조 || 스키마 = 사용자 || &amp;#039;&amp;#039;&amp;#039;데이터베이스 = 스키마&amp;#039;&amp;#039;&amp;#039; (사용자와 별개, DB 간 조인 가능)&lt;br /&gt;
|-&lt;br /&gt;
| 기본 격리 수준 || READ COMMITTED || &amp;#039;&amp;#039;&amp;#039;REPEATABLE READ&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 트랜잭션 DDL || 자동 커밋 || 자동 커밋 (DDL은 롤백 불가)&lt;br /&gt;
|-&lt;br /&gt;
| 사용자 식별 || 사용자명 || &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;&amp;#039;사용자&amp;#039;@&amp;#039;호스트&amp;#039;&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; 조합&lt;br /&gt;
|-&lt;br /&gt;
| 실행계획 확인 || DBMS_XPLAN || &amp;#039;&amp;#039;&amp;#039;EXPLAIN&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;EXPLAIN ANALYZE&amp;#039;&amp;#039;&amp;#039; (8.0.18+)&lt;br /&gt;
|-&lt;br /&gt;
| 고가용성 || RAC, Data Guard || 복제(Replication), InnoDB Cluster, MHA·Orchestrator 등&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 2. 설치와 접속 ==&lt;br /&gt;
=== 2.1 가장 빠른 방법 — Docker ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker run -d --name mysql-lab \&lt;br /&gt;
  -e MYSQL_ROOT_PASSWORD=lab1234 \&lt;br /&gt;
  -p 3306:3306 \&lt;br /&gt;
  -v mysqldata:/var/lib/mysql \&lt;br /&gt;
  mysql:8.4&lt;br /&gt;
&lt;br /&gt;
docker exec -it mysql-lab mysql -uroot -p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2.2 Linux 패키지 설치 (Rocky/RHEL 계열 예) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# MySQL 공식 Yum 저장소 등록 후&lt;br /&gt;
sudo dnf install -y mysql-community-server&lt;br /&gt;
sudo systemctl enable --now mysqld&lt;br /&gt;
sudo grep &amp;#039;temporary password&amp;#039; /var/log/mysqld.log   # 초기 root 임시 비밀번호&lt;br /&gt;
mysql_secure_installation                            # 비밀번호 변경·익명 계정 제거&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{설명|제목=Windows / macOS|내용=MySQL Installer(Windows), DMG 패키지 또는 Homebrew(macOS)로 설치한다. GUI 도구로는 MySQL Workbench, DBeaver, HeidiSQL이 많이 쓰인다.}}&lt;br /&gt;
&lt;br /&gt;
=== 2.3 mysql 클라이언트 필수 명령 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 명령 !! 의미 !! Oracle에서 비슷한 것&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;mysql -h 호스트 -P 3306 -u 사용자 -p&amp;lt;/code&amp;gt; || 접속 || &amp;lt;code&amp;gt;sqlplus user@tns&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW DATABASES;&amp;lt;/code&amp;gt; || 데이터베이스(스키마) 목록 || &amp;lt;code&amp;gt;DBA_USERS&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;USE dbname;&amp;lt;/code&amp;gt; || 기본 DB 전환 || &amp;lt;code&amp;gt;ALTER SESSION SET CURRENT_SCHEMA&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW TABLES;&amp;lt;/code&amp;gt; || 테이블 목록 || &amp;lt;code&amp;gt;USER_TABLES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DESC 테이블명;&amp;lt;/code&amp;gt; || 컬럼 구조 || &amp;lt;code&amp;gt;DESC&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW CREATE TABLE 테이블명\G&amp;lt;/code&amp;gt; || 테이블 DDL 전체 (인덱스·엔진 포함) || &amp;lt;code&amp;gt;DBMS_METADATA.GET_DDL&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW INDEX FROM 테이블명;&amp;lt;/code&amp;gt; || 인덱스 목록 || &amp;lt;code&amp;gt;USER_INDEXES&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW PROCESSLIST;&amp;lt;/code&amp;gt; || 접속 세션 목록 || &amp;lt;code&amp;gt;V$SESSION&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SHOW VARIABLES LIKE &amp;#039;innodb%&amp;#039;;&amp;lt;/code&amp;gt; || 시스템 변수 || &amp;lt;code&amp;gt;SHOW PARAMETER&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;\G&amp;lt;/code&amp;gt; (문장 끝) || 세로 출력 || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;source file.sql&amp;lt;/code&amp;gt; || 스크립트 실행 || &amp;lt;code&amp;gt;@file.sql&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3. 논리 구조 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 MySQL 서버 (mysqld 인스턴스 1개, datadir)&lt;br /&gt;
  ├─ 데이터베이스(=스키마) mysql               ← 사용자·권한 등 시스템 정보&lt;br /&gt;
  ├─ information_schema / performance_schema / sys ← 메타데이터·성능 정보&lt;br /&gt;
  ├─ 데이터베이스 shop&lt;br /&gt;
  │    ├─ 테이블 (InnoDB: 테이블마다 shop/orders.ibd 파일)&lt;br /&gt;
  │    ├─ 뷰, 트리거, 저장 프로시저/함수, 이벤트&lt;br /&gt;
  └─ 데이터베이스 board&lt;br /&gt;
  (공통) 사용자 &amp;#039;user&amp;#039;@&amp;#039;host&amp;#039; · 권한&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{중요|내용=MySQL에서 &amp;#039;&amp;#039;&amp;#039;DATABASE와 SCHEMA는 같은 말&amp;#039;&amp;#039;&amp;#039;이다 (&amp;lt;code&amp;gt;CREATE SCHEMA&amp;lt;/code&amp;gt; = &amp;lt;code&amp;gt;CREATE DATABASE&amp;lt;/code&amp;gt;). 같은 서버 안이라면 &amp;lt;code&amp;gt;shop.orders&amp;lt;/code&amp;gt;처럼 &amp;#039;&amp;#039;&amp;#039;다른 데이터베이스의 테이블과 바로 조인&amp;#039;&amp;#039;&amp;#039;할 수 있다.}}&lt;br /&gt;
&lt;br /&gt;
== 4. 기본 SQL과 데이터 타입 ==&lt;br /&gt;
=== 4.1 주요 데이터 타입 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 용도 !! MySQL !! Oracle 대응 !! 메모&lt;br /&gt;
|-&lt;br /&gt;
| 정수 || &amp;lt;code&amp;gt;INT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;BIGINT&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TINYINT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NUMBER(10)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;UNSIGNED&amp;lt;/code&amp;gt; 지정 가능&lt;br /&gt;
|-&lt;br /&gt;
| 정밀 숫자 || &amp;lt;code&amp;gt;DECIMAL(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NUMBER(p,s)&amp;lt;/code&amp;gt; || 금액&lt;br /&gt;
|-&lt;br /&gt;
| 문자 || &amp;lt;code&amp;gt;VARCHAR(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TEXT&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;VARCHAR2(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CLOB&amp;lt;/code&amp;gt; || n은 &amp;#039;&amp;#039;&amp;#039;문자 수&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| 날짜 || &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt; || MySQL DATE는 시간 없음&lt;br /&gt;
|-&lt;br /&gt;
| 일시 || &amp;lt;code&amp;gt;DATETIME&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TIMESTAMP&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DATE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TIMESTAMP&amp;lt;/code&amp;gt; || TIMESTAMP는 UTC 변환 저장, 2038년 한계&lt;br /&gt;
|-&lt;br /&gt;
| 참/거짓 || &amp;lt;code&amp;gt;BOOLEAN&amp;lt;/code&amp;gt; (= &amp;lt;code&amp;gt;TINYINT(1)&amp;lt;/code&amp;gt;) || (없음) ||&lt;br /&gt;
|-&lt;br /&gt;
| 반정형 || &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;JSON&amp;lt;/code&amp;gt; || 함수 기반 인덱스로 검색 가속&lt;br /&gt;
|-&lt;br /&gt;
| 열거 || &amp;lt;code&amp;gt;ENUM(&amp;#039;A&amp;#039;,&amp;#039;B&amp;#039;)&amp;lt;/code&amp;gt; || CHECK 제약 || 값 추가 시 ALTER 필요&lt;br /&gt;
|}&lt;br /&gt;
{{중요|내용=문자셋은 반드시 &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;utf8mb4&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039;를 사용한다. MySQL의 &amp;lt;code&amp;gt;utf8&amp;lt;/code&amp;gt;(= utf8mb3)은 한 글자 최대 3바이트라 이모지 등 4바이트 문자를 저장하지 못한다. MySQL 8.0부터 기본값은 &amp;lt;code&amp;gt;utf8mb4&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;utf8mb4_0900_ai_ci&amp;lt;/code&amp;gt;이다.}}&lt;br /&gt;
&lt;br /&gt;
=== 4.2 테이블 만들기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE DATABASE shop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;&lt;br /&gt;
USE shop;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE customer (&lt;br /&gt;
    cust_id     BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
    cust_nm     VARCHAR(100) NOT NULL,&lt;br /&gt;
    email       VARCHAR(200),&lt;br /&gt;
    grade_cd    VARCHAR(10)  NOT NULL DEFAULT &amp;#039;NORMAL&amp;#039;,&lt;br /&gt;
    attrs       JSON,&lt;br /&gt;
    created_at  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,&lt;br /&gt;
    PRIMARY KEY (cust_id),&lt;br /&gt;
    UNIQUE KEY uk_customer_email (email)&lt;br /&gt;
) ENGINE=InnoDB COMMENT=&amp;#039;고객&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE orders (&lt;br /&gt;
    order_id    BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,&lt;br /&gt;
    cust_id     BIGINT UNSIGNED NOT NULL,&lt;br /&gt;
    order_dt    DATE           NOT NULL,&lt;br /&gt;
    amount      DECIMAL(12,2)  NOT NULL,&lt;br /&gt;
    PRIMARY KEY (order_id),&lt;br /&gt;
    KEY ix_orders_cust (cust_id, order_dt),&lt;br /&gt;
    CONSTRAINT fk_orders_cust FOREIGN KEY (cust_id) REFERENCES customer (cust_id),&lt;br /&gt;
    CONSTRAINT ck_orders_amt CHECK (amount &amp;gt;= 0)          -- 8.0.16부터 CHECK 실제 적용&lt;br /&gt;
) ENGINE=InnoDB;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.3 자주 쓰는 SQL ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 방금 생성된 AUTO_INCREMENT 값&lt;br /&gt;
INSERT INTO customer (cust_nm, email) VALUES (&amp;#039;홍길동&amp;#039;, &amp;#039;hong@example.com&amp;#039;);&lt;br /&gt;
SELECT LAST_INSERT_ID();&lt;br /&gt;
&lt;br /&gt;
-- UPSERT&lt;br /&gt;
INSERT INTO customer (cust_nm, email) VALUES (&amp;#039;홍길동&amp;#039;, &amp;#039;hong@example.com&amp;#039;)&lt;br /&gt;
ON DUPLICATE KEY UPDATE cust_nm = VALUES(cust_nm);&lt;br /&gt;
&lt;br /&gt;
-- 페이징&lt;br /&gt;
SELECT * FROM orders ORDER BY order_dt DESC LIMIT 40, 20;   -- 41번째부터 20건&lt;br /&gt;
&lt;br /&gt;
-- JSON 조회&lt;br /&gt;
SELECT cust_nm FROM customer WHERE attrs-&amp;gt;&amp;gt;&amp;#039;$.channel&amp;#039; = &amp;#039;mobile&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- CTE·윈도우 함수 (8.0+)&lt;br /&gt;
WITH t AS (SELECT cust_id, SUM(amount) AS amt FROM orders GROUP BY cust_id)&lt;br /&gt;
SELECT cust_id, amt, RANK() OVER (ORDER BY amt DESC) AS rnk FROM t;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4.4 Oracle 사용자를 위한 문법 대응표 ===&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Oracle !! MySQL !! 비고&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SELECT 1 FROM DUAL&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;SELECT 1&amp;lt;/code&amp;gt; || DUAL도 사용 가능&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;NVL(a, b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;IFNULL(a, b)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;COALESCE(a, b)&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SYSDATE&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;NOW()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;CURDATE()&amp;lt;/code&amp;gt; || MySQL &amp;lt;code&amp;gt;SYSDATE()&amp;lt;/code&amp;gt;는 호출 시각 (NOW는 문장 시작 시각)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ROWNUM &amp;lt;= 10&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;LIMIT 10&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;seq.NEXTVAL&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;AUTO_INCREMENT&amp;lt;/code&amp;gt; || 시퀀스 객체 없음&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;DECODE(a, 1, &amp;#039;x&amp;#039;, &amp;#039;y&amp;#039;)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;CASE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;IF(a = 1, &amp;#039;x&amp;#039;, &amp;#039;y&amp;#039;)&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TO_CHAR(dt, &amp;#039;YYYY-MM-DD&amp;#039;)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;DATE_FORMAT(dt, &amp;#039;%Y-%m-%d&amp;#039;)&amp;lt;/code&amp;gt; || 포맷 문자가 다르다&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TO_DATE(&amp;#039;20261104&amp;#039;,&amp;#039;YYYYMMDD&amp;#039;)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;STR_TO_DATE(&amp;#039;20261104&amp;#039;, &amp;#039;%Y%m%d&amp;#039;)&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;a &amp;amp;#124;&amp;amp;#124; b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;CONCAT(a, b)&amp;lt;/code&amp;gt; || MySQL의 &amp;lt;code&amp;gt;&amp;amp;#124;&amp;amp;#124;&amp;lt;/code&amp;gt;는 기본적으로 &amp;#039;&amp;#039;&amp;#039;논리 OR&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MERGE INTO&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;INSERT … ON DUPLICATE KEY UPDATE&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;CONNECT BY&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;WITH RECURSIVE&amp;lt;/code&amp;gt; (8.0+) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINUS&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;EXCEPT&amp;lt;/code&amp;gt; (8.0.31+) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FULL OUTER JOIN&amp;lt;/code&amp;gt; || 지원 안 함 → &amp;lt;code&amp;gt;LEFT JOIN … UNION … RIGHT JOIN&amp;lt;/code&amp;gt; ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; = NULL || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; ≠ NULL ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 5. InnoDB 내부 구조 ==&lt;br /&gt;
=== 5.1 메모리와 로그 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
 클라이언트 ──접속──▶ mysqld (하나의 프로세스) ──▶ 접속마다 스레드 1개&lt;br /&gt;
 ┌──────────── SQL 계층 ─────────────┐&lt;br /&gt;
 │ 파서 · 옵티마이저 · 실행기          │──▶ Binary Log (binlog: 복제·PITR용, 논리 변경 기록)&lt;br /&gt;
 └────────────────┬──────────────────┘&lt;br /&gt;
 ┌──────────── InnoDB 엔진 ──────────┐&lt;br /&gt;
 │ Buffer Pool (데이터·인덱스 페이지 캐시, 16KB) │&lt;br /&gt;
 │ Log Buffer ──▶ Redo Log (장애 복구용)        │&lt;br /&gt;
 │ Undo Log (MVCC 이전 버전, 롤백)              │&lt;br /&gt;
 │ Change Buffer · Adaptive Hash Index          │&lt;br /&gt;
 └───────────────────────────────────┘&lt;br /&gt;
 백그라운드 스레드: master · purge · page cleaner · I/O threads&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 변수 !! 역할 !! 출발점 (전용 서버 기준)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;innodb_buffer_pool_size&amp;lt;/code&amp;gt; || 버퍼 풀 크기 (가장 중요) || 메모리의 50~70%&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;innodb_redo_log_capacity&amp;lt;/code&amp;gt; || Redo 로그 전체 크기 (8.0.30+) || 쓰기량에 맞춰 수 GB&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;innodb_flush_log_at_trx_commit&amp;lt;/code&amp;gt; || 커밋 시 Redo 디스크 반영 방식 || &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; (안전, 기본값)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;sync_binlog&amp;lt;/code&amp;gt; || 커밋 시 binlog 동기화 || &amp;#039;&amp;#039;&amp;#039;1&amp;#039;&amp;#039;&amp;#039; (안전, 기본값)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;max_connections&amp;lt;/code&amp;gt; || 최대 접속 수 || 애플리케이션 커넥션 풀과 함께 설계&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;long_query_time&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;slow_query_log&amp;lt;/code&amp;gt; || 느린 쿼리 기록 기준 || 1초 등으로 켜 두기&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.2 클러스터드 인덱스 — 가장 중요한 개념 ===&lt;br /&gt;
{{핵심|제목=InnoDB 저장 구조의 핵심|내용=InnoDB 테이블의 데이터는 &amp;#039;&amp;#039;&amp;#039;기본키(PK) 순서대로 B+Tree 리프에 저장&amp;#039;&amp;#039;&amp;#039;된다 (클러스터드 인덱스). 보조 인덱스(Secondary Index)의 리프에는 ROWID가 아니라 &amp;#039;&amp;#039;&amp;#039;PK 값&amp;#039;&amp;#039;&amp;#039;이 들어 있어, 보조 인덱스로 찾은 뒤 PK로 한 번 더 찾아간다.}}&lt;br /&gt;
&lt;br /&gt;
{{단계별양식2&lt;br /&gt;
|제목1 = 보조 인덱스 |설명1 = 조건으로 PK 값 찾기&lt;br /&gt;
|제목2 = PK 인덱스 |설명2 = PK로 다시 탐색&lt;br /&gt;
|제목3 = 데이터 행 |설명3 = 클러스터드 리프에서 읽기&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! PK 설계 원칙 !! 이유&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;짧은 값&amp;#039;&amp;#039;&amp;#039; (BIGINT 등) || 모든 보조 인덱스에 PK가 복사되므로 PK가 길면 인덱스 전체가 커진다&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;증가하는 값&amp;#039;&amp;#039;&amp;#039; (AUTO_INCREMENT) || 랜덤 값(UUID 문자열)은 중간 삽입으로 페이지 분할이 잦아진다&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;반드시 명시&amp;#039;&amp;#039;&amp;#039; || PK가 없으면 InnoDB가 숨은 6바이트 행 ID를 만들어 쓴다&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;변경하지 않는 값&amp;#039;&amp;#039;&amp;#039; || PK 변경은 행 이동 + 모든 보조 인덱스 갱신을 일으킨다&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 5.3 Redo Log와 Binlog ===&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Redo Log&amp;#039;&amp;#039;&amp;#039; — InnoDB 엔진의 장애 복구용 물리 로그 (Oracle Redo와 같은 역할).&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Binary Log&amp;#039;&amp;#039;&amp;#039; — 서버 계층의 논리 변경 기록. &amp;#039;&amp;#039;&amp;#039;복제&amp;#039;&amp;#039;&amp;#039;와 &amp;#039;&amp;#039;&amp;#039;시점 복구(PITR)&amp;#039;&amp;#039;&amp;#039;에 쓰인다. 형식은 &amp;lt;code&amp;gt;ROW&amp;lt;/code&amp;gt;(기본, 권장).&lt;br /&gt;
* 두 로그는 내부 2단계 커밋으로 일관성을 맞춘다.&lt;br /&gt;
&lt;br /&gt;
== 6. 인덱스와 실행계획 ==&lt;br /&gt;
=== 6.1 인덱스 기본 ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 종류 !! 설명 !! 예&lt;br /&gt;
|-&lt;br /&gt;
| PRIMARY KEY || 클러스터드 인덱스 (테이블 자체) || &amp;lt;code&amp;gt;PRIMARY KEY (order_id)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 보조 인덱스 || 일반 B+Tree 인덱스 || &amp;lt;code&amp;gt;CREATE INDEX ix ON orders (cust_id, order_dt);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| UNIQUE || 중복 불가 보조 인덱스 || &amp;lt;code&amp;gt;UNIQUE KEY uk (email)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 커버링 인덱스 || 필요한 컬럼이 모두 인덱스에 있어 PK 재탐색 생략 || EXPLAIN Extra: &amp;lt;code&amp;gt;Using index&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 함수 기반 인덱스 || 식 결과를 인덱싱 (8.0.13+) || &amp;lt;code&amp;gt;CREATE INDEX ix ON customer ((lower(email)));&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| FULLTEXT || 전문 검색 (ngram 파서로 한글 지원) || &amp;lt;code&amp;gt;FULLTEXT KEY ft (title) WITH PARSER ngram&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 내림차순 인덱스 || 8.0부터 DESC 실제 적용 || &amp;lt;code&amp;gt;(order_dt DESC)&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
{{설명|제목=Online DDL|내용=&amp;lt;code&amp;gt;ALTER TABLE … ADD INDEX … , ALGORITHM=INPLACE, LOCK=NONE&amp;lt;/code&amp;gt;처럼 지정하면 대부분의 인덱스 추가를 운영 중 DML을 막지 않고 수행할 수 있다. 대용량 테이블은 gh-ost, pt-online-schema-change 같은 도구도 쓴다.}}&lt;br /&gt;
&lt;br /&gt;
=== 6.2 EXPLAIN 읽기 ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
EXPLAIN&lt;br /&gt;
SELECT c.cust_nm, SUM(o.amount)&lt;br /&gt;
  FROM customer c JOIN orders o ON o.cust_id = c.cust_id&lt;br /&gt;
 WHERE o.order_dt &amp;gt;= CURDATE() - INTERVAL 30 DAY&lt;br /&gt;
 GROUP BY c.cust_nm;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 컬럼 !! 의미 !! 주의해서 볼 값&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;table&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; || 접근 테이블과 실행 단위 || 위에서 아래 순서로 조인 (드라이빙 → 드리븐)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; || 접근 방식 || 좋음 &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;eq_ref&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;ref&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;range&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;index&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;ALL&amp;lt;/code&amp;gt;(풀스캔) 나쁨&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;possible_keys&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;key&amp;lt;/code&amp;gt; || 후보 인덱스 / 실제 사용 인덱스 || key가 NULL이면 인덱스 미사용&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;key_len&amp;lt;/code&amp;gt; || 사용한 인덱스 길이 || 결합 인덱스의 몇 번째 컬럼까지 썼는지&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rows&amp;lt;/code&amp;gt; || 예상 읽기 행 수 ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;filtered&amp;lt;/code&amp;gt; || 조건 통과 예상 비율(%) ||&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;&amp;lt;code&amp;gt;Extra&amp;lt;/code&amp;gt;&amp;#039;&amp;#039;&amp;#039; || 추가 정보 || &amp;lt;code&amp;gt;Using index&amp;lt;/code&amp;gt;(좋음), &amp;lt;code&amp;gt;Using filesort&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Using temporary&amp;lt;/code&amp;gt;(주의)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 실제 실행 시간·행 수까지 (8.0.18+) — Oracle의 ALLSTATS LAST와 비슷&lt;br /&gt;
EXPLAIN ANALYZE&lt;br /&gt;
SELECT * FROM orders WHERE cust_id = 1001 AND order_dt &amp;gt;= &amp;#039;2026-10-01&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- 트리 형식 계획&lt;br /&gt;
EXPLAIN FORMAT=TREE SELECT ...;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{요점|내용=인덱스를 못 타는 패턴은 Oracle과 같다 — &amp;#039;&amp;#039;&amp;#039;인덱스 컬럼 가공&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;묵시적 형변환&amp;#039;&amp;#039;&amp;#039;(문자 컬럼에 숫자 비교), &amp;#039;&amp;#039;&amp;#039;앞쪽 와일드카드 LIKE&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;결합 인덱스 선두 컬럼 누락&amp;#039;&amp;#039;&amp;#039;. 통계는 &amp;lt;code&amp;gt;ANALYZE TABLE 테이블명;&amp;lt;/code&amp;gt;으로 갱신한다. → [[인덱스 튜닝 심화]]}}&lt;br /&gt;
&lt;br /&gt;
== 7. 트랜잭션과 락 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 격리 수준 !! 특징 !! 비고&lt;br /&gt;
|-&lt;br /&gt;
| READ UNCOMMITTED || 커밋 전 데이터도 읽음 || 사용하지 않음&lt;br /&gt;
|-&lt;br /&gt;
| READ COMMITTED || 커밋된 최신 데이터 읽기 || Oracle 기본값과 같음&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;REPEATABLE READ&amp;#039;&amp;#039;&amp;#039; || 트랜잭션 시작 시점 스냅샷 유지 || &amp;#039;&amp;#039;&amp;#039;MySQL 기본값&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| SERIALIZABLE || 읽기에도 공유 락 ||&lt;br /&gt;
|}&lt;br /&gt;
{{중요|내용=REPEATABLE READ에서 범위 조건 UPDATE·DELETE·&amp;lt;code&amp;gt;SELECT … FOR UPDATE&amp;lt;/code&amp;gt;는 행 사이 공간까지 잠그는 &amp;#039;&amp;#039;&amp;#039;갭 락(Gap Lock) / 넥스트 키 락&amp;#039;&amp;#039;&amp;#039;을 건다. 인덱스가 없는 컬럼으로 UPDATE하면 &amp;#039;&amp;#039;&amp;#039;사실상 테이블 전체가 잠길 수 있으므로&amp;#039;&amp;#039;&amp;#039; 조건 컬럼에 인덱스가 꼭 필요하다.}}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- autocommit 기본값은 ON. 여러 문장을 묶으려면 명시적으로 시작&lt;br /&gt;
START TRANSACTION;&lt;br /&gt;
UPDATE orders SET amount = amount - 1000 WHERE order_id = 10;&lt;br /&gt;
COMMIT;&lt;br /&gt;
&lt;br /&gt;
-- 락 대기 확인 (8.0+)&lt;br /&gt;
SELECT * FROM sys.innodb_lock_waits\G&lt;br /&gt;
SELECT * FROM performance_schema.data_locks LIMIT 20;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8. 사용자·권한 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 사용자는 &amp;#039;이름&amp;#039;@&amp;#039;접속 호스트&amp;#039; 조합으로 구분된다&lt;br /&gt;
CREATE USER &amp;#039;app_user&amp;#039;@&amp;#039;10.0.0.%&amp;#039; IDENTIFIED BY &amp;#039;change_me&amp;#039;;&lt;br /&gt;
GRANT SELECT, INSERT, UPDATE, DELETE ON shop.* TO &amp;#039;app_user&amp;#039;@&amp;#039;10.0.0.%&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
-- 역할(Role) 사용 (8.0+)&lt;br /&gt;
CREATE ROLE &amp;#039;app_read&amp;#039;;&lt;br /&gt;
GRANT SELECT ON shop.* TO &amp;#039;app_read&amp;#039;;&lt;br /&gt;
GRANT &amp;#039;app_read&amp;#039; TO &amp;#039;report_user&amp;#039;@&amp;#039;%&amp;#039;;&lt;br /&gt;
SET DEFAULT ROLE ALL TO &amp;#039;report_user&amp;#039;@&amp;#039;%&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
SHOW GRANTS FOR &amp;#039;app_user&amp;#039;@&amp;#039;10.0.0.%&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
{{설명|제목=인증 플러그인|내용=MySQL 8.0부터 기본 인증 방식은 &amp;lt;code&amp;gt;caching_sha2_password&amp;lt;/code&amp;gt;이다. 오래된 클라이언트 드라이버는 접속 오류가 날 수 있으므로 드라이버를 최신으로 맞춘다.}}&lt;br /&gt;
&lt;br /&gt;
== 9. 백업·복구·복제 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 방식 !! 도구 !! 특징 !! Oracle 대응&lt;br /&gt;
|-&lt;br /&gt;
| 논리 백업 || &amp;lt;code&amp;gt;mysqldump&amp;lt;/code&amp;gt; || SQL 문으로 덤프, 소규모 DB에 적합 || Data Pump&lt;br /&gt;
|-&lt;br /&gt;
| 논리 백업 (병렬) || MySQL Shell &amp;lt;code&amp;gt;util.dumpInstance()&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;loadDump()&amp;lt;/code&amp;gt; || 병렬·압축, 대용량에 유리 || Data Pump 병렬&lt;br /&gt;
|-&lt;br /&gt;
| 물리 백업 || Percona XtraBackup, MySQL Enterprise Backup || 운영 중 온라인 물리 백업 || RMAN&lt;br /&gt;
|-&lt;br /&gt;
| 시점 복구 || 백업 + &amp;#039;&amp;#039;&amp;#039;binlog 재적용&amp;#039;&amp;#039;&amp;#039; (&amp;lt;code&amp;gt;mysqlbinlog&amp;lt;/code&amp;gt;) || 원하는 시각·위치까지 복구 || RMAN + Archive Log&lt;br /&gt;
|-&lt;br /&gt;
| 복제 || 소스-레플리카 (binlog, GTID 권장) || 읽기 분산, 대기 서버 || Data Guard&lt;br /&gt;
|-&lt;br /&gt;
| 고가용성 || Group Replication / InnoDB Cluster || 자동 장애 조치 || RAC / Data Guard Broker&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 일관된 논리 백업 (InnoDB, 운영 중 락 최소화)&lt;br /&gt;
mysqldump -uroot -p --single-transaction --routines --triggers --events \&lt;br /&gt;
          --source-data=2 shop &amp;gt; shop.sql&lt;br /&gt;
mysql -uroot -p shop_new &amp;lt; shop.sql&lt;br /&gt;
&lt;br /&gt;
# 시점 복구: 백업 이후 binlog를 특정 시각까지 재적용&lt;br /&gt;
mysqlbinlog --stop-datetime=&amp;quot;2026-11-04 10:29:59&amp;quot; binlog.000123 | mysql -uroot -p&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10. 모니터링 기본 쿼리 ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- 실행 중인 세션 (Oracle V$SESSION)&lt;br /&gt;
SELECT id, user, host, db, command, time, state, LEFT(info, 60) AS query&lt;br /&gt;
  FROM information_schema.processlist&lt;br /&gt;
 WHERE command &amp;lt;&amp;gt; &amp;#039;Sleep&amp;#039;&lt;br /&gt;
 ORDER BY time DESC;&lt;br /&gt;
&lt;br /&gt;
-- 부하 상위 SQL (Oracle V$SQL) — sys 스키마 뷰&lt;br /&gt;
SELECT query, exec_count, total_latency, avg_latency, rows_examined_avg&lt;br /&gt;
  FROM sys.statement_analysis&lt;br /&gt;
 ORDER BY total_latency DESC&lt;br /&gt;
 LIMIT 10;&lt;br /&gt;
&lt;br /&gt;
-- 테이블 크기&lt;br /&gt;
SELECT table_schema, table_name,&lt;br /&gt;
       ROUND((data_length + index_length) / 1024 / 1024) AS size_mb&lt;br /&gt;
  FROM information_schema.tables&lt;br /&gt;
 ORDER BY data_length + index_length DESC&lt;br /&gt;
 LIMIT 10;&lt;br /&gt;
&lt;br /&gt;
-- 버퍼 풀 적중 관련 지표&lt;br /&gt;
SHOW GLOBAL STATUS LIKE &amp;#039;Innodb_buffer_pool_read%&amp;#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 11. 학습 커리큘럼 (10주) ==&lt;br /&gt;
{{안내바|강조=설치 → SQL → InnoDB 구조 → 성능 → 운영|내용=한 주에 이론 3시간 + 실습 3시간|우측=Oracle 경험자는 5주차(클러스터드 인덱스)에 특히 집중하세요.}}&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:8%;&amp;quot; | 주차 !! style=&amp;quot;width:12%;&amp;quot; | 단계 !! style=&amp;quot;width:22%;&amp;quot; | 주제 !! 세부 내용 !! style=&amp;quot;width:22%;&amp;quot; | 실습&lt;br /&gt;
|-&lt;br /&gt;
| 1 || rowspan=&amp;quot;2&amp;quot; | 기초 || MySQL 소개와 설치 || 역사·에디션·MariaDB, Docker/패키지 설치, mysql 클라이언트, Workbench || 실습 서버 구축, 기본 명령&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 논리 구조와 기본 SQL || 데이터베이스=스키마, 시스템 DB, DDL/DML, autocommit || 샘플 DB 생성&lt;br /&gt;
|-&lt;br /&gt;
| 3 || rowspan=&amp;quot;2&amp;quot; | SQL || 데이터 타입과 문자셋 || 숫자·문자·날짜, AUTO_INCREMENT, JSON, utf8mb4와 콜레이션 || 쇼핑몰 테이블 설계&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 고급 SQL || CTE·WITH RECURSIVE, 윈도우 함수, UPSERT, Oracle 문법 차이 || Oracle SQL 10개 변환&lt;br /&gt;
|-&lt;br /&gt;
| 5 || rowspan=&amp;quot;2&amp;quot; | InnoDB || 저장 구조 || 클러스터드 인덱스, 보조 인덱스, 페이지·페이지 분할, PK 설계 || PK 종류별 INSERT 성능 비교&lt;br /&gt;
|-&lt;br /&gt;
| 6 || 메모리와 로그 || 버퍼 풀, Redo·Undo·Binlog, MVCC, 주요 변수 || my.cnf 분석&lt;br /&gt;
|-&lt;br /&gt;
| 7 || rowspan=&amp;quot;2&amp;quot; | 성능 || 인덱스와 EXPLAIN || type·key·Extra 해석, 커버링 인덱스, EXPLAIN ANALYZE, 슬로 쿼리 로그 || 느린 SQL 3개 튜닝&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 트랜잭션과 락 || 격리 수준, 갭 락·넥스트 키 락, 데드락 분석, data_locks || 락 대기 재현·분석&lt;br /&gt;
|-&lt;br /&gt;
| 9 || rowspan=&amp;quot;2&amp;quot; | 운영 || 보안과 모니터링 || 사용자@호스트, 역할, performance_schema, sys 스키마 || 읽기 전용 계정 설계&lt;br /&gt;
|-&lt;br /&gt;
| 10 || 백업·복구·복제 || mysqldump, MySQL Shell 덤프, XtraBackup, binlog PITR, GTID 복제 || 레플리카 구성 실습&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12. 입문자 체크리스트 ==&lt;br /&gt;
{{노트박스&lt;br /&gt;
|라벨 = SELF CHECK&lt;br /&gt;
|제목 = 이 정도면 입문 완료&lt;br /&gt;
|내용 = □ mysql 클라이언트로 접속해 DB·테이블 구조와 DDL을 확인할 수 있다&amp;lt;br/&amp;gt;□ utf8mb4로 데이터베이스와 테이블을 만들 수 있다&amp;lt;br/&amp;gt;□ InnoDB 클러스터드 인덱스와 보조 인덱스의 관계를 설명할 수 있다&amp;lt;br/&amp;gt;□ EXPLAIN의 type, key, Extra를 보고 인덱스 사용 여부를 판단할 수 있다&amp;lt;br/&amp;gt;□ REPEATABLE READ와 갭 락이 UPDATE에 주는 영향을 설명할 수 있다&amp;lt;br/&amp;gt;□ mysqldump로 백업하고 복원할 수 있다&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
== 13. 용어집 ==&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! 용어 !! 설명 !! Oracle 대응&lt;br /&gt;
|-&lt;br /&gt;
| 스토리지 엔진 || 실제 데이터 저장·트랜잭션을 담당하는 계층 (InnoDB) || (단일 엔진)&lt;br /&gt;
|-&lt;br /&gt;
| 클러스터드 인덱스 || PK 순서로 데이터를 저장하는 InnoDB 테이블 구조 || IOT&lt;br /&gt;
|-&lt;br /&gt;
| 보조 인덱스 || PK 값을 가리키는 일반 인덱스 || 인덱스 (ROWID 대신 PK)&lt;br /&gt;
|-&lt;br /&gt;
| 버퍼 풀 || 데이터·인덱스 페이지 캐시 || Buffer Cache&lt;br /&gt;
|-&lt;br /&gt;
| Redo Log || InnoDB 장애 복구용 로그 || Redo Log&lt;br /&gt;
|-&lt;br /&gt;
| Binlog || 복제·시점 복구용 논리 변경 로그 || Archive Log (용도상)&lt;br /&gt;
|-&lt;br /&gt;
| GTID || 전역 트랜잭션 ID, 복제 위치 관리 || SCN (용도상)&lt;br /&gt;
|-&lt;br /&gt;
| 갭 락 || 인덱스 레코드 사이 공간에 거는 락 || (없음)&lt;br /&gt;
|-&lt;br /&gt;
| 레플리카 || 복제 대상 서버 || Standby DB&lt;br /&gt;
|-&lt;br /&gt;
| performance_schema || 서버 성능 계측 정보 || V$ 동적 성능 뷰&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 14. 참고 자료 ==&lt;br /&gt;
* MySQL 8.4 Reference Manual — https://dev.mysql.com/doc/refman/8.4/en/&lt;br /&gt;
* MySQL 공식 다운로드 — https://dev.mysql.com/downloads/&lt;br /&gt;
* MySQL Shell 문서 — https://dev.mysql.com/doc/mysql-shell/8.4/en/&lt;br /&gt;
&lt;br /&gt;
{{관련글|이전글=[[PostgreSQL 입문]]|다음글=[[SQL 튜닝 입문]]}}&lt;br /&gt;
&lt;br /&gt;
[[분류:MySQL]]&lt;br /&gt;
[[분류:입문 가이드]]&lt;br /&gt;
[[분류:커리큘럼]]&lt;/div&gt;</summary>
		<author><name>Dbstudy</name></author>
	</entry>
</feed>