카테고리 보관물:  IT

MySQL Operation, Maintenance

개요

MySQL Operation 및 유지관리에 자주 사용하는 명령어를 정리합니다. 데이터베이스/테이블 조회, 사용자 권한 관리, 프로세스 모니터링, 서비스 시작/중지 방법을 빠르게 참조할 수 있는 운영 레퍼런스입니다.

MySQL Operation

  • DB 구성 상태 확인
> show databases;
// 데이터베이스 목록 보기

> show tables;
// 테이블 목록 보기

> show columns from 'table name';
// 테이블 칼럼 목록 보기

> SHOW VARIABLES LIKE 'c%';
// 캐릭터셋 보기

MySQL Maintenance

  • DBMS 상태 확인
> show status;
// MySQL 데이타베이스의 현재 상황

> show Processlist;
// MySQL 프로세스 목록

> show variables
// 설정 가능한 모든 변수 목록

> SELECT table_schema "Database Name",  SUM(data_length + index_length) / 1024 / 1024 "Size(MB)"  FROM information_schema.TABLES  GROUP BY table_schema;
// DB별 사용량 확인

SELECT table_name, table_rows, round(data_length/(1024*1024),2) as 'DATA_SIZE(MB)', round(index_length/(1024*1024),2) as 'INDEX_SIZE(MB)' FROM information_schema.TABLES where table_schema = '데이터베이스이름' GROUP BY table_name ORDER BY data_length DESC LIMIT 20;
// 해당 DB의 테이블 사이즈 상위 20개 정렬
  • Connection 및 Client 상태 확인
> show variables like '%max_connection%';
// 최대 커넥션 가능 수량 확인

> show status like '%connect%';
// 커넥션 연결 상태 확인

> show status like '%clients%';
// 클라이언트 연결 상태 확인

> show status like '%thread%';
// 쓰레드 상태 확인
Topic Desc
Aborted_clients 클라이언트 프로그램이 비 정상적으로 종료된 수
Aborted_connects MySQL 서버에 접속이 실패된 수
Max_used_connections 최대로 동시에 접속한 수
Threads_cached Thread Cache의 Thread 수
Threads_connected 현재 연결된 Thread 수
Threads_created 접속을 위해 생성된 Thread 수
Threads_running Sleeping 되어 있지 않은 Thread 수
wait_timeout 종료전까지 요청이 없이 기다리는 시간 (TCP/IP 연결, Shell 상의 접속이 아닌 경우)
thread_cache_size thread 재 사용을 위한 Thread Cache 수로써, Cache 에 있는 Thread 수보다 접속이 많으면 새롭게 Thread를 생성한다.
max_connections 최대 동시 접속 가능 수
참고값

사용자 및 권한 관리

MySQL/MariaDB 운영에서 계정 관리는 보안의 핵심입니다. 애플리케이션별로 전용 계정을 만들고 필요한 권한만 부여하는 최소 권한 원칙(Principle of Least Privilege)을 따르는 것이 중요합니다. 아래는 자주 사용하는 사용자 생성, 권한 부여, 확인 명령어입니다.

-- 사용자 생성 (특정 호스트에서만 접속 허용)
CREATE USER 'app_user'@'x.x.x.x' IDENTIFIED BY '<REDACTED>';

-- DB 전체 권한 부여
GRANT ALL PRIVILEGES ON mydb.* TO 'app_user'@'x.x.x.x';

-- 특정 권한만 부여 (읽기 전용 계정)
GRANT SELECT ON mydb.* TO 'readonly_user'@'%';

-- 모니터링 계정 권한 부여
GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'localhost';

-- 권한 목록 확인
SHOW GRANTS FOR 'app_user'@'x.x.x.x';

-- 권한 즉시 반영
FLUSH PRIVILEGES;

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

계정의 접속 호스트를 '%'(모든 호스트)로 지정하면 편리하지만 보안 위협이 증가합니다. 내부 서비스 계정은 가능하면 특정 IP 또는 서브넷으로 제한하고, 외부에서의 직접 DB 접근은 방화벽으로 차단하는 것이 권장됩니다.

