Skip to content
isdnetworks
Go back

์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ์ค‘์— ๋ฉˆ์ถ”๋ฉด ๋” ๋‚˜๋น ์กŒ๋‹ค

(์ˆ˜์ •๋จ)

์ง‘๊ณ„ ๊ฒฐ๊ณผ๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋„ฃ๊ณ  ์žˆ์—ˆ๋‹ค. ์ค‘๊ฐ„์— ๋ฉˆ์ถ˜ ๋‚  ํ™”๋ฉด์ด ํ†ต์งธ๋กœ ๋น„์—ˆ๋‹ค.

Table of contents

Open Table of contents

์ฆ์ƒ โ€” ์ง€์šฐ๊ณ  ๋„ฃ๊ณ  ์žˆ์—ˆ๋‹ค

๊ฐฑ์‹ ํ•˜๋Š” ์ž๋ฆฌ๋Š” ๋‘ ์ค„์ด์—ˆ๋‹ค.

DELETE FROM stat_daily WHERE stat_date = '2018-09-27';
INSERT INTO stat_daily SELECT ... ;

DELETE ์™€ INSERT ๋‘ ์ค„์ด๋ผ ๊ฐ„๋‹จํ•˜๊ณ  ๋‹ค์‹œ ๋Œ๋ ค๋„ ๊ฒฐ๊ณผ๊ฐ€ ๊ฐ™์•„ ๋ณด์˜€๋‹ค.

๋ฌธ์ œ๋Š” DELETE ๋’ค INSERT ์ „์— ๋ฉˆ์ถ”๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. stat_daily ์˜ ๊ฐฑ์‹ ์— ์‹คํŒจํ–ˆ๋Š”๋ฐ ๊ฐฑ์‹ ํ•˜๊ธฐ ์ „ ๊ฐ’๊นŒ์ง€ ํ•จ๊ป˜ ์žƒ์€ ๊ฒƒ์ด๋‹ค.

์„ฑ๊ณตํ•˜๋Š” ๊ฒฝ๋กœ๋งŒ ๋ณด๊ณ  ๋งŒ๋“ค๋ฉด ์‹คํŒจ ๊ฒฝ๋กœ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฐฉ์น˜๋œ๋‹ค. ์‹คํŒจํ–ˆ์„ ๋•Œ ์ด์ „ ์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜๋А๋ƒ๊ฐ€ ์ด ์ข…๋ฅ˜ ์ฒ˜๋ฆฌ์˜ ๊ธฐ์ค€์ด์—ˆ๋‹ค.

์กฐ์น˜ โ€” ํ•œ ํŠธ๋žœ์žญ์…˜์— ๋„ฃ์—ˆ๋‹ค

๋จผ์ € ๋‘ ์ฟผ๋ฆฌ๋ฅผ ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๊ฐ์ŒŒ๋‹ค.

$db->transaction(function () use ($date) {
    $db->query("DELETE FROM stat_daily WHERE stat_date = ?", [$date]);
    $db->query("INSERT INTO stat_daily SELECT ...", [$date]);
});

์ค‘๊ฐ„์— ์‹คํŒจํ•˜๋ฉด ROLLBACK ๋˜์–ด ์ง€์šด ๊ฒƒ๋„ ํ•จ๊ป˜ ๋˜๋Œ์•„๊ฐ„๋‹ค.

์ด ํ•œ ์ค„๋กœ ์†Œ์‹ค ์ž์ฒด๋Š” ๋Œ€๋ถ€๋ถ„ ํ•ด๊ฒฐ๋๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ง‘๊ณ„ ์ž์ฒด๊ฐ€ ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ๊ทธ๋™์•ˆ stat_daily ๊ฐ€ ์ž ๊ฒจ ์žˆ์—ˆ๊ณ  ํ™”๋ฉด์—์„œ ๊ทธ ํ‘œ๋ฅผ ์ฝ๋Š” ๊ฒƒ์ด ๋ฐ€๋ ธ๋‹ค.

์„ค์ • โ€” ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๋ฐ”๊ฟ”์น˜๊ธฐ

