PostgreSQL์šฉ Cloud SQL๋กœ์˜ ๋™์งˆํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฌธ์ œ ์ง„๋‹จ

๋Ÿฐํƒ€์ž„ ์ค‘์— ์ด์ „ ์ž‘์—… ํ”„๋กœ์„ธ์Šค์— ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ์ผ๋ถ€ ์˜ค๋ฅ˜๋Š” ๋ณต๊ตฌํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ด ์ž๋™์œผ๋กœ ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐ์ดํ„ฐ ๋ณต์ œ ์˜ค๋ฅ˜์™€ ๊ฐ™์ด ๋ณต๊ตฌํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ด์ „ ์ž‘์—… ์ƒํƒœ๊ฐ€ Failed๋กœ ๋ณ€๊ฒฝ๋˜๊ณ  ํ•˜์œ„ ์ƒํƒœ๋Š” ์‹คํŒจ ์ „์˜ ๋งˆ์ง€๋ง‰ ์ƒํƒœ๋ฅผ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ์‹คํŒจํ•œ ์ด์ „ ์ž‘์—…์œผ๋กœ ์ด๋™ํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์— ์„ค๋ช…๋œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณด๋ ค๋ฉด ์ด์ „ ์ž‘์—…์˜ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Cloud Monitoring์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”. ๋กœ๊ทธ๊ฐ€ ํŠน์ • ์ด์ „ ์ž‘์—…์œผ๋กœ ํ•„ํ„ฐ๋ง๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ํ‘œ์—์„œ ๋ฌธ์ œ์˜ ์˜ˆ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช… ๋ฌธ์ œ ์›์ธ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
๊ธฐ์กด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋กœ ์ด์ „ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job. ๋Œ€์ƒ Cloud SQL ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๋Š” ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋กœ๋งŒ ์ด์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์ œํ•œ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”. ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ธ์Šคํ„ด์Šค๋กœ ์Šน๊ฒฉํ•˜๊ณ , ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•œ ํ›„, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์‚ญ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์™€ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ์—ฐ๊ฒฐ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ ๋””๋ฒ„๊น…์˜ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์ด ํ˜ธํ™˜๋˜์ง€ ์•Š์•„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์‹คํ–‰ํ•  ์ˆ˜ ์—†์Œ ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์˜ ์กฐํ•ฉ์ด ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์ œ๊ณต๋œ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์ด ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์ด ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „๊ณผ ๋™์ผํ•˜๊ฑฐ๋‚˜ ํ•œ ๋‹จ๊ณ„ ์ƒ์œ„์˜ ์ฃผ ๋ฒ„์ „์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ƒˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์†Œ์Šค์—์„œ ๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด (DDL) ๋˜๋Š” ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด (DML)๊ฐ€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค. ACCESS EXCLUSIVE ์ž ๊ธˆ์ด ํ•„์š”ํ•˜๊ณ  ์ „์ฒด ๋คํ”„ ๋‹จ๊ณ„ ์ค‘์— ์‹คํ–‰๋˜๋Š” DDL์€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋™๊ธฐํ™” ํ”„๋กœ์„ธ์Šค (์ „์ฒด ๋คํ”„) ์ค‘์— ํ…Œ์ด๋ธ”์—์„œ ALTER TABLE ๋˜๋Š” DROP TABLE์™€ ๊ฐ™์€ ACCESS EXCLUSIVE ์ž ๊ธˆ์ด ํ•„์š”ํ•œ DDL ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ์ง€ ์•Š์œผ๋ฉด DDL ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์ดˆ๊ธฐ ๋™๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ํ…Œ์ด๋ธ”์ด ์•„์ง ์ดˆ๊ธฐ ๋™๊ธฐํ™” ํ”„๋กœ์„ธ์Šค์— ์žˆ๊ณ  ๋™์ผํ•œ ํ…Œ์ด๋ธ”์—์„œ ALTER TABLE ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜๋ฉด ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์ดˆ๊ธฐ ๋™๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ํ›„์† DDL ๋ฐ DML ๋ช…๋ น์–ด๊ฐ€ ์ฐจ๋‹จ๋ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: No pglogical extension installed on databases (X) ํ•˜๋‚˜ ์ด์ƒ์˜ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— pglogical๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋”ฐ๋ผ ์†Œ์Šค ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— pglogical๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL ๋ฒ„์ „ 15๋กœ ์ด์ „ํ•  ๋•Œ ํ›„์† ์—ฐ๊ฒฐ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜๋ฉด ๋‹ค์Œ ์ฆ์ƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” pglogical ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ต์ฐฉ ์ƒํƒœ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub์˜ pglogical Issue Tracker๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ๋จผ์ € ์ค‘๊ฐ„ PostgreSQL ๋ฒ„์ „์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Cannot connect to invalid database๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Replication user 'x' doesn't have sufficient privileges. Database Migration Service๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ง€์ •๋œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Unable to connect to source database server. Database Migration Service์—์„œ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์˜ ์„ค์ •์„ ์ •์˜ํ•  ๋•Œ ํ‘œ์‹œ๋œ ๋ชจ๋“  ํ•„์ˆ˜ ๊ธฐ๋ณธ ์š”๊ฑด์„ ์™„๋ฃŒํ–ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: The source database 'wal_level' configuration must be equal to 'logical'. ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ wal_level๊ฐ€ logical๊ฐ€ ์•„๋‹Œ ๊ฐ’์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. wal_level๋ฅผ logical๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: The source database 'max_replication_slots' configuration is not sufficient. max_replication_slots ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋ ค๋ฉด ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅด์„ธ์š”.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: The source database 'max_wal_senders' configuration is not sufficient. max_wal_senders ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋ ค๋ฉด ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅด์„ธ์š”.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: The source database 'max_worker_processes' configuration is not sufficient. max_worker_processes ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋ ค๋ฉด ์ด ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฅด์„ธ์š”.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.

