이미 연결되어 사용 중인 Wi-Fi의 비밀번호를 확인하는 방법은 윈도우(Windows)와 맥(Mac) 환경에 따라 다릅니다.

각 PC 환경에 맞는 방법을 따라해 보세요.


1. Windows PC에서 확인하는 방법 (가장 간단한 방법)

윈도우 설정 메뉴를 통해 현재 연결된 Wi-Fi의 암호를 바로 확인할 수 있습니다.

  1. 제어판을 엽니다. (작업표시줄 검색창에 '제어판' 입력)
  2. 네트워크 및 인터넷 > 네트워크 및 공유 센터를 클릭합니다.
  3. '활성 네트워크 보기' 섹션에서 현재 연결된 **Wi-Fi 이름(SSID)**을 클릭합니다.
  4. 새로 뜨는 상태 창에서 무선 속성(Wireless Properties) 버튼을 누릅니다.
  5. 상단 탭 중 보안(Security) 탭을 선택합니다.
  6. 문자 표시(Show characters) 체크박스에 체크하면 '네트워크 보안 키' 항목에서 비밀번호를 확인할 수 있습니다.

2. Windows 명령 프롬프트(CMD)로 확인 (과거 접속 이력까지)

현재 연결되지 않았더라도 예전에 연결했던 모든 Wi-Fi 비밀번호를 확인할 수 있는 방법입니다.

  1. Win + R 키를 누르고 cmd를 입력하여 실행합니다.
  2. 다음 명령어를 입력하고 엔터를 누릅니다.
  3. netsh wlan show profiles
    
  4. 비밀번호를 알고 싶은 Wi-Fi 이름을 확인한 후, 아래 명령어를 입력합니다 (이름 부분에 실제 Wi-Fi 명칭 입력).
  5. netsh wlan show profile name="와이파이이름" key=clear
    
  6. 결과 내용 중 보안 설정 섹션의 키 콘텐츠(Key Content) 항목 옆에 있는 것이 비밀번호입니다.

3. Mac(macOS)에서 확인하는 방법

맥은 '키체인 접근' 앱을 통해 보안 처리된 비밀번호를 관리합니다.

  1. Command + Space를 눌러 Spotlight 검색을 켜고 **키체인 접근(Keychain Access)**을 입력해 실행합니다.
  2. 오른쪽 상단 검색창에 확인하려는 Wi-Fi 이름을 입력합니다.
  3. 목록에서 해당 항목을 더블 클릭합니다.
  4. 하단의 비밀번호 보기(Show password) 체크박스를 클릭합니다.
  5. 맥 계정 암호(로그인 암호)를 입력하면 비밀번호가 텍스트로 나타납니다.

4. 모바일 기기를 활용한 QR 코드 확인 (Windows 11)

Windows 11 사용자라면 스마트폰을 이용해 더 직관적으로 확인할 수 있습니다.

  • 설정 > 네트워크 및 인터넷 > Wi-Fi > 공유 항목으로 들어가면 QR 코드가 생성됩니다. 스마트폰 카메라로 이를 스캔하면 비밀번호가 텍스트로 표시됩니다.

 

'이것저것' 카테고리의 다른 글

Debian Linux - deb 파일 풀기  (0) 2022.03.16
리눅스 포트 사용하는 프로세스 확인  (0) 2022.02.17
Power BI 설치 및 사용하기  (0) 2022.02.15
SQLServer database 이동  (0) 2022.01.25
WSL2에 nginx 설치하기  (0) 2022.01.23

 

1. 전제 조건

  1. JDK (Java Development Kit) 설치: 자바 코드를 컴파일하고 실행할 환경이 필요합니다.
  2. Oracle JDBC 드라이버 (ojdbcX.jar): 해당 드라이버 파일을 다운로드하여 클래스 경로(CLASSPATH)에 포함해야 합니다.
    • Oracle 19c: 일반적으로 ojdbc8.jar 또는 ojdbc10.jar을 사용합니다.
  3. 데이터베이스 정보: 접속할 Oracle 인스턴스의 정보(URL, 사용자 ID, 비밀번호)를 알고 있어야 합니다.

2. Java 코드 예시 (OracleConnectionTest.java)