서비스 관리

MySQL/MariaDB 서비스의 시작, 중지, 재시작, 상태 확인은 운영 중 가장 자주 실행하는 명령입니다. 서비스 재시작 전에는 반드시 현재 접속된 세션 수(SHOW STATUS LIKE '%connect%')를 확인하여 영향을 최소화해야 합니다.

# systemd 기반 (RHEL 7+, Ubuntu 16.04+)
systemctl start mariadb      # 시작
systemctl stop mariadb       # 중지
systemctl restart mariadb    # 재시작
systemctl status mariadb     # 상태 확인
systemctl enable mariadb     # 부팅 시 자동 시작 등록

# 설정 파일 변경 후 재시작 없이 일부 변수 반영
mysql -u root -p -e "SET GLOBAL max_connections = 500;"

데이터 디렉토리 기본 경로는 /var/lib/mysql이며, 용량이 부족하면 서비스가 비정상 종료될 수 있습니다. df -h /var/lib/mysql로 주기적으로 용량을 확인하고, slow query log(slow_query_log = 1)를 활성화하면 성능 병목 쿼리를 사전에 파악할 수 있습니다.

Slow Query 및 성능 모니터링

MySQL/MariaDB에서 성능 문제를 진단할 때 가장 먼저 확인하는 것이 Slow Query Log입니다. 설정된 임계값(long_query_time, 기본 10초)을 초과하는 쿼리를 자동으로 기록합니다. 운영 서버에서는 1~2초로 설정하여 느린 쿼리를 사전에 파악합니다. 설정 파일(my.cnf)에서 활성화하거나 서비스 재시작 없이 동적으로 설정할 수 있습니다.

-- Slow Query 설정 확인
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';

-- 동적으로 Slow Query Log 활성화 (재시작 불필요)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';

-- 현재 실행 중인 쿼리 중 오래 걸리는 것 확인
SELECT * FROM information_schema.PROCESSLIST WHERE TIME > 5 ORDER BY TIME DESC;

Slow Query 로그는 mysqldumpslow 도구로 분석하면 가장 오래 걸린 쿼리, 가장 많이 호출된 쿼리를 빠르게 파악할 수 있습니다. 식별된 쿼리에 인덱스를 추가하거나 쿼리를 개선하여 성능을 향상시킵니다.

참고

참고 문서: MySQL SQL 문법 공식 문서 · MySQL 계정 관리 문법

Oracle Start, Stop

개요

Oracle Database의 시작(startup)과 종료(shutdown) 절차를 정리합니다. sqlplus를 통해 DB 인스턴스를 시작/종료하는 방법과 Listener 시작/종료 명령어, 그리고 운영 환경에서 자주 사용하는 startup/shutdown 옵션을 다룹니다.

Oracle 인스턴스 시작/종료 모드

Oracle Database는 단순 시작/종료가 아닌 여러 단계와 모드를 지원합니다. startup에는 NOMOUNT(파라미터 파일만 읽기), MOUNT(컨트롤 파일 읽기), OPEN(전체 운영) 세 단계가 있습니다. 일반 운영은 startup(OPEN)으로 충분하며, 복구 작업이나 리두 로그 변경은 MOUNT 단계가 필요합니다.

shutdown에는 NORMAL(모든 세션 종료 대기), IMMEDIATE(현재 트랜잭션 롤백 후 종료), TRANSACTIONAL(트랜잭션 완료 후 종료), ABORT(강제 종료, DB 불일치 가능성 있음)가 있습니다. 운영 환경에서는 ABORT는 최후 수단으로만 사용하고 IMMEDIATE를 권장합니다.

