๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜(CDC) ์‚ฌ์šฉ ์„ค์ •

์ด ํŽ˜์ด์ง€์—์„œ๋Š” SQL Server์šฉ Cloud SQL์—์„œ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜(CDC)๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

CDC๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CDC ์‚ฌ์šฉ ์„ค์ • ๋ฐ ์‚ฌ์šฉ ์ค‘์ง€์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Microsoft ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ธ์Šคํ„ด์Šค์— ์—ฐ๊ฒฐํ•˜๋ฉด sqlserver ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์–‘ํ•œ CDC ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ž‘์—…๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

์ธ์Šคํ„ด์Šค์— CDC๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์ „์— ์ด ํŽ˜์ด์ง€์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ ์ œ๊ณต ์—ฌ๋ถ€ ํ™•์ธ

CDC๋Š” ๋‹ค์Œ SQL Server์šฉ Cloud SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฒ„์ „์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • SQL Server 2022 Standard
  • SQL Server 2022 Enterprise
  • SQL Server 2019 Standard
  • SQL Server 2019 Enterprise
  • SQL Server 2017 Standard
  • SQL Server 2017 Enterprise

CDC ์‚ฌ์šฉ ์„ค์ • ๋ฐ CDC ์บก์ฒ˜ ์ž‘์—… ์‹œ์ž‘

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” sqlserver ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ €์žฅ๋œ ์ ˆ์ฐจ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • msdb.dbo.gcloudsql_cdc_enable_db
  • msdb.dbo.gcloudsql_cdc_disable_db

CDC ์‚ฌ์šฉ ์„ค์ •

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ ค๋ฉด ํ•„์š”ํ•œ ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„์„ ์ „๋‹ฌํ•˜์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

EXEC msdb.dbo.gcloudsql_cdc_enable_db 'DATABASE_NAME'

CDC ์‚ฌ์šฉ ์ค‘์ง€

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

EXEC msdb.dbo.gcloudsql_cdc_disable_db 'DATABASE_NAME'

CDC ์บก์ฒ˜ ์ž‘์—… ์‹œ์ž‘

CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜๋ฉด ์บก์ฒ˜ ๋ฐ ์ •๋ฆฌ๋ฅผ ์œ„ํ•œ ์ž‘์—…์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. SQL Server Management Studio(SSMS)์—์„œ๋Š” sqlserver ์‚ฌ์šฉ์ž์—๊ฒŒ ์ž‘์—…์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด์žฅ ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ํ†ตํ•ด ์ž‘์—…์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

EXEC sys.sp_cdc_start_job @job_type = N'cleanup'

์ž‘์—… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXEC sys.sp_cdc_change_job  @job_type = N'capture',
        @maxtrans = 20,
        @pollinginterval = NULL,
        @maxscans = NULL,
        @continuous = NULL

์ž‘์—… ์‹œ์ž‘ ๋ฐ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์€ ๋‹ค์Œ์„ ์ฐธ์กฐํ•˜์„ธ์š”.

sys.sp_cdc_add_job๋„ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ…Œ์ด๋ธ”์—์„œ CDC ์‚ฌ์šฉ ์„ค์ •

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ CDC๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•˜๋ฉด dbo(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†Œ์œ ์ž) ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ถ”์ ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ‘œ์ค€ CDC ๋ช…๋ น์–ด ๋ฐ ์˜ต์…˜์— ๋Œ€ํ•œ ์ƒ์„ธ ์„ค๋ช…์€ ๋ณ€๊ฒฝ ๋ฐ์ดํ„ฐ ์บก์ฒ˜ ์‚ฌ์šฉ ์„ค์ • ๋ฐ ์‚ฌ์šฉ ์ค‘์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

ํ…Œ์ด๋ธ”์—์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ถ”์ 

ํ…Œ์ด๋ธ”์„ ์ถ”์ ํ•˜๋ ค๋ฉด sys.sp_cdc_enable_table ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXEC sys.sp_cdc_enable_table
  @source_schema = N'dbo',
  @source_name = N'customer',
  @role_name = N'CDC'

ํ…Œ์ด๋ธ”์—์„œ CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์—ˆ๋Š”์ง€ ํ™•์ธ