Java
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class OracleConnectionTest {

    // 🔑 사용자 환경에 맞게 이 값들을 수정하세요.
    private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
    // TNS Listener 포트가 기본값(1521)이고, SID가 ORCL이며, DB가 로컬에 있다고 가정
    private static final String URL = "jdbc:oracle:thin:@localhost:1521:ORCL"; 
    // 또는 Service Name을 사용하는 경우:
    // private static final String URL = "jdbc:oracle:thin:@//localhost:1521/XEPDB1"; 
    
    private static final String USER = "your_username"; // 예: SCOTT 또는 SYSTEM
    private static final String PASS = "your_password"; // 예: TIGER 또는 manager

    public static void main(String[] args) {
        Connection conn = null;

        try {
            // 1. JDBC 드라이버 로드 (Class.forName)
            Class.forName(DRIVER);
            System.out.println("✅ JDBC 드라이버 로드 성공.");

            // 2. 데이터베이스 연결 (DriverManager.getConnection)
            conn = DriverManager.getConnection(URL, USER, PASS);
            System.out.println("🎉 데이터베이스 연결 성공!");
            System.out.println("DB 연결 정보: " + conn.getMetaData().getDatabaseProductName() + " " + conn.getMetaData().getDatabaseProductVersion());

        } catch (ClassNotFoundException e) {
            System.err.println("❌ JDBC 드라이버를 찾을 수 없습니다. CLASSPATH 설정을 확인하세요.");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("❌ 데이터베이스 연결 실패!");
            System.err.println("오류 코드: " + e.getErrorCode());
            System.err.println("오류 메시지: " + e.getMessage());
            e.printStackTrace();
        } finally {
            // 3. 연결 닫기
            if (conn != null) {
                try {
                    conn.close();
                    System.out.println("연결 종료.");
                } catch (SQLException e) {
                    System.err.println("연결 종료 중 오류 발생: " + e.getMessage());
                }
            }
        }
    }
}

3. 컴파일 및 실행 방법

  1. 파일 저장: 코드를 OracleConnectionTest.java 파일로 저장합니다.
  2. ojdbcX.jar 준비: Oracle 드라이버 파일(ojdbc8.jar 등)을 소스 코드가 있는 디렉토리에 복사합니다.
  3. 컴파일: 터미널/명령 프롬프트에서 컴파일합니다.
  4. Bash
     
    # ojdbc8.jar 파일이 현재 디렉토리에 있다고 가정
    javac -cp ojdbc8.jar OracleConnectionTest.java
    
  5. 실행: 컴파일된 클래스 파일을 실행합니다.
  6. Bash
     
    java -cp .:ojdbc8.jar OracleConnectionTest
    # (Windows 환경: java -cp .;ojdbc8.jar OracleConnectionTest)
    

예상 출력 (성공 시)

✅ JDBC 드라이버 로드 성공.
🎉 데이터베이스 연결 성공!
DB 연결 정보: Oracle 19.0.0.0.0
연결 종료.

예상 출력 (실패 시 - 비밀번호 오류 등)

✅ JDBC 드라이버 로드 성공.
❌ 데이터베이스 연결 실패!
오류 코드: 1017
오류 메시지: ORA-01017: invalid username/password; logon denied
... (Java Stack Trace)

 

'ORACLE' 카테고리의 다른 글

Oracle HR ERD  (0) 2022.02.03
Oracle hint  (0) 2022.02.02
DBMS_XPLAN 패키지 실행 권한  (0) 2022.02.01
Oracle - 실행계획 보는 방법  (0) 2022.01.31
오라클 bind 변수 길이에 따른 bind mismatch  (0) 2022.01.02

MySQL에서 자동으로 파티션을 추가하기 위해 MySQL의 event와 procedure를 활용한다.

 

1) 프로시져 생성

2) event 생성

 

1. 프로시저 생성

파티션된 테이블에 maxvalue 파티션이 없는 경우와 maxvalue 파티션이 있는 경우에 대해 각각 파티션을 추가하는 프로시저이다. 

1) maxvalue 가 없는 파티션인 경우

maxvalue가 없는 파티션 테이블