๋˜๋Š”

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Error promoting EM replica: finished drop replication with errors.

๋ณต์ œ์— ํ•„์š”ํ•œ ์„ค์ •์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์Šน๊ฒฉํ•˜๋Š” ๋™์•ˆ ์ •๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด superuser ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰ํ•  ๋ช…๋ น์–ด์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ณต์ œ ์Šฌ๋กฏ ์‚ญ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: x509 certificate signed by unknown authority.

Database Migration Service์— ์ œ๊ณต๋œ ์†Œ์Šค CA ์ธ์ฆ์„œ์—๋Š” ๋ฃจํŠธ ์ธ์ฆ์„œ๋งŒ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์†Œ์Šค ์ธ์ฆ์„œ์—๋Š” ๋ฃจํŠธ ์ธ์ฆ์„œ์™€ ์ค‘๊ฐ„ ์ธ์ฆ์„œ๊ฐ€ ๋ชจ๋‘ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Amazon Relational Database Service์˜ ๊ฒฝ์šฐ rds-ca-2019-root.pem ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฃจํŠธ ์ธ์ฆ์„œ์™€ ๋ชจ๋“  ํ•„์ˆ˜ ์ค‘๊ฐ„ ์ธ์ฆ์„œ๊ฐ€ ๋ชจ๋‘ ํฌํ•จ๋œ ๊ฒฐํ•ฉ๋œ ์†Œ์Šค CA ์ธ์ฆ์„œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

Amazon Relational Database Service ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ rds-ca-2019-root.pem ์ธ์ฆ์„œ ๋Œ€์‹  rds-combined-ca-bundle.pem ์ธ์ฆ์„œ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ERROR: Out of shared memory HINT: You might need to increase max_locks_per_transaction.

max_locks_per_transaction ๋งค๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๊ฐ’์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์„ {max_number_of_tables_per_database}/(max_connections + max_prepared_transactions) ์ด์ƒ์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ERROR: no data left in message.

์†Œ์Šค ์ธ์Šคํ„ด์Šค์— pglogical ํŒจํ‚ค์ง€๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ด ํŒจํ‚ค์ง€๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์†Œ์Šค ์ธ์Šคํ„ด์Šค์— pglogical ํŒจํ‚ค์ง€ ์„ค์น˜๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Cannot assign TransactionIds during recovery.

