💡 CloudShell은 MySQL client가 사전 설치되어 있습니다! 아래는 재설치나 업데이트가 필요할 때만 참고하세요.
Amazon Linux 2023에서 MySQL 명령줄 클라이언트를 설치하려면:
# Amazon Linux 2023: dnf 사용
sudo dnf install mariadb105
# 버전 확인
mysql --version
출력 예시:
$ mysql --version
mariadb Ver 15.1 Distrib 10.5.x-MariaDB, for Linux (x86_64) using readline 5.1
Amazon Linux 2에서 MySQL 명령줄 클라이언트를 설치하려면:
# Amazon Linux 2: yum 사용
sudo yum install mariadb
# 버전 확인
mysql --version
대부분의 DEB 기반 Linux 배포판에 MySQL 명령줄 클라이언트를 설치하려면:
sudo apt-get install mariadb-client
# 버전 확인
mysql --version
# 설치된 경로 확인
which mysql
# 상세 문서 보기
man mysql
주의: 대부분의 Linux 배포에는 Oracle MySQL 클라이언트 대신 MariaDB 클라이언트가 포함됩니다. MariaDB는 MySQL과 호환되므로 동일하게 사용 가능합니다.
먼저 RDS 인스턴스의 엔드포인트를 확인합니다:
# AWS CLI로 RDS 엔드포인트 조회
aws rds describe-db-instances --db-instance-identifier your-db-name \
--query 'DBInstances[0].Endpoint' --output text
# 출력 예시
mydb.c12345abcde.ap-northeast-2.rds.amazonaws.com:3306
또는 AWS Management Console → RDS → 데이터베이스 → 엔드포인트 확인
# 기본 접속 (패스워드는 프롬프트에서 입력)
mysql -h RDS_ENDPOINT -u admin -p database_name
# 예시
mysql -h mydb.c12345.ap-northeast-2.rds.amazonaws.com -u admin -p myapp_db
# 포트를 명시하는 경우 (기본값: 3306)
mysql -h mydb.c12345.ap-northeast-2.rds.amazonaws.com -u admin -p -P 3306 myapp_db
# 환경변수 설정
export RDS_ENDPOINT="mydb.c12345.ap-northeast-2.rds.amazonaws.com"
export RDS_USER="admin"
export RDS_DATABASE="myapp_db"
# 환경변수로 접속
mysql -h $RDS_ENDPOINT -u $RDS_USER -p $RDS_DATABASE
RDS 접속이 안 될 경우 보안 그룹 확인:
# RDS 보안 그룹 조회
aws rds describe-db-instances --db-instance-identifier your-db-name \
--query 'DBInstances[0].VpcSecurityGroups' --output table
# 보안 그룹 인바운드 규칙 확인
aws ec2 describe-security-groups --group-ids sg-xxxxx \
--query 'SecurityGroups[0].IpPermissions' --output table
⚠️ CloudShell에서 RDS 접속 조건:
1. RDS가 퍼블릭 액세스로 설정되어 있거나
2. CloudShell과 RDS가 같은 VPC에 있고 보안 그룹 규칙이 허용되어야 함
💡 중요: MySQL 프롬프트(
mysql>)에서는 모든 명령어 끝에;(세미콜론)을 붙여야 합니다.
-- MySQL 종료
exit;
-- 또는
quit;
-- 현재 존재하는 모든 데이터베이스 조회
SHOW DATABASES;
출력 예시:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| testdb |
+--------------------+
-- 기본 생성
CREATE DATABASE database_name;
-- UTF-8 문자열 저장 가능하게 생성
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- 이모지까지 지원 (utf8mb4 권장)
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- testdb 데이터베이스 선택
USE testdb;
-- 현재 선택된 DB 확인
SELECT DATABASE();
-- 경고 없이 삭제 (조심!)
DROP DATABASE database_name;
-- 존재할 경우에만 삭제
DROP DATABASE IF EXISTS database_name;
-- 현재 DB의 모든 테이블 조회
SHOW TABLES;
-- 다른 DB의 테이블 조회
SHOW TABLES FROM database_name;
-- 테이블 컬럼 정보 확인
DESC table_name;
-- 또는
DESCRIBE table_name;
-- 더 자세한 정보 (SQL 포함)
SHOW CREATE TABLE table_name;
출력 예시:
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar | YES | | NULL | |
+-------+----------+------+-----+---------+----------------+
-- 기본 생성
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(id)
);
-- 예: 주문 테이블
CREATE TABLE orders (
order_id INT NOT NULL AUTO_INCREMENT,
user_id INT NOT NULL,
total_price DECIMAL(10, 2),
status ENUM('pending', 'completed', 'cancelled'),
PRIMARY KEY(order_id),
FOREIGN KEY(user_id) REFERENCES users(id)
);
-- 테이블 삭제
DROP TABLE table_name;
-- 존재할 경우에만 삭제
DROP TABLE IF EXISTS table_name;
-- 외래키 제약 무시하고 삭제
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE table_name;
SET FOREIGN_KEY_CHECKS = 1;
-- 컬럼 추가
ALTER TABLE table_name ADD COLUMN new_column VARCHAR(100);
-- 컬럼 추가 (특정 위치)
ALTER TABLE table_name ADD COLUMN new_column VARCHAR(100) AFTER existing_column;
-- 컬럼 삭제
ALTER TABLE table_name DROP COLUMN column_name;
-- 컬럼 타입 변경
ALTER TABLE table_name MODIFY COLUMN column_name INT;
-- 컬럼 이름 변경
ALTER TABLE table_name RENAME COLUMN old_name TO new_name;
-- 모든 컬럼 조회
SELECT * FROM users;
-- 특정 컬럼만 조회
SELECT name, email FROM users;
-- 조건과 함께 조회
SELECT * FROM users WHERE age > 20;
-- 상위 N개만 조회
SELECT * FROM users LIMIT 10;
-- 정렬 (오름차순)
SELECT * FROM users ORDER BY age ASC;
-- 정렬 (내림차순)
SELECT * FROM users ORDER BY age DESC;
-- 여러 조건
SELECT * FROM users WHERE age > 20 AND status = 'active';
SELECT * FROM users WHERE age > 20 OR city = 'Seoul';
-- 'Seoul'로 끝나는 데이터
SELECT * FROM users WHERE city LIKE '%Seoul';
-- 'Seoul'로 시작하는 데이터
SELECT * FROM users WHERE city LIKE 'Seoul%';
-- 'Seoul'을 포함하는 데이터
SELECT * FROM users WHERE city LIKE '%Seoul%';
-- 010으로 시작하는 전화번호
SELECT * FROM users WHERE phone LIKE '010%';
-- 데이터 개수
SELECT COUNT(*) FROM users;
-- 평균값
SELECT AVG(age) FROM users;
-- 최댓값
SELECT MAX(age) FROM users;
-- 최솟값
SELECT MIN(age) FROM users;
-- 합계
SELECT SUM(price) FROM orders;
-- 그룹화
SELECT city, COUNT(*) FROM users GROUP BY city;
-- 모든 컬럼 값 입력
INSERT INTO users (id, name, email, age) VALUES (1, 'John', 'john@example.com', 25);
-- 특정 컬럼만 입력 (id는 AUTO_INCREMENT)
INSERT INTO users (name, email, age) VALUES ('Jane', 'jane@example.com', 30);
-- 여러 행 한 번에 삽입
INSERT INTO users (name, email, age) VALUES
('Alice', 'alice@example.com', 28),
('Bob', 'bob@example.com', 35),
('Charlie', 'charlie@example.com', 22);
-- 중복이면 무시
INSERT IGNORE INTO users (id, name, email) VALUES (1, 'John', 'john@example.com');
-- 중복이면 업데이트
INSERT INTO users (id, name, email) VALUES (1, 'John', 'john@example.com')
ON DUPLICATE KEY UPDATE email = VALUES(email);
-- 특정 사용자의 나이 변경
UPDATE users SET age = 26 WHERE id = 1;
-- 여러 컬럼 동시 수정
UPDATE users SET age = 30, status = 'active' WHERE id = 1;
-- 조건으로 수정
UPDATE users SET age = age + 1 WHERE age < 20;
-- 조건 여러 개
UPDATE users SET status = 'inactive'
WHERE age > 50 AND last_login < '2024-01-01';
-- 특정 행 삭제
DELETE FROM users WHERE id = 1;
-- 조건으로 삭제
DELETE FROM users WHERE age > 70;
-- 외래키 제약이 있을 때
SET FOREIGN_KEY_CHECKS = 0;
DELETE FROM users WHERE id = 1;
SET FOREIGN_KEY_CHECKS = 1;
-- 테이블의 모든 데이터 삭제 (DELETE보다 빠름)
TRUNCATE TABLE users;
-- 외래키 있을 때
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE TABLE users;
SET FOREIGN_KEY_CHECKS = 1;
# VPC 내 RDS 접속 (보안 그룹 확인 필수)
mysql -h rds-endpoint.xxxxx.ap-northeast-2.rds.amazonaws.com \
-u admin -p database_name
# 예시
mysql -h mydb.c12345.ap-northeast-2.rds.amazonaws.com \
-u admin -p myapp_db
# 포트 명시 (기본 3306)
mysql -h mydb.c12345.ap-northeast-2.rds.amazonaws.com \
-u admin -p -P 3306 myapp_db
1. RDS에서 데이터 조회 및 저장
# 특정 쿼리 결과를 파일로 저장
mysql -h RDS_ENDPOINT -u admin -p database_name \
-e "SELECT * FROM users LIMIT 10;" > users_backup.txt
# 결과 확인
cat users_backup.txt
2. SQL 파일 실행
# CloudShell 홈디렉토리에 script.sql 파일이 있는 경우
mysql -h RDS_ENDPOINT -u admin -p database_name < script.sql
# 결과를 다시 파일로 저장
mysql -h RDS_ENDPOINT -u admin -p database_name < script.sql > result.log
3. 데이터베이스 백업
# 특정 DB 백업
mysqldump -h RDS_ENDPOINT -u admin -p database_name > backup.sql
# 모든 DB 백업 (시간 오래 걸림)
mysqldump -h RDS_ENDPOINT -u admin -p --all-databases > full_backup.sql
# 특정 테이블만 백업
mysqldump -h RDS_ENDPOINT -u admin -p database_name table_name > table_backup.sql
4. 데이터 복구
# 백업 파일로부터 복구
mysql -h RDS_ENDPOINT -u admin -p database_name < backup.sql
# 진행 상황 확인
mysql -h RDS_ENDPOINT -u admin -p database_name < backup.sql 2>&1 | tail -20
# 토큰 생성
TOKEN=$(aws rds generate-db-auth-token \
--hostname mydb.c12345.ap-northeast-2.rds.amazonaws.com \
--port 3306 \
--username lambda_user \
--region ap-northeast-2)
# 토큰으로 접속
mysql -h mydb.c12345.ap-northeast-2.rds.amazonaws.com \
-u lambda_user \
--password="$TOKEN" \
--ssl-mode=REQUIRED \
--ssl-ca=/etc/ssl/certs/ca-certificates.crt \
database_name
⚠️ 주의: RDS IAM 인증 시 SSL 인증서 필요. CloudShell은 기본으로 제공
# 현재 사용 중인 저장소 확인
df -h
# home 디렉토리 확인
ls -la ~/
# S3로 중요 파일 백업
aws s3 cp backup.sql s3://my-bucket/mysql-backups/backup.sql
# S3에서 다운로드
aws s3 cp s3://my-bucket/mysql-backups/backup.sql ./
-- 현재 사용자
SELECT USER();
-- 현재 데이터베이스
SELECT DATABASE();
-- 현재 시간
SELECT NOW();
-- 특정 테이블 크기
SELECT
TABLE_NAME,
ROUND(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) AS MB
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'database_name'
ORDER BY MB DESC;
# 파일 전체 실행
mysql -u root -p database_name < /path/to/script.sql
# 결과를 파일로 저장
mysql -u root -p database_name < /path/to/script.sql > output.txt
# 특정 데이터베이스 백업
mysqldump -u root -p database_name > backup.sql
# 특정 테이블만 백업
mysqldump -u root -p database_name table_name > backup.sql
# 모든 데이터베이스 백업
mysqldump -u root -p --all-databases > all_backup.sql
| 작업 | 명령어 |
|---|---|
| 접속 | mysql -u root -p |
| DB 목록 | SHOW DATABASES; |
| DB 생성 | CREATE DATABASE db_name; |
| DB 선택 | USE db_name; |
| DB 삭제 | DROP DATABASE db_name; |
| 테이블 목록 | SHOW TABLES; |
| 테이블 구조 | DESC table_name; |
| 데이터 조회 | SELECT * FROM table_name; |
| 데이터 삽입 | INSERT INTO table_name VALUES (...); |
| 데이터 수정 | UPDATE table_name SET col = val WHERE ...; |
| 데이터 삭제 | DELETE FROM table_name WHERE ...; |
| 종료 | exit; |