CREATE TABLE sales (
    sale_id INT NOT NULL,
    sale_date DATETIME NOT NULL,
    customer_id INT NOT NULL,
    amount DECIMAL(10,2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (TO_DAYS(sale_date)) (
    PARTITION p_2025_01 VALUES LESS THAN (TO_DAYS('2025-02-01')),
    PARTITION p_2025_02 VALUES LESS THAN (TO_DAYS('2025-03-01')),
    PARTITION p_2025_03 VALUES LESS THAN (TO_DAYS('2025-04-01')),
    PARTITION p_2025_04 VALUES LESS THAN (TO_DAYS('2025-05-01'))
);

 

자동으로 매월 새로운 파티션을 추가하는 프로시저

DELIMITER //

CREATE PROCEDURE pr_monthly_add_partition(IN partition_time DATETIME)
BEGIN
    SET @sql = CONCAT(
        'ALTER TABLE sales ADD PARTITION (',
        'PARTITION p_', DATE_FORMAT(DATE_SUB(DATE_FORMAT(partition_time, '%Y%m%d'), interval  1 month), '%Y_%m'), 
        ' VALUES LESS THAN (', TO_DAYS(partition_time), '));'
    );
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //

DELIMITER ;

 

파티션 추가를 위한 프로시저 호출

CALL pr_monthly_add_partition('2025-06-01');

 

2) maxvalue 가 있는 파티션인 경우

maxvalue가 있는 파티션 테이블

CREATE TABLE sales_max (
    sale_id INT NOT NULL,
    sale_date DATETIME NOT NULL,
    customer_id INT NOT NULL,
    amount DECIMAL(10,2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (TO_DAYS(sale_date)) (
    PARTITION p_2025_01 VALUES LESS THAN (TO_DAYS('2025-02-01')),
    PARTITION p_2025_02 VALUES LESS THAN (TO_DAYS('2025-03-01')),
    PARTITION p_2025_03 VALUES LESS THAN (TO_DAYS('2025-04-01')),
    PARTITION p_2025_04 VALUES LESS THAN (TO_DAYS('2025-05-01')),
    PARTITION p_maxvalue VALUES LESS THAN MAXVALUE
);

 

DELIMITER //

CREATE PROCEDURE pr_monthly_add_partition_max(IN partition_time DATETIME)
BEGIN
    SET @sql = CONCAT(
        'ALTER TABLE sales_max REORGANIZE PARTITION p_maxvalue INTO(\n',
        'PARTITION p_', DATE_FORMAT(partition_time, '%Y_%m'), ' VALUES LESS THAN (', TO_DAYS(partition_time), '),\n',
        'PARTITION p_maxvalue', ' VALUES LESS THAN MAXVALUE);');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
END //

DELIMITER ;

 

파티션 추가를 위한 프로시저 호출

CALL pr_monthly_add_partition_max('2025-06-01');

 

2. event 생성

위에서 생성한 프로시저를 event로 등록하여 필요한 시점에 수행되도록 한다.

event를 수행하기 위해서는 event_scheduler가 ON 으로 설정되어 있어야 한다.

 

이벤트 스케줄러 활성화

SET GLOBAL event_scheduler = ON;

 

매달 1일 자동 실행되는 EVENT 생성

매달 1일에 자동으로 파티션을 추가하는 event를 생성한다. event는 매달 1일 00:00:00 에 수행된다.

CREATE EVENT ev_monthly_add_partition
ON SCHEDULE EVERY 1 MONTH
STARTS TIMESTAMP(LAST_DAY(CURRENT_DATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY)

ON COMPLETION PRESERVE COMMENT '매달 1일에 파티션 추가 EVENT'
DO CALL pr_monthly_add_partition(DATE_FORMAT(LAST_DAY(CURRENT_DATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY, '%Y-%m-%d'));

 

만일, 매달 1일 01:00 수행하기를 원하면

STARTS TIMESTAMP(LAST_DAY(CURRENT_DATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY)를

STARTS TIMESTAMP(LAST_DAY(CURRENT_DATE() - INTERVAL 1 MONTH) + INTERVAL 25 HOUR) 로 수정하면 된다.

위와 같은 방법으로 수행하기를 원하는 시분초를 지정할 수 있다.

 

'MySQL' 카테고리의 다른 글

MySQL uptime  (0) 2025.03.27
MySQL event란  (0) 2024.12.05
MySQL Lock 발생  (0) 2023.09.22
MySQL - stored procedure 성능  (0) 2023.06.29
MySQL - Delimiter  (0) 2023.04.10

DATE, DATETIME, TIMESTAMP 데이터타입의 컬럼으로 파티션을 생성, 추가, 삭제 하는 예제입니다.

 

 

파티션테이블 생성

1) DATE, DATETIME 컬럼으로 파티션

아래는 월별 파티션 예제입니다.

1-1) TO_DAYS 함수 사용

CREATE TABLE sales (
    sale_id INT NOT NULL,
    sale_date DATE NOT NULL,
    customer_id INT NOT NULL,
    amount DECIMAL(10,2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE (TO_DAYS(sale_date)) (
    PARTITION p_2024_01 VALUES LESS THAN (TO_DAYS('2024-02-01')),
    PARTITION p_2024_02 VALUES LESS THAN (TO_DAYS('2024-03-01')),
    PARTITION p_2024_03 VALUES LESS THAN (TO_DAYS('2024-04-01')),
    PARTITION p_2024_04 VALUES LESS THAN (TO_DAYS('2024-05-01')),
    PARTITION p_maxvalue VALUES LESS THAN MAXVALUE
);

Range 파티션은 값으로 int 형 데이터가 와야 하기 때문에 TO_DAYS 함수를 사용.

 

설명:

  • TO_DAYS(sale_date) 함수는 분할을 위해 날짜를 숫자 값으로 변환
  • 각 파티션은 특정 월(예: 2024년 1월, 2024년 2월 등)을 기준으로 정의
  • p_maxvalue 파티션은 2024년 4월보다 큰 모든 데이터를 적재

 

✔ TO_DAYS 함수를 사용하는 이유 : Range 파티션은 값으로 int 형 데이터가 와야 하기 때문

 

1-2) 날짜형식의 String으로 사용

DATE 또는 DATETIME 열을 분할 열로 사용하여 RANGE COLUMNS로 테이블을 분할합니다. 

CREATE TABLE sales_1 (
    sale_id INT NOT NULL,
    sale_date DATE NOT NULL,
    customer_id INT NOT NULL,
    amount DECIMAL(10,2),
    PRIMARY KEY (sale_id, sale_date)
)
PARTITION BY RANGE COLUMNS(sale_date) (
    PARTITION p_2024_01 VALUES LESS THAN ('2024-02-01'),
    PARTITION p_2024_02 VALUES LESS THAN ('2024-03-01'),
    PARTITION p_2024_03 VALUES LESS THAN ('2024-04-01'),
    PARTITION p_2024_04 VALUES LESS THAN ('2024-05-01'),
    PARTITION p_maxvalue VALUES LESS THAN MAXVALUE
);

 

2) TIMESTAMP 컬럼으로 파티션

UNIX_TIMESTAMP() 함수를 사용해서 파티셔닝 한다.

MySQL 8.4에서는 UNIX_TIMESTAMP() 함수를 사용하여 TIMESTAMP 열의 값을 기준으로 RANGE로 테이블을 분할할 수 있다.

CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

 

 

파티션 추가

1) 파티션 테이블이 MAXVALUE로 구성되어 있는 경우에는 REORGANIXE PRTITION 명령어로 기존 MAXVALUE 파티션을 나눈다.

ALTER TABLE sales REORGANIZE PARTITION p_maxvalue INTO(
    PARTITION p_2024_05 VALUES LESS THAN (TO_DAYS('2024-06-01')),
    PARTITION p_maxvalue VALUES LESS THAN MAXVALUE);

 

2) 파티션 테이블이 MAXVALUE로 구성되어 있지 않은 경우에는 ADD PRTITION 명령어로 파티션을 추가한다.

ALTER TABLE sales ADD PARTITION (
    PARTITION p_2024_05 VALUES LESS THAN (TO_DAYS('2024-06-01'))
);

 

파티션 삭제

삭제하고자 하는 파티션을 DROP PARTITION 명령어로 삭제한다. 아래는 p_2024_01 파티션을 삭제하는 예제이다.

ALTER TABLE sales DROP PARTITION p_2024_01;

 

MySQL DB의 구동시간을 알 수 있는 방법은 여러가지가 있다.

 

1) SHOW STATUS 로 확인

결과값은 초로 표시된다.

SHOW STATUS LIKE 'Uptime';
[결과값]
Uptime 144931

 

2) Dictionary Table 로 확인