๊ตฌ์„ฑ๋œ ์†Œ์Šค๊ฐ€ ๋ณต๊ตฌ ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ๋ณต๊ตฌ ๋ชจ๋“œ๊ฐ€ ์•„๋‹Œ ์†Œ์Šค๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ „์ฒด ๋คํ”„๊ฐ€ ๋А๋ฆฝ๋‹ˆ๋‹ค. Cloud SQL ๋Œ€์ƒ์—์„œ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์†๋„๊ฐ€ ๋А๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€์ƒ์„ ๋งŒ๋“ค ๋•Œ ๋ฐ์ดํ„ฐ ๋””์Šคํฌ ํฌ๊ธฐ๋ฅผ ์ตœ์ข… ํฌ๊ธฐ์— ๊ฐ€๊น๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ „์ฒด ๋คํ”„ ๋‹จ๊ณ„์—์„œ๋Š” I/O ์“ฐ๊ธฐ ์ง‘์•ฝ์ ์ธ ์›Œํฌ๋กœ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ ๋””์Šคํฌ ํฌ๊ธฐ๊ฐ€ ํด์ˆ˜๋ก I/O ์„ฑ๋Šฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋ธ”๋ก ์Šคํ† ๋ฆฌ์ง€ ์„ฑ๋Šฅ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  • Cloud SQL ๋Œ€์ƒ์˜ ๋“ฑ๊ธ‰์„ ๋” ๋†’์—ฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ๋„คํŠธ์›Œํฌ ๋ฐ ๋””์Šคํฌ ๋Œ€์—ญํญ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • Cloud SQL ๋Œ€์ƒ์˜ max_wal_size ํ”Œ๋ž˜๊ทธ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ํ”Œ๋ž˜๊ทธ์—๋Š” 32GB ๋˜๋Š” 64GB๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์—…๋ฐ์ดํŠธํ•ด๋„ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: subscriber {subscriber_name} initialization failed during nonrecoverable step (d), please try the setup again

์ „์ฒด ๋คํ”„ ๋‹จ๊ณ„์—์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์ด ์‹คํŒจํ–ˆ์œผ๋ฉฐ ์ž‘์—…์„ ๋ณต๊ตฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘๋˜์—ˆ๊ฑฐ๋‚˜ ๋ณต๊ตฌ ๋ชจ๋“œ์ด๊ฑฐ๋‚˜ wal_sender_timeout ๋งค๊ฐœ๋ณ€์ˆ˜์— ์„ค์ •๋œ ๊ฐ’์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„ ๋ณต์ œ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์œผ๋ ค๋ฉด ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. Google Cloud ์ฝ˜์†”์˜ ๋กœ๊ทธ ํƒ์ƒ‰๊ธฐ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฆฌ์†Œ์Šค ๋ชฉ๋ก์—์„œ Cloud SQL ๋ณต์ œ๋ณธ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค. ๋ณต์ œ๋ณธ์˜ ์ตœ๊ทผ ๋กœ๊ทธ ๋ชฉ๋ก์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
  3. ๋กœ๊ทธ ํŒŒ์ผ ์ด๋ฆ„์—์„œ postgres.log๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  4. ๋กœ๊ทธ์˜ ์‹ฌ๊ฐ๋„ ์ˆ˜์ค€์„ Warning๋ณด๋‹ค ๋†’์€ ๋ชจ๋“  ์ˆ˜์ค€์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์˜ค๋ฅ˜ ๋กœ๊ทธ๊ฐ€ ์‹คํŒจ์˜ ๊ทผ๋ณธ ์›์ธ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ „์ฒด ๋คํ”„ ๋‹จ๊ณ„์—์„œ Database Migration Service๊ฐ€ ํ•ญ์ƒ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์—์„œ wal_sender_timeout ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋” ํฐ ์ˆซ์ž (์˜ˆ: 0)๋กœ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ „ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•œ ํ›„ ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.
์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ERROR: unknown column name {column_name}

