Today
Total
KoreanEnglishFrenchGermanJapaneseSpanishChinese (Simplified)
관리 메뉴

DB & AWS Knowledge

MySQL/MariaDB 명령어 : RENAME TABLE 본문

MySQL/명령어

MySQL/MariaDB 명령어 : RENAME TABLE

`O` 2021. 6. 21. 02:54
728x90
반응형

해당 페이지에서는 MySQL/MariaDB RENAME TABLE 에 대해서 다룬다.

 

참조 페이지

 

https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

 

연관 페이지 (해당 페이지를 읽기전 아래의 링크를 한번 읽고 오면 좋다.)

2021.06.22 - [PostgreSQL/명령어] - PostgreSQL 명령어 : ALTER - RENAME

 

 

RENAME TABLE 명령어의 의의

 

RENAME TABLE 은 말 그대로 테이블의 이름을 변경하는 명령어다.

개발이나 기타 테스트등의 목적으로 테스트 테이블을 생성하다보면, 테이블 이름을 잘못 명명했거나 내부 규정등의 기타 사유로 이름을 변경해야 할 경우가 있다.

 

물론 DROP TABLE 로 완전 삭제하고 다시 만드는 방법이 있으나 실제로 테이블내에 대량의 데이터가 들어가 있어서 DROP 을 하고 다시 생성을 하게 되면 데이터를 다시 기입하거나 DROP 전 테이블의 데이터를 미리 추출해 놓은 후 import 하는 등의 방법으로 시간을 들여서 데이터를 넣어야 한다. 그러한 데이터 기입 시간을 절약 및 데이터 보존에 있어서 RENAME TABLE 은 테이블 이름을 바꾸는 매우 좋은 전략 중에 하나다.

 

또한 MySQL / MariaDB 에서 이 명령어는 VIEW 에도 적용되며 (단, temp 테이블에는 적용되지 않는다), 앞에 DB명.TABLE 등으로 완전 명시를 해서 DB 간 이동도 가능하다.

 

 

 

 

RENAME TABLE 명령어 예시 및 주의사항

 

공식 Document 에 따른 RENAME 명령어 syntax 예시는 아래와 같다. 

(위의 링크를 보면 다른 예시들도 있으나 이 예시만으로 해당 명령어를 설명 할 수 있으므로 생략)

 

 

RENAME TABLE old_table TO tmp_table,
             new_table TO old_table,
             tmp_table TO new_table;

 

 

위의 명령어를 보면 짐작 하겠지만 여러개의 테이블을 하나의 명령어로 한번에 RENAME 을 할 수 있다.

 

단, 주의해야 할 사항이 있는데, RENAME 은 결국 데이터베이스 내에 있는 메타데이터 테이블의 정보를 바꾸는 작업이기에 이에 따라 MySQL 5.5 이상부터는 metadata lock 이 발생 할 가능성이 있다.