์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ๋•Œ๋Š” ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๊ฐ์‹ธ๋Š” ๊ฒƒ ๋Œ€์‹  ์ƒˆ๋กœ ๋งŒ๋“ค๊ณ  ๋ฐ”๊ฟ”์น˜๊ธฐํ•˜๋Š” ์ชฝ์„ ๊ณจ๋ž๋‹ค. ์ด์œ ๋Š” ๋งŒ๋“œ๋Š” ๋™์•ˆ ์˜› ํ‘œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์„œ๋น„์Šคํ•ด์„œ๋‹ค.

CREATE TABLE stat_daily_new LIKE stat_daily;
INSERT INTO stat_daily_new SELECT ...;
RENAME TABLE stat_daily TO stat_daily_old, stat_daily_new TO stat_daily;
DROP TABLE stat_daily_old;

stat_daily_new ์— ๋‹ค ๋งŒ๋“ค๊ณ  ๋‚˜์„œ ์ด๋ฆ„๋งŒ ๋ฐ”๊พธ๋Š”๋ฐ RENAME TABLE ์€ ์ˆœ์‹๊ฐ„์ด๋‹ค.

๋งŒ๋“œ๋Š” ๋™์•ˆ ์˜› ํ‘œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์„œ๋น„์Šคํ•œ๋‹ค. ์‹คํŒจํ•˜๋ฉด ์ƒˆ ํ‘œ๋งŒ ๋ฒ„๋ฆฌ๋ฉด ๋˜๊ณ  ์ฝ๋Š” ์ชฝ์€ ์˜ํ–ฅ์„ ์•ˆ ๋ฐ›๋Š”๋‹ค.

RENAME TABLE ์— ๋‘˜์„ ๊ฐ™์ด ์“ด ๊ฒƒ์€ ๊ทธ ์‚ฌ์ด์— stat_daily ๋ผ๋Š” ์ด๋ฆ„์ด ์—†๋Š” ์ˆœ๊ฐ„์„ ๋งŒ๋“ค์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ์˜€๋‹ค. MySQL 5.7 ์ฐธ๊ณ  ๋งค๋‰ด์–ผ์€ ์ด ๋ฌธ์žฅ์ด ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰๋ผ ๊ทธ๋™์•ˆ ๋‹ค๋ฅธ ์„ธ์…˜์ด ์–ด๋А ํ‘œ์—๋„ ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•œ๋‹ค๊ณ  ์ ๋Š”๋‹ค.

์„ ํƒ์ง€ โ€” ์ผ๋ถ€๋งŒ ๊ฐฑ์‹ ํ•˜๋Š” ๊ฒฝ์šฐ

ํ•˜๋ฃจ์น˜๋งŒ ๊ฐฑ์‹ ํ•  ๋•Œ๋Š” ํ‘œ๋ฅผ ํ†ต์งธ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์—†์—ˆ๋‹ค.

INSERT INTO stat_daily (stat_date, ...)
VALUES (?, ...)
ON DUPLICATE KEY UPDATE order_count = VALUES(order_count), amount = VALUES(amount);

ON DUPLICATE KEY UPDATE ๋กœ ๋ฎ์–ด์“ฐ๋ฏ€๋กœ ์‹คํŒจํ•ด๋„ ์›๋ž˜ ๊ฐ’์ด ๋‚จ๋Š”๋‹ค.

์œ ์ผ ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์–ด์•ผ ๋™์ž‘ํ•œ๋‹ค.

ALTER TABLE stat_daily ADD UNIQUE KEY uk_date (stat_date);

uk_date ๋กœ ์–ด๋–ค ๊ฐ’์ด ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ํ–‰์ธ์ง€๊ฐ€ ์ •์˜๋œ๋‹ค. ์ค‘๊ฐ„์— ๋ฉˆ์ถฐ๋„ ์ฒ˜๋ฆฌ๋œ ๋‚ ์งœ๊นŒ์ง€๋Š” ๊ฐฑ์‹ ๋˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์˜› ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ๋‚จ๋Š”๋‹ค.

์ฃผ์˜ โ€” ์ด์ƒํ•œ ๊ฐ’์„ ๊ฑฐ๋ฅด๋Š” ๊ฒ€์‚ฌ

๋ฎ์–ด์“ฐ๊ธฐ ์ „์— ์ƒˆ ๊ฐ’์ด ๋ง์ด ๋˜๋Š”์ง€ ๋ดค๋‹ค.

$new = $this->calculate($date);
$old = $this->repo->get($date);