오라클 서버 시작, 종료

  • 오라클 서버의 MA(Maintenance)를 위해서는 서비스를 종료, 시작 하는 과정이 필요합니다.
  • 당연한 것이지만 오라클 서비스가 종료되기전에 DBMS와 연결된 커넥션을 모두 해제 해야 됩니다. 보통 WAS나 AP를 종료 시키는 것이 일련의 과정입니다.
  • WAS와 AP 종료 후 Client 연결 상태 확인( 기본적으로는 커넥션을 맺은 계정명만 확인이 가능합니다.) 출처>https://stackoverflow.com/questions/1043096/how-to-list-active-open-connections-in-oracle
$ sqlplus / as sysdba
// sysdba 권한을 가진 계정으로 진행

SQL> SELECT username FROM v$session WHERE username IS NOT NULL ORDER BY username ASC;
  • 서비스 종료(오라클 서비스 제어용 계정으로 진행)
$ sqlplus / as sysdba

SQL> shutdown immediate
SQL> exit

$ lsnrctl stop
  • 서비스 시작(MA등의 작업 종료후 오라클 서비스 제어용 계정으로 진행)
$ lsnrctl start

$ sqlplus / as sysdba

SQL> startup
  • WAS나 AP를 기동시켜 검증이 가능하겠지만 보통 정상적으로 데이터 조회가 가능한지 먼저 검증을 해보는 것이 좋습니다.

리스너(Listener) 관리

Oracle Listener는 클라이언트의 접속 요청을 수신하는 네트워크 프로세스입니다. DB 인스턴스와 별도로 동작하므로 DB가 기동되어도 Listener가 중지되면 외부 클라이언트가 접속할 수 없습니다. Listener 설정은 $ORACLE_HOME/network/admin/listener.ora에서 관리합니다.

-- Listener 상태 확인 (Oracle 계정에서 실행)
$ lsnrctl status

-- Listener 로그 확인 (접속 오류 진단)
$ lsnrctl show log_status

-- 동적 서비스 등록 확인 (DB가 기동된 경우 자동 등록)
$ lsnrctl services

Oracle 서비스 시작 순서는 Listener 시작 → DB 인스턴스 시작이며, 종료 순서는 반대입니다. 자동 시작이 필요한 환경에서는 /etc/oratab에 자동 시작 플래그를 Y로 설정하고 dbstart/dbshut 스크립트를 OS 시작/종료 훅에 등록합니다.

현재 세션 및 프로세스 확인

Oracle DB 재기동 전에 현재 접속 중인 세션과 실행 중인 트랜잭션을 확인하면 불필요한 롤백과 데이터 불일치를 예방할 수 있습니다. V$SESSION 뷰에서 활성 세션 수를 확인하고, 필요한 경우 애플리케이션 측에서 연결을 먼저 끊거나 유지보수 모드로 전환한 후 DB를 종료합니다.

-- 현재 활성 세션 수 확인
SELECT COUNT(*) FROM V$SESSION WHERE STATUS = 'ACTIVE';

-- 세션별 사용자 및 프로그램 확인
SELECT SID, SERIAL#, USERNAME, STATUS, PROGRAM FROM V$SESSION
WHERE TYPE = 'USER' ORDER BY STATUS;

참고

참고 문서: Oracle Listener Control Utility (lsnrctl) · Oracle 10g Startup/Shutdown 가이드

Oracle JDBC Connection

개요

Java 애플리케이션에서 Oracle JDBC 드라이버를 사용해 Oracle 데이터베이스에 연결하는 방법을 정리합니다. ojdbc jar 파일 추가, Connection URL 형식, JNDI DataSource 설정 등 Oracle JDBC 연동에 필요한 핵심 설정을 다룹니다.

Oracle JDBC URL 형식

Oracle JDBC 연결 URL은 세 가지 형식을 지원합니다. 가장 일반적인 Thin 드라이버 방식은 순수 Java로 구현되어 Oracle 클라이언트 소프트웨어 없이 동작합니다. SID 기반 URL과 서비스명 기반 URL 중 서버 환경에 맞는 형식을 사용합니다.

