๐ง ์ฅ์ ๋ก๊ทธ. DB์ ํํฐ์ ์ ์ค์ ํ์ ๋
์ด์ ๋ฐ์
์๋ฒ๊ฐ ๋ฐ๋ ๊ฒ์ ํ๋๋ ์์์ต๋๋ค. ๋ฌ์ด ๋ฐ๋์์ ๋ฟ์ธ๋ฐ ์๋ฒฝ 12์๊ฐ ์ง๋์ ์ฌ์ฉ์๋ค์ด ์ ์์ ๋ชป ํ๊ณ ์๋ค๊ณ ์ปค๋ฎค๋ํฐ์์ ๋๋ฆฌ๊ฐ ๋ฌ์ต๋๋ค.
๋ก๊ทธ๋ฅผ ์กฐ์ฌํด ๋ณด๋ DB์์ ํน์ ํ ์ด๋ธ์ ๊ฐ์ INSERT ํ ๋ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์์์ต๋๋ค. ํด๋น ํ ์ด๋ธ์ ์ค์ ๋ Partition ๋ฌธ์ ์์ต๋๋ค. ๋ฌ์ ๊ธฐ์ค์ผ๋ก Partition์ ๋๋๋๋ก ์ธํ ์ด ๋์ด์์๋๋ฐ, ๋ฐ๋ ๋ฌ์ ํด๋นํ๋ Partition์ด ์์ฑ๋ผ ์์ง ์์์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์์์ต๋๋ค. ์ผ๋จ ๊ธํ ๋๋ก Partition์ ์ฌ์ ๋กญ๊ฒ 12๊ฐ์๋ถ ์ถ๊ฐ๋ก ์์ฑํด ์ฃผ๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ๋์๋์ง ์กฐ์ฌํด ๋ดค์ต๋๋ค. ์ ์ด์ ๋ผ์ด๋ธ ์๋น์ค์์ ์ค์ผ์ฅด๋ฌ๋ ์ ๋ง๋ค์ด๋๊ณ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ ํ ๊ฒ ์ดํด๊ฐ ๋์ง ์์์ง๋ง, ์๋น์ค๋ฅผ ์์ํ ๋๋ง ํ๋๋ผ๋ ์ด๋ ๊ฒ ์ค๋ ๊ธฐ๊ฐ ์๋น์คํ ์ ์์ ๊ฑฐ๋ผ๊ณ ๋ ์๊ฐ์ง ๋ชปํ์ ์๋ ์๊ฒ ๋ค ์ถ์์ต๋๋ค. ์ฐ์ ๊ตฌํ์ ํด๋๊ณ ๋์ค์ ์ฒ์ฒํ ์์ ํ๊ฒ ๋ค๋ ์๊ฐ์ด์์ ์๋ ์๊ฒ ์ต๋๋ค.
๋ฌธ์ ์์
์ด ์ด์๋ฅผ ์์ผ๋ก๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํํฐ์ ์์ฑ์ด ์๋์ผ๋ก ์ด๋ค์ง๋๋ก ์ค์ ํ ํ์๊ฐ ์์์ต๋๋ค. MySQL ํ ์ด๋ธ์ด ์๋์ ๊ฐ์ด ์์ฑ๋ผ ์๋ค๊ณ ํ์ ๋๋ฅผ ๊ฐ์ ํ๊ณ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
1
2
3
4
5
6
7
8
9
10
CREATE TABLE partitioned_table (
id INT NOT NULL,
created_at DATETIME NOT NULL,
text VARCHAR(255),
PRIMARY KEY (id, created_at)
)
PARTITION BY RANGE (YEAR(created_at) * 100 + MONTH(created_at)) (
PARTITION p202306 VALUES LESS THAN (202307),
PARTITION p202307 VALUES LESS THAN (202308)
);
์ด ์์ ํ ์ด๋ธ์ 2023๋ 7์๊ณผ 2023๋ 8์์ ๋ํ ํํฐ์ ์ ์์ฑํ ์ํ์ ๋๋ค. 2023๋ 9์ ์ดํ๊ฐ ๋๋ค๋ฉด ํด๋น ํํฐ์ ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด ํ ์ด๋ธ์ ์๋ก์ด ๊ฐ์ ์ฐ๋ ค๊ณ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ ๋๋ค. ์ด ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ค์ผ์ฅด๋ฌ๋ฅผ ์์ฑํด์ ์๋์ผ๋ก ํํฐ์ ์ ๋ง๋ค์ด ์ฃผ์ด์ผ ํฉ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DELIMITER //
CREATE EVENT create_new_partition
ON SCHEDULE EVERY 1 MONTH
STARTS '2023-08-01 00:00:00'
DO
BEGIN
DECLARE partition_name VARCHAR(16);
DECLARE next_partition_value INT;
SET @current_year_month = DATE_FORMAT(NOW(), '%Y%m');
SET @next_year_month = DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 1 MONTH), '%Y%m');
SET partition_name = CONCAT('p', @next_year_month);
SET next_partition_value = (YEAR(NOW()) * 100 + MONTH(NOW()) + 1);
SET @create_partition_sql = CONCAT(
'ALTER TABLE partitioned_table ADD PARTITION (PARTITION ',
partition_name,
' VALUES LESS THAN (',
next_partition_value,
'));'
);
PREPARE stmt FROM @create_partition_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END//
DELIMITER ;
์ด ์ฟผ๋ฆฌ๋ create_new_partition
์ด๋ผ๋ ์ด๋ฒคํธ๋ฅผ ์์ฑํฉ๋๋ค. 2023๋
8์ 1์ผ ์์ ์ดํ๋ก ๋งค์ 1์ผ ์์ ์ ์ด ์ด๋ฒคํธ๊ฐ ์คํ๋ฉ๋๋ค. ์ด ์ด๋ฒคํธ๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ์ ๋ค์ ๋ฌ์ ํด๋น ํ๋ ํํฐ์
์ ์์ฑํฉ๋๋ค. ํด๋น ์์ด ์๋ ๋ค์ ๋ฌ์ ํํฐ์
์ ์์ฑํด์ฃผ๋ ์ด์ ๋ ์ค์ผ์ฅด๋ฌ๊ฐ ์์ฑ๋๋ ๋์ DB์ ๊ฐ์ด ์ฐ์ฌ์ง ์ ์๊ธฐ ๋๋ฌธ์ ํ๋ฌ ์ ์ ๋ฏธ๋ฆฌ ํํฐ์
์ ์์ฑํด์ฃผ๋ ๊ฒ์
๋๋ค. ์ด์ ๊ฐ์ ๋ฐฉ์์ผ๋ก MySQL ์ด๋ฒคํธ ์ค์ผ์ค๋ฌ๋ฅผ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ์ ์๋์ผ๋ก ํํฐ์
์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
์ ์ด์ ๋ก๊ทธ๋ ํ์ผ์ ์ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์ ๋ ดํ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์ DB์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ๊ฒ์ด ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ์๋๋๋ค. ํ์ง๋ง ํฌ๊ธฐ๊ฐ ์์ ๊ฐ๋จํ ์์ค์ ๋ก๊ทธ์ด๊ณ , ์กฐํ๊ฐ ๋น๋ฒํ ๋ฐ์ํ๋ค๋ฉด DB์ ์ฐ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ด ๋ ์ ์์ต๋๋ค. ์ด๋ด ๊ฒฝ์ฐ ํํฐ์ ์ ์์ฑํด์ ๋ก๊ทธ๊ฐ ์ผ์ ๊ธฐ๊ฐ์ด ์ง๋๋ฉด ํด๋น ํํฐ์ ์ด ์ญ์ ๋๋๋ก ํด์ ๊ด๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋๋ฐ, ์ด ๋, ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํํฐ์ ์ ์ด๋ป๊ฒ ์์ฑํ๊ณ ๊ด๋ฆฌํ ์ง ํ์คํ๊ฒ ๊ณํ์ ์์๋๊ณ ์์ ์ ํ๋ ๊ฒ์ด ์ข๊ฒ ์ต๋๋ค.