performance_schema.global_status 의 Uptime 값은 초로 표시되기 때문에 초를 시분으로 변환하여 조회

-- Uptime 을 시분 형식으로 표시
SELECT TIME_FORMAT(SEC_TO_TIME(variable_value ),'%H시간 %i분') as Uptime

       FROM performance_schema.global_status 
       WHERE variable_name='Uptime';
[결과값]
40시간 16분

-- Uptime 을 datetime 형식으로 표시
SELECT FROM_UNIXTIME(UNIX_TIMESTAMP() - variable_value) as Uptime
       FROM performance_schema.global_status 
       WHERE variable_name='Uptime';
[결과값]
2025-03-25 07:31:29.000000

 

3) mysql 명령어로 확인

# mysql -u<user> -p<password> -e "status;" | grep -i "uptime"
[결과값]
Uptime:  2 days 26 min 56 sec

<user>, <password> 는 각자의 DB에서 사용하는 user와 패스워드를 입력

 

3) mysqladmin status 명령어로 확인

# mysqladmin status -u<user> -p<password> 
[결과값]
Uptime: 145329  Threads: 9  Questions: 46314  Slow queries: 0  Opens: 478  Flush tables: 3  Open tables: 399  Queries per second avg: 0.318

<user>, <password> 는 각자의 DB에서 사용하는 user와 패스워드를 입력

 