๊ธฐ๋ณธ ๋…ธ๋“œ์˜ ๋ณต์ œ๋œ ํ…Œ์ด๋ธ”์—๋Š” ์—ด์ด ์ถ”๊ฐ€๋˜์—ˆ์ง€๋งŒ ๋ณต์ œ๋ณธ ๋…ธ๋“œ์—๋Š” ์ถ”๊ฐ€๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์—ฐ์† ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ค‘์— ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์–ธ์–ด (DML) ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณ„์† ํ˜ธํ™˜๋˜๋„๋ก ๋ฐ์ดํ„ฐ ์ •์˜ ์–ธ์–ด (DDL) ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ์ฑ…์ž„์ด๋ฉฐ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์“ฐ๊ธฐ๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ๋ชจ๋‘์—์„œ DDL ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์—์„œ DDL ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— DDL ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋Š” Cloud SQL ์‚ฌ์šฉ์ž์—๊ฒŒ cloudsqlexternalsync ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  • pglogical.replicate_ddl_command๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ๋ฐ ๋Œ€์ƒ ์œ„์น˜์˜ ์ผ๊ด€๋œ ์ง€์ ์—์„œ DDL ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ์†Œ์Šค์™€ ๋Œ€์ƒ ๋ชจ๋‘์—์„œ ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฉฐ, ์ด์ „ํ•  ์•„ํ‹ฐํŒฉํŠธ (์˜ˆ: ํ…Œ์ด๋ธ”, ์‹œํ€€์Šค, ๋ทฐ ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค)์˜ ์ˆ˜ํผ์œ ์ € ๋˜๋Š” ์†Œ์œ ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • pglogical.replicate_ddl_command. ์‚ฌ์šฉ ์˜ˆ์‹œ๋Š” ์—ฐ์† ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ERROR: cannot truncate a table referenced in a foreign key constraint

์‚ฌ์šฉ์ž๊ฐ€ ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ์กฐ๊ฑด์ด ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ์ž๋ฅด๋ ค๊ณ  ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์™ธ๋ž˜ ํ‚ค ์ œ์•ฝ์กฐ๊ฑด์„ ์‚ญ์ œํ•œ ๋‹ค์Œ ํ…Œ์ด๋ธ”์„ ์ž๋ฆ…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ERROR: connection to other side has died

wal_sender_timeout parameter์— ์„ค์ •๋œ ๊ฐ’์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์•„ ๋ณต์ œ ์—ฐ๊ฒฐ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ดˆ๊ธฐ ๋คํ”„๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ ๋ณต์ œ ๋‹จ๊ณ„ ์ค‘์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ธ์Šคํ„ด์Šค์—์„œ wal_sender_timeout ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐ’์„ ๋Š˜๋ฆฌ๊ฑฐ๋‚˜ ๊ฐ’์„ 0๋กœ ์„ค์ •ํ•˜์—ฌ ์ œํ•œ ์‹œ๊ฐ„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€: migration job test configuration has returned the following warnings: Some table(s) have limited support.

์†Œ์Šค์— ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”๊ณผ ๊ฐ™์ด ์ œํ•œ์ ์œผ๋กœ ์ง€์›๋˜๋Š” ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ง€์›๋˜์ง€ ์•Š๋Š” ํ•ญ๋ชฉ (์˜ˆ: ๊ธฐ๋ณธ ํ‚ค๊ฐ€ ์—†๋Š” ํ…Œ์ด๋ธ”)์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์†Œ์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์„ฑ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์„ ํƒํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ–ˆ๋Š”๋ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์—์„œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก์— ์‹คํŒจ ์ƒํƒœ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ์˜ค๋ฅ˜

์˜ค๋ฅ˜ ์—ด์—์„œ ์˜ค๋ฅ˜ ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜๊ณ  ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์ž‘์—…์—์„œ ์‹คํŒจํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์—์„œ ์‹คํŒจํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๊ด€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ๊ด€๋ฆฌ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

๊ธฐ์กด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์‚ญ์ œ

๊ธฐ์กด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋กœ ์ด์ „ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. The destination instance contains existing data or user defined entities (for example databases, tables, or functions). You can only migrate to empty instances. Clear your destination instance and retry the migration job.

