DB & AWS Knowledge
MySQL/MariaDB 명령어 : RENAME TABLE 본문
해당 페이지에서는 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 |
---|