4) mysqladmin version 명령어로 확인

# mysqladmin version -u<user> -p<password> | grep -i "uptime"
[결과값]
Uptime:                 1 day 16 hours 24 min 51 sec

<user>, <password> 는 각자의 DB에서 사용하는 user와 패스워드를 입력

'MySQL' 카테고리의 다른 글

MySQL - 자동으로 파티션 추가 프로시저/Event  (0) 2025.03.31
MySQL event란  (0) 2024.12.05
MySQL Lock 발생  (0) 2023.09.22
MySQL - stored procedure 성능  (0) 2023.06.29
MySQL - Delimiter  (0) 2023.04.10

 

MySQL event란

MySQL 이벤트는 일정에 따라 실행되는 작업입니다. 예약된 이벤트라고 합니다. 이벤트를 만들면 주기적인 간격으로 실행할 SQL 문이 포함된 데이터베이스 객체를 만들고, 특정 시간에 시작합니다. Unix crontab (일명 " cron job " ) 또는 Windows 작업 스케줄러와 유사합니다.

 

Event 관리 - 생성/수정/삭제

1) Event Scheduler 활성화

이벤트를 실행하려면 Event Scheduler가 활성화되어 있어야 합니다. Event Scheduler가 활성화되어 있지 않다면 아래 명령어로 활성화시킵니다.

SET GLOBAL event_scheduler = ON;

 

2) Event 생성 권한

이벤트가 생성될 스키마에 대한 권한이 필요합니다. Event 생성 권한이 없다면 아래와 같이 EVENT 권한을 부여합니다. 이벤트는 schema 레벨의 권한이므로 테이블 레벨로 권한을 부여할 수 없습니다.

GRANT EVENT ON schemaname.* TO username@'%";

 

 

3) Event 생성

아래는 Event 생성 예시입니다.

CREATE EVENT myevent
    ON SCHEDULE AT TIMESTAMP(CURRENT_DATE) + INTERVAL 1 HOUR
    DO
      UPDATE myschema.mytable SET mycol = mycol + 1;

myevent라는 이름의 이벤트를 생성합니다 .

이 이벤트는 1시간에 한 번씩 mytable 테이블의 mycol 컬럼값을 1씩 증가시키는 SQL 명령문을 실행합니다. 

 

4) 이벤트 수정

이벤트를 수정하려면 'ALTER EVENT' 명령을 사용합니다.

이벤트의 여러 특성을 변경할 수 있습니다.

이 예제에서는 에서 실행되는 SQL 명령문을 myevent에서 모든 레코드를 삭제하고 하루에 한 번(01 시) 실행되도록 변경합니다.

ALTER EVENT myevent
    ON SCHEDULE
      AT TIMESTAMP(CURRENT_DATE) + INTERVAL 1 DAY + INTERVAL 1 HOUR
    DO
      TRUNCATE TABLE myschema.mytable;

 

5) 이벤트 활성화

ENABLE 명령어로 Event를 비활성화합니다. 

ALTER EVENT myevent ENABLE;

 

6) 이벤트 비활성화

DISABLE 명령어로 Event를 비활성화합니다. 

ALTER EVENT myevent DISABLE;

 

7) 이벤트 Drop

DISABLE 명령어로 Event를 비활성화합니다. 

DROP EVENT myevent ;

 

8) Event 조회

데이터베이스의 모든 이벤트를 확인합니다.

SELECT * FROM information_schema.EVENTS;

 

 

CREATE EVENT 옵션

CREATE
    [DEFINER = user]
    EVENT
    [IF NOT EXISTS]
    event_name
    ON SCHEDULE schedule
    [ON COMPLETION [NOT] PRESERVE]
    [ENABLE | DISABLE | DISABLE ON {REPLICA | SLAVE}]
    [COMMENT 'string']
    DO event_body;