ํ…Œ์ด๋ธ”์— CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด sys.sp_cdc_help_change_data_capture ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXECUTE sys.sp_cdc_help_change_data_capture
  @source_schema = N'dbo',
  @source_name = N'customer'

CDC ๋ณ€๊ฒฝ ํ…Œ์ด๋ธ”์„ ํ†ตํ•œ ์ฟผ๋ฆฌ ๋ณ€๊ฒฝ์‚ฌํ•ญ

ํ…Œ์ด๋ธ”์˜ CDC ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณด๋ ค๋ฉด ํ…Œ์ด๋ธ”์—์„œ CDC๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ SELECT ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

ํ…Œ์ด๋ธ” ์ด๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

<schema>_<table_name>_CT

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SELECT * FROM cdc.dbo_customer_CT

์บก์ฒ˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ง€์ •๋œ ํ…Œ์ด๋ธ”์—์„œ CDC ์‚ฌ์šฉ ์„ค์ •

'์บก์ฒ˜ ์ธ์Šคํ„ด์Šค'๋กœ ํ…Œ์ด๋ธ”์„ ์ถ”์ ํ•˜๋ ค๋ฉด sys.sp_cdc_enable_table ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name = N'customer',
    @role_name = N'CDC',
    @capture_instance = N'customer_cdc',
    @supports_net_changes = 1

์บก์ฒ˜ ์ธ์Šคํ„ด์Šค ๋‚ด์˜ ๋ชจ๋“  ๋ณ€๊ฒฝ์‚ฌํ•ญ ์ฟผ๋ฆฌ

'์ธ์Šคํ„ด์Šค ์บก์ฒ˜' ๋‚ด์˜ ํ…Œ์ด๋ธ”์—์„œ ์ˆ˜ํ–‰๋œ CDC ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ณด๋ ค๋ฉด cdc.fn_cdc_get_all_changes_<capture_instance> ์ €์žฅ ์ ˆ์ฐจ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ SQL ๋ฌธ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn = sys.fn_cdc_get_min_lsn(N'customer_cdc')
SET @to_lsn = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_customer_cdc(@from_lsn, @to_lsn, N'all');

ํ…Œ์ด๋ธ”์—์„œ CDC ์‚ฌ์šฉ ์ค‘์ง€

ํ…Œ์ด๋ธ”์˜ CDC ์ถ”์ ์„ ์ค‘์ง€ํ•˜๋ ค๋ฉด sys.sp_cdc_disable_table ์ €์žฅ ํ”„๋กœ์‹œ์ €๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์บก์ฒ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•˜์—ฌ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” 'all'๋กœ ์บก์ฒ˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ…Œ์ด๋ธ”์˜ CDC๋ฅผ ์ค‘์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

EXEC sys.sp_cdc_disable_table
  @source_schema = N'dbo',
  @source_name = N'customer',
  @capture_instance = N'all'

CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ญ์ œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ ์ด๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•˜๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ CDC๋ฅผ ์ค‘์ง€ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ์œ ์‚ฌํ•œ ๋ช…๋ น์–ด๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ค‘์ง€ํ•˜๊ณ  ์‚ญ์ œํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

EXEC msdb.dbo.gcloudsql_cdc_disable_db 'DATABASE_NAME'
DROP DATABASE 'DATABASE_NAME'

์—ฐ๊ฒฐ์ด ์—ด๋ ค ์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

select db_name(dbid),* from sys.sysprocesses where db_name(dbid)= 'DATABASE_NAME'

์—ด๋ ค ์žˆ๋Š” ๋ชจ๋“  ์—ฐ๊ฒฐ์„ ๋‹ซ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ CDC๋ฅผ ์‚ฌ์šฉ ์ค‘์ง€ํ•œ ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

CDC๊ฐ€ ์‚ฌ์šฉ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ€์ ธ์˜ค๊ธฐ

CDC ์‚ฌ์šฉ ์„ค์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ SQL ์„œ๋ฒ„์šฉ Cloud SQL์€ KEEP_CDC ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉ ์„ค์ •๋œ ์ƒํƒœ๋กœ ์œ ์ง€ํ•˜๋ฉฐ ๊ธฐ๋ณธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บก์ฒ˜ ๋ฐ ์‚ญ์ œ ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.