(해당 링크 내 metadata 항목 참조 : https://dbknowledge.tistory.com/23?category=932725)

 

물론 RENAME 은 대형테이블의 인덱스 추가 처럼 오래걸리는 작업이 아니지만 운도 없게 RENAME 을 수행하는 시간에 하필 그 테이블을 사용하는 트랜잭션 쿼리와 겹치게 되면 Lock 으로 인한 wait 및 서비스 부하가 발생 할 수 있으므로

평상시에도 서비스 부하가 있는 DB 내 테이블에 해당 명령어를 수행 해야 할 때는 무조건 각 회사에서 사용하는 모니터링 방법이나 show processlist 등으로 트랜잭션이 wait 상태에 빠지는지 확인 해야한다. 만약 지속적으로 트랜잭션이 유입되서 해당 작업이 어려울시에는 LOCK TABLE 로 임시로 외부 트랜잭션 유입 차단 -> RENAME -> UNLOCK TABLE 순서로 작업한다. 물론 LOCK 에 따른 서비스 순단, 혹은 임시사용 불가 등이 예상될 시에는 사업부서, AO 등과 함께 협의하여 서비스 점검 공지등을 서비스 사이트 혹은 서비스 앱에 미리 기재하는 등의 준비는 필수다.

 

 

 

기타 사항

 

MySQL / MariaDB 에서는 해당 테이블내에 파티션 테이블등을 생성 했다면, 메타데이터 내 해당 파티션테이블의 정보 등도 위의 RENAME 시 자동 변경으로 반영된다. 단, PostgreSQL 에서의 파티션 테이블은 원본 테이블과 연결된 독립 테이블이기에 그에 따라 원본 테이블의 RENAME 에 따른 명칭 변경이 파티션 테이블에 일괄로 적용 되지 않으므로, 이에 대한 이름 변경도 고려해야 한다.

 

 

-- 테스트 테이블 members 생성 후 메타데이터 information_schema.partitions 파티션 구성 확인

mysql> CREATE TABLE members (
    ->     firstname VARCHAR(25) NOT NULL,
    ->     lastname VARCHAR(25) NOT NULL,
    ->     username VARCHAR(16) NOT NULL,
    ->     email VARCHAR(35),
    ->     joined DATE NOT NULL
    -> )
    -> PARTITION BY RANGE( YEAR(joined) ) (
    ->     PARTITION p0 VALUES LESS THAN (1960),
    ->     PARTITION p1 VALUES LESS THAN (1970),
    ->     PARTITION p2 VALUES LESS THAN (1980),
    ->     PARTITION p3 VALUES LESS THAN (1990),
    ->     PARTITION p4 VALUES LESS THAN MAXVALUE
    -> );
Query OK, 0 rows affected (0.20 sec)

mysql> select * from information_schema.partitions where table_name='members';
+---------------+--------------+------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | SUBPARTITION_NAME | PARTITION_ORDINAL_POSITION | SUBPARTITION_ORDINAL_POSITION | PARTITION_METHOD | SUBPARTITION_METHOD | PARTITION_EXPRESSION | SUBPARTITION_EXPRESSION | PARTITION_DESCRIPTION | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | CHECKSUM | PARTITION_COMMENT | NODEGROUP | TABLESPACE_NAME |
+---------------+--------------+------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
| def           | test         | members    | p0             | NULL              |                          1 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1960                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:10:17 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members    | p1             | NULL              |                          2 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1970                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:10:17 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members    | p2             | NULL              |                          3 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1980                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:10:17 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members    | p3             | NULL              |                          4 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1990                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:10:17 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members    | p4             | NULL              |                          5 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | MAXVALUE              |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:10:17 | NULL        | NULL       |     NULL |                   | default   | NULL            |
+---------------+--------------+------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
5 rows in set (0.00 sec)

 

-- 테스트 테이블 members_bak 으로 RENAME 후 메타데이터 information_schema.partitions 파티션 구성 확인

mysql> rename table members to members_bak;
Query OK, 0 rows affected (0.07 sec)

mysql> select * from information_schema.partitions where table_name='members';
Empty set (0.00 sec)

mysql> select * from information_schema.partitions where table_name='members_bak';
+---------------+--------------+-------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME  | PARTITION_NAME | SUBPARTITION_NAME | PARTITION_ORDINAL_POSITION | SUBPARTITION_ORDINAL_POSITION | PARTITION_METHOD | SUBPARTITION_METHOD | PARTITION_EXPRESSION | SUBPARTITION_EXPRESSION | PARTITION_DESCRIPTION | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | CREATE_TIME         | UPDATE_TIME | CHECK_TIME | CHECKSUM | PARTITION_COMMENT | NODEGROUP | TABLESPACE_NAME |
+---------------+--------------+-------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
| def           | test         | members_bak | p0             | NULL              |                          1 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1960                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:11:48 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members_bak | p1             | NULL              |                          2 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1970                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:11:48 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members_bak | p2             | NULL              |                          3 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1980                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:11:48 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members_bak | p3             | NULL              |                          4 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | 1990                  |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:11:48 | NULL        | NULL       |     NULL |                   | default   | NULL            |
| def           | test         | members_bak | p4             | NULL              |                          5 |                          NULL | RANGE            | NULL                |  YEAR(joined)        | NULL                    | MAXVALUE              |          0 |              0 |       16384 |            NULL |            0 |         0 | 2021-06-21 03:11:48 | NULL        | NULL       |     NULL |                   | default   | NULL            |
+---------------+--------------+-------------+----------------+-------------------+----------------------------+-------------------------------+------------------+---------------------+----------------------+-------------------------+-----------------------+------------+----------------+-------------+-----------------+--------------+-----------+---------------------+-------------+------------+----------+-------------------+-----------+-----------------+
5 rows in set (0.00 sec)
반응형

'MySQL > 명령어' 카테고리의 다른 글

Purge Logs (Binary Log Purge)  (0) 2021.06.28
Comments