schedule: {
    AT timestamp [+ INTERVAL interval] ...
  | EVERY interval
    [STARTS timestamp [+ INTERVAL interval] ...]
    [ENDS timestamp [+ INTERVAL interval] ...]
}

interval:
    quantity {YEAR | QUARTER | MONTH | DAY | HOUR | MINUTE |
              WEEK | SECOND | YEAR_MONTH | DAY_HOUR | DAY_MINUTE |
              DAY_SECOND | HOUR_MINUTE | HOUR_SECOND | MINUTE_SECOND}

 

*** Event 생성 옵션 중 설명

- STARTS 와 ENDS 가 정의된 상태에서 ON COMPLETION NOT PRESERVE 옵션은 Event를 Drop 하고 

ON COMPLETION PRESERVE 옵션은 Event를 유지한다.

 

 

'MySQL' 카테고리의 다른 글

MySQL - 자동으로 파티션 추가 프로시저/Event  (0) 2025.03.31
MySQL uptime  (0) 2025.03.27
MySQL Lock 발생  (0) 2023.09.22
MySQL - stored procedure 성능  (0) 2023.06.29
MySQL - Delimiter  (0) 2023.04.10

 

 

  • Global privileges : 전역 권한은 서버의 모든 데이터베이스에 적용됩니다. 관리 권한은 사용자가 MySQL 서버의 작업을 관리할 수 있게 하고 특정 데이터베이스에만 국한되지 않기 때문에 글로벌 그룹에 속합니다.(mysql.user, information_schema.user_privileges)
  • Database privileges : 데이터베이스 권한은 MySQL 인스턴스의 특정 데이터베이스와 해당 데이터베이스 내의 모든 개체(예: 테이블, 컬럼, 뷰)에 적용됩니다. 데이터베이스 권한을 전역적으로 부여할 수도 있습니다. (mysql.db)
  • Proxy privileges : 프록시 권한을 사용하면 사용자는 다른 사용자에게 부여된 권한을 갖고 있는 것처럼 행동할 수 있습니다.
  • Privileges for database objects : 데이터베이스 개체(테이블, 열, 저장 루틴, 뷰 등)에 대한 권한은 특정 데이터베이스 내의 한 유형의 모든 개체 또는 특정 테이블이나 뷰와 같은 특정 개체에 적용될 수 있습니다. 데이터베이스 개체 권한을 전역적으로 부여할 수도 있습니다.

 

테이블이나 컬럼의 character set 이 상이한 경우 인덱스가 존재하더라도, Full Table Scan으로 수행될 수 있다.

 

1) character set이 다른 2개의 테이블 생성

country와 city라는 2개의 테이블을 생성한다. city의 CountryCode는 country 테이블의 Code값을 가지고 있다.

 CREATE TABLE `country` (
   `Code` char(3) NOT NULL DEFAULT '',
   `Name` char(52) NOT NULL DEFAULT '',
   `Continent` enum('Asia','Europe','North America','Africa','Oceania','Antarctica','South America') NOT NULL DEFAULT 'Asia',
   `Region` char(26) NOT NULL DEFAULT '',
    PRIMARY KEY (`Code`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ;

 

 CREATE TABLE `city` (
   `ID` int NOT NULL AUTO_INCREMENT,
   `Name` char(35) NOT NULL DEFAULT '',
   `CountryCode` char(3) NOT NULL DEFAULT '',
   `District` char(20) NOT NULL DEFAULT '',
   `Population` int NOT NULL DEFAULT '0',
   PRIMARY KEY (`ID`),
   KEY `CountryCode` (`CountryCode`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

 

2) JOIN

country와 city 테이블을 JOIN하여 조회한다.

 select *
 from country a, city b
 where a.code = b.CountryCode
 and a.code = 'AFG';

 

3) 실행계획 보기

MySQL Workbench 로 실행계획을 확인한다.

character set이 상이한 테이블을 join한 결과 인덱스가 존재함에도 Full Table Scan 하는 것을 볼 수 있다.

4) character set 변경

city 테이블의 character set을 country 테이블의 character set과 동일하게 변경한다.

 alter table city convert to character set utf8mb4;

 

5) 실행계획 확인

MySQL Workbench 로 실행계획을 확인한다.

정상적으로 인덱스 Scan을 확인할 수 있다.

6) 결론

Character Set이 상이한 경우에 정상적으로 인덱스를 타지 않을 수 있으므로, 특별한 경우가 아니라면 동일한 character set을 설정하도록 한다.

+ Recent posts