์ด ๋ฌธ์ œ๋Š” ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์— ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„์–ด ์žˆ๋Š” ๊ธฐ์กด ์ธ์Šคํ„ด์Šค๋กœ๋งŒ ์ด์ „ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ ค์ง„ ์ œํ•œ์‚ฌํ•ญ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ด ์‹œ์ ์—์„œ ๋Œ€์ƒ Cloud SQL ์ธ์Šคํ„ด์Šค๋Š” `์ฝ๊ธฐ ์ „์šฉ` ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค. ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋ฅผ ์Šน๊ฒฉํ•˜์—ฌ ์“ฐ๊ธฐ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ์–ป์Šต๋‹ˆ๋‹ค.
  3. ๋Œ€์ƒ Cloud SQL ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  4. ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์ƒ์—๋Š” ์‹œ์Šคํ…œ ๊ตฌ์„ฑ ๋ฐ์ดํ„ฐ๋งŒ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ์‚ฌ์šฉ์ž ๋ฐ์ดํ„ฐ (์˜ˆ: ํ…Œ์ด๋ธ”)๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹คํ–‰ํ•˜์—ฌ ์‹œ์Šคํ…œ ์™ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ SQL ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ์‹œ์Šคํ…œ ์™ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” SQL ๋ฌธ์˜ ์˜ˆ์‹œ (ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ธฐ)

    SELECT datname FROM pg_catalog.pg_database
    WHERE datname NOT IN ('cloudsqladmin', 'template1', 'template0', 'postgres');

    postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์‹œ์Šคํ…œ ์™ธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” SQL ๋ฌธ ์˜ˆ์‹œ (ํด๋ฆญํ•˜์—ฌ ํŽผ์น˜๊ธฐ)

    postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์‹œ์Šคํ…œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์ด์ง€๋งŒ ์‹œ์Šคํ…œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ๋ฌธ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. psql ํด๋ผ์ด์–ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒฝ์šฐ \connect {database_name_here} ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ์žฌ์„ค์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    SELECT table_schema, table_name FROM information_schema.tables
    WHERE table_schema != 'information_schema' AND table_schema not like 'pg\_%';
    
    SELECT routine_schema, routine_name FROM information_schema.routines
    WHERE routine_schema != 'information_schema' AND routine_schema not like 'pg\_%';
    
    SELECT extname FROM pg_extension WHERE extname != 'plpgsql';
        
  5. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋ณต์ œ ์Šฌ๋กฏ ์ •๋ฆฌ

๋‹ค์Œ ๋ฉ”์‹œ์ง€ ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

  • Cleanup may have failed on source due to error: generic::unknown: failed to connect to on-premises database.
  • Error promoting EM replica: finished drop replication with errors.

๋ฌธ์ œ ์›์ธ

Cloud SQL ์ธ์Šคํ„ด์Šค๋ฅผ ํ”„๋กœ๋ชจ์…˜ํ•  ๋•Œ Cloud SQL ์ธ์Šคํ„ด์Šค์—์„œ ์†Œ์Šค ์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ (์˜ˆ: ์†Œ์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ์†Œ์Šค ์ธ์Šคํ„ด์Šค์˜ ํ—ˆ์šฉ ๋ชฉ๋ก์—์„œ Cloud SQL ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ญ์ œํ•œ ๊ฒฝ์šฐ) ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ํ”„๋กœ๋ชจ์…˜ํ•˜๋Š” ๋™์•ˆ ๋ณต์ œ์— ํ•„์š”ํ•œ ์„ค์ •์„ ์ •๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ณต์ œ ์Šฌ๋กฏ์€ ์ˆ˜๋™์œผ๋กœ ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด superuser ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž๋กœ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ ๋ณต์ œ ์Šฌ๋กฏ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์Šฌ๋กฏ์„ ํ•˜๋‚˜์”ฉ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

    select pg_drop_replication_slot({slot_name});
  2. ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์—์„œ ๋ณต์ œ ์Šฌ๋กฏ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ธฐ์กด ๋ณต์ œ ์Šฌ๋กฏ์„ ์ฟผ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    select pg_drop_replication_slot(slot_name) from pg_replication_slots where slot_name like '%cloudsql%' and active = 'f';
  3. ์†Œ์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” Cloud SQL ๋ณต์ œ๋ณธ์ด ์—†๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ pglogical ์„ค์ •์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

    select pglogical.drop_node(node_name) from pglogical.node where node_name like 'cloudsql';
  4. pglogical ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์ด ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

    DROP EXTENSION IF EXISTS pglogical;