if ($old && $new['order_count'] < $old['order_count'] * 0.5) {
    log_error("์ง‘๊ณ„ ๊ฒฐ๊ณผ๊ฐ€ ์ด์ „์˜ ์ ˆ๋ฐ˜ ๋ฏธ๋งŒ์ž…๋‹ˆ๋‹ค. ๊ฐฑ์‹ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
    notify("์ง‘๊ณ„ ํ™•์ธ ํ•„์š”: {$date}");
    return;
}
$this->repo->upsert($date, $new);

order_count ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ ˆ๋ฐ˜ ์•„๋ž˜๋กœ ์ค„๋ฉด ์›๋ณธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์–ด upsert ๋ฅผ ๊ฑด๋„ˆ๋›ด๋‹ค.

์‹ค์ œ๋กœ ํ•œ ๋ฒˆ ๊ฑธ๋ ธ๋Š”๋ฐ ์›๋ณธ ํ‘œ์˜ ์ผ๋ถ€๊ฐ€ ์•„์ง ์•ˆ ๋“ค์–ด์™€ ์žˆ์—ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ๋ฎ์—ˆ์œผ๋ฉด ์˜› ๊ฐ’๋„ ํ•จ๊ป˜ ์žƒ์—ˆ์„ ๊ฒƒ์ด๋‹ค.

๋ฐ”๊พธ๊ธฐ ์ „ ๊ฐ’๋„ ๋‚จ๊ธฐ๊ฒŒ ํ–ˆ๋‹ค.

INSERT INTO stat_daily_history (stat_date, order_count, amount, replaced_at)
SELECT stat_date, order_count, amount, NOW() FROM stat_daily WHERE stat_date = ?;

stat_daily_history ์— replaced_at ๊ณผ ํ•จ๊ป˜ ๋ฐ”๋€ ์ด๋ ฅ์ด ์Œ“์ธ๋‹ค.

์ง€๋‚œ์ฃผ์— ๋ณธ ์ˆซ์ž์™€ ๋‹ค๋ฅด๋‹ค๋Š” ๋ง์ด ๋‚˜์™”์„ ๋•Œ ์ด๊ฒƒ์œผ๋กœ ํ™•์ธํ–ˆ๋‹ค. ์›๋ณธ์ด ๋‚˜์ค‘์— ์ •์ •๋ผ์„œ ์ง‘๊ณ„๊ฐ€ ๋ฐ”๋€ ๊ฒƒ์ด์—ˆ๊ณ  ์ด๋ ฅ์ด ์žˆ์–ด ์–ธ์ œ ๋ฌด์—‡์ด ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๊ฒ€์ฆ โ€” ์ผ๋ถ€๋Ÿฌ ๋งŒ๋“  ์ค‘๊ฐ„ ์‹คํŒจ

๋ฐ”๊พผ ๋ฐฉ์‹์ด ์‹ค์ œ๋กœ ๋‹ค๋ฅธ์ง€ ํ™•์ธํ–ˆ๋‹ค.

if (getenv('FAIL_AFTER_DELETE')) { throw new RuntimeException('์‹œํ—˜์šฉ ์‹คํŒจ'); }

FAIL_AFTER_DELETE ๋ฅผ ๊ฑธ์–ด ์ง€์šด ์งํ›„์— ์‹คํŒจํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

์˜› ๋ฐฉ์‹์—์„œ๋Š” ๊ทธ ์ž๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด์กŒ๊ณ  ๋ฐ”๊พผ ๋ฐฉ์‹์—์„œ๋Š” ์˜› ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์žˆ์—ˆ๋‹ค. ์ด๊ฒƒ์„ ์•ˆ ํ•ด ๋ดค์œผ๋ฉด ํŠธ๋žœ์žญ์…˜์ด ์ œ๋Œ€๋กœ ๊ฑธ๋ ธ๋Š”์ง€๋„ ๋ชฐ๋ž์„ ๊ฒƒ์ด๋‹ค.

์ •๋ฆฌ


Share this post on:

Previous Post
๋น„์Šทํ•ด ๋ณด์ด๋Š” ์—”๋“œํฌ์ธํŠธ ์…‹
Next Post
์ปจํ…Œ์ด๋„ˆ์—์„œ ๋ญ˜ ๋ฐฑ์—…ํ•˜๋‚˜