// SID 기반 (구형, 단일 인스턴스)
jdbc:oracle:thin:@x.x.x.x:1521:orcl

// 서비스명 기반 (권장, RAC/CDB/PDB 환경 지원)
jdbc:oracle:thin:@x.x.x.x:1521/orclpdb

// TNS 이름 기반 (tnsnames.ora 파일 필요)
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=x.x.x.x)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=orcl)))

Oracle 11g 이하는 ojdbc6.jar, Oracle 12c 이상은 ojdbc8.jar를 사용합니다. ojdbc는 Oracle 사이트 또는 Maven Central에서 다운로드할 수 있습니다. Maven 프로젝트에서는 pom.xml에 ojdbc 의존성을 추가합니다.

JAVA에서 오라클 JDBC Driver를 연결하는 방법

  • JAVA 어플리케이션에서 드라이버(ojdbc)를 통해 오라클 DBMS와 연결을 가능하게 해줍니다.
  • ojdbc 드라이버는 오라클 DBMS의 설치 경로에서 확인이 가능합니다. (ex> oracle/product/11.2.0/db_1/jdbc/lib/ojdbc6.jar)
  • 해당 ojdbc 드라이버 파일을 JAVA의 Classpath에 복사 또는 별도도 지정해줘야 import가 가능 합니다. (이클립스에서는 해당 프로젝트 > Build Path > Configure Build Path > Add External JARs > 해당 드라이버 추가)
  • JAVA 코드 예시(Oracle 11G 기준)
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Connection;

public class jdbc_connect {

    public static void main(String[] args) {
        String driver = "oracle.jdbc.driver.OracleDriver";
        String url = "jdbc:oracle:thin:@x.x.x.x:1521:orcl";
        String user = "tester";
        String password = "tester";
        Connection conn = null;

        try {
            Class.forName(driver);
            System.out.println("jdbc driver loading success");
            conn = DriverManager.getConnection(url, user, password);
            System.out.println("Oracle connection seccess");

        } catch (ClassNotFoundException e) {
            System.out.println("jdbc driver loading failure");
        } catch (SQLException e) {
            System.out.println("Oracle connection failure");
        }
        try {
            conn.close();
        } catch (SQLException e) {
            System.out.println("connection close failure");
        }
    }
}

Connection Pool (HikariCP) 설정

실제 애플리케이션에서는 매번 Connection을 새로 생성하지 않고 Connection Pool을 사용합니다. Spring Boot 기본 커넥션 풀인 HikariCP에서 Oracle JDBC를 설정하는 방법은 아래와 같습니다. application.yml에 JDBC URL, 계정 정보, 풀 크기를 지정합니다.

spring:
  datasource:
    url: jdbc:oracle:thin:@x.x.x.x:1521/orclpdb
    username: app_user
    password: <REDACTED>
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      maximum-pool-size: 10
      minimum-idle: 2
      connection-timeout: 30000

커넥션 풀 크기는 서버의 CPU 코어 수와 쿼리 응답 시간을 고려해 결정합니다. Oracle 세션 수 제한(sessions 파라미터)을 초과하지 않도록 모든 애플리케이션 인스턴스의 pool size 합산을 관리해야 합니다.

주요 예외 처리와 연결 검증

Oracle JDBC 사용 시 자주 발생하는 예외를 이해하면 디버깅 시간을 크게 줄일 수 있습니다. ORA-12541: No listener는 Listener가 중지된 경우, ORA-01017: invalid username/password는 계정 정보 오류, ORA-00942: table or view does not exist는 권한 부족 또는 오브젝트 미존재 상황입니다. 연결 성공 여부는 connection.isValid(timeout)으로 확인할 수 있으며, 커넥션 풀에서는 connectionTestQuery=SELECT 1 FROM DUAL로 주기적으로 연결 상태를 검증합니다.

참고

참고 문서: Oracle JDBC Maven Central 가이드 · Oracle JDBC Connection URL 형식