์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: Cannot connect to invalid database

PostgreSQL ๋ฒ„์ „ 15๋กœ ์ด์ „ํ•  ๋•Œ ํ›„์† ์—ฐ๊ฒฐ ์žฌ์‹œ๋„ ํšŸ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณต๋˜๋ฉด ๋‹ค์Œ ์ฆ์ƒ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ ์›์ธ

์ด ๋ฌธ์ œ๋Š” pglogical ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ต์ฐฉ ์ƒํƒœ ๋ฌธ์ œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ GitHub์˜ pglogical Issue Tracker๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

์ƒˆ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ๋‹ค์‹œ ์‹คํ–‰

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋Œ€์ƒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋‹ค์‹œ ๋งŒ๋“œ์„ธ์š”. ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

  1. ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. PostgreSQL์šฉ Cloud SQL ๋ฌธ์„œ์˜ ์ธ์Šคํ„ด์Šค ์‚ญ์ œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  2. ์‹คํŒจํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ๊ฒ€ํ† ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.
  3. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—…์„ ๋‹ค์‹œ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ž‘์—… ๋งŒ๋“ค๊ธฐ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ค‘๊ฐ„ ๋ฒ„์ „์œผ๋กœ ์ด์ „

์ด์ „ PostgreSQL ๋ฒ„์ „(์˜ˆ: PostgreSQL 14)์œผ๋กœ ์ด์ „ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์™„๋ฃŒ๋˜๋ฉด ์›ํ•˜๋Š” PostgreSQL 15 ์ธ์Šคํ„ด์Šค๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PostgreSQL์šฉ Cloud SQL ๋ฌธ์„œ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์ „ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ฃผ ๋ฒ„์ „ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ๋ฐ ์—ญํ•  ๊ด€๋ฆฌ

๊ธฐ์กด ์‚ฌ์šฉ์ž ์ด์ „

ํ˜„์žฌ Database Migration Service๋Š” ์†Œ์Šค ์ธ์Šคํ„ด์Šค์—์„œ ๋Œ€์ƒ Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๋Š” ์ž‘์—…์„ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Cloud SQL์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์ด ์ด์ „์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

cloudsqlexternalsync ์‚ฌ์šฉ์ž ์ •๋ณด

์ด์ „ํ•˜๋Š” ๋™์•ˆ Cloud SQL ๋ณต์ œ๋ณธ์˜ ๋ชจ๋“  ๊ฐ์ฒด๋Š” cloudsqlexternalsync ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ์ด์ „๋œ ํ›„ ๋‹ค์Œ ๋‹จ๊ณ„์— ๋”ฐ๋ผ ๊ฐ์ฒด์˜ ์†Œ์œ ๊ถŒ์„ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GRANT cloudsqlexternalsync to {USER} ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ reassign owned by cloudsqlexternalsync to {USER}; ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • cloudsqlexternalsync ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜๋ ค๋ฉด drop role cloudsqlexternalsync ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

๋จผ์ € Database Migration Service๊ฐ€ Cloud Storage๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•œ Cloud SQL ์ธ์Šคํ„ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ๊ทธ๋Ÿฐ ๋‹ค์Œ Cloud Storage์—์„œ ๋…๋ฆฝํ˜• Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์— cloudsqlexternalsync ์‚ฌ์šฉ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•˜๋ ค๋ฉด ๋Œ€์ƒ ์ธ์Šคํ„ด์Šค์—์„œ cloudsqlexternalsync ์‚ฌ์šฉ์ž๋ฅผ ๋งŒ๋“ค๊ฑฐ๋‚˜ ์ด์ „๋œ ์ธ์Šคํ„ด์Šค์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์‚ญ์ œํ•˜์„ธ์š”.