CSV ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๊ธฐ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

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

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

๋‚ด๋ณด๋‚ด๊ธฐ ๋˜๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ ์‚ฌํ•ญ์„ ํ™•์ธํ•˜์„ธ์š”.

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

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

PostgreSQL์šฉ Cloud SQL์—์„œ ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ

PostgreSQL์šฉ Cloud SQL์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ์— ํ•„์š”ํ•œ ์—ญํ•  ๋ฐ ๊ถŒํ•œ

๋ฐ์ดํ„ฐ๋ฅผ Cloud SQL์—์„œ Cloud Storage๋กœ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์—๋Š” ๋‹ค์Œ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • storage.objectAdmin Identity and Access Management(IAM) ์—ญํ• 
  • ๋‹ค์Œ ๊ถŒํ•œ์ด ํฌํ•จ๋œ ๋งž์ถค ์—ญํ• :
    • storage.objects.create
    • storage.objects.list(ํŒŒ์ผ์„ ๋™์‹œ์— ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋งŒ)
    • storage.objects.delete(ํŒŒ์ผ์„ ๋™์‹œ์— ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ์—๋งŒ)

IAM ์—ญํ• ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ Identity and Access Management๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

PostgreSQL์šฉ Cloud SQL์—์„œ CSV ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ ๋‚ด๋ณด๋‚ด๊ธฐ

๋‹ค๋ฅธ ๋„๊ตฌ์™€ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CSV ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. CSV ๋‚ด๋ณด๋‚ด๊ธฐ ๋„์ค‘์— ๋‚ด๋ณด๋‚ผ ์Šคํ‚ค๋งˆ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ˆ˜์ค€์˜ ๋ชจ๋“  ์Šคํ‚ค๋งˆ๋Š” ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ Cloud Storage ๋ฒ„ํ‚ท์˜ CSV ํŒŒ์ผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud SQL ์ธ์Šคํ„ด์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ์ด๋™

  2. ์ธ์Šคํ„ด์Šค์˜ ๊ฐœ์š” ํŽ˜์ด์ง€๋ฅผ ์—ด๋ ค๋ฉด ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์ง„ํ–‰๋˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋‚ด๋ณด๋‚ด๊ธฐ ์˜คํ”„๋กœ๋“œ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  5. Cloud Storage ๋‚ด๋ณด๋‚ด๊ธฐ ์œ„์น˜ ์„น์…˜์—์„œ ๋‚ด๋ณด๋‚ผ ๋ฒ„ํ‚ท, ํด๋”, ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ฐพ์•„๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๋ฒ„ํ‚ท, ํด๋” ๋˜๋Š” ํŒŒ์ผ์„ ์ฐพ๊ฑฐ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

    ์ฐพ์•„๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•œ ๊ฒฝ์šฐ:

    1. ์œ„์น˜ ์„น์…˜์—์„œ ๋‚ด๋ณด๋‚ผ Cloud Storage ๋ฒ„ํ‚ท ๋˜๋Š” ํด๋”๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    2. ์ด๋ฆ„ ์ƒ์ž์— CSV ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์œ„์น˜ ์„น์…˜์˜ ๋ชฉ๋ก์—์„œ ๊ธฐ์กด ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

      .gz ํŒŒ์ผ ํ™•์žฅ์ž(์ „์ฒด ํ™•์žฅ์ž๋Š” .csv.gz)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ์„ ์••์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    3. ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  6. ํ˜•์‹ ์„น์…˜์—์„œ CSV๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  7. ๋‚ด๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„น์…˜์˜ ๋“œ๋กญ๋‹ค์šด ๋ฉ”๋‰ด์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  8. SQL ์ฟผ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ผ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜๋Š” SQL ์ฟผ๋ฆฌ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด guestbook ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ entries ํ…Œ์ด๋ธ”์˜ ์ „์ฒด ์ฝ˜ํ…์ธ ๋ฅผ ๋‚ด๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

    SELECT * FROM guestbook.entries;
    ์ฟผ๋ฆฌ๋Š” ์ง€์ •๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์ฒด๋ฅผ CSV ํ˜•์‹์œผ๋กœ ๋‚ด๋ณด๋‚ผ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

  9. ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  10. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‚ด๋ณด๋‚ผ๊นŒ์š”? ๋Œ€ํ™”์ƒ์ž๊ฐ€ ์—ด๋ฆฌ๊ณ  ํฌ๊ธฐ๊ฐ€ ํฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ฒฝ์šฐ ๋‚ด๋ณด๋‚ด๊ธฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ 1์‹œ๊ฐ„ ์ด์ƒ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๋Š” ๋™์•ˆ ์ธ์Šคํ„ด์Šค์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์ผํ•œ ์ž‘์—…์€ ์ •๋ณด ๋ณด๊ธฐ์ž…๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ์‹œ์ž‘๋œ ํ›„ ์ž‘์—…์„ ์ทจ์†Œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ด๋„ ์ข‹์œผ๋ฉด ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ทจ์†Œ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ ๊ฐ์ฒด ์—…๋กœ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  3. ๋‚ด๋ณด๋‚ผ Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ฐพ์Šต๋‹ˆ๋‹ค. gcloud sql instances describe ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœ๋ ฅ์—์„œ serviceAccountEmailAddress ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
    gcloud sql instances describe INSTANCE_NAME
  4. gcloud storage buckets add-iam-policy-binding์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud SQL ์ธ์Šคํ„ด์Šค ์„œ๋น„์Šค ๊ณ„์ •์— storage.objectAdmin IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  5. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
    gcloud sql export csv INSTANCE_NAME gs://BUCKET_NAME/FILE_NAME \
    --database=DATABASE_NAME \
    --offload \
    --query=SELECT_QUERY
    

    export csv ๋ช…๋ น์–ด ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sql export csv ๋ช…๋ น์–ด ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

  6. ์ด์ „์— ์„ค์ •ํ•œ IAM ์—ญํ• ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์ง€๊ธˆ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.

REST v1

  1. ๋‚ด๋ณด๋‚ด๊ธฐ์— ์‚ฌ์šฉํ•  ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION_NAME --project=PROJECT_NAME
    

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

  2. ์ธ์Šคํ„ด์Šค์— ๋ฒ„ํ‚ท์˜ legacyBucketWriter IAM ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

    ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • project-id: ํ”„๋กœ์ ํŠธ ID
    • instance-id: ์ธ์Šคํ„ด์Šค ID
    • bucket_name: Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„
    • path_to_csv_file: CSV ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
    • database_name: Cloud SQL ์ธ์Šคํ„ด์Šค ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„
    • offload: ์„œ๋ฒ„๋ฆฌ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฆฌ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • select_query: ๋‚ด๋ณด๋‚ผ SQL ์ฟผ๋ฆฌ(์„ ํƒ์‚ฌํ•ญ)
    • escape_character: ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌธ์ž ์•ž์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • quote_character: ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด ์žˆ๋Š” ์—ด์˜ ๊ฐ’์„ ๋ฌถ๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • fields_terminated_by: ์—ด ๊ฐ’์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "2C"๋Š” ์‰ผํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • lines_terminated_by: ์ค„ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "0A"๋Š” ์ค„๋ฐ”๊ฟˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)

    HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/export

    JSON ์š”์ฒญ ๋ณธ๋ฌธ:

    {
     "exportContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "databases": "database_name",
          "offload": true | false
          "csvExportOptions":
           {
               "selectQuery":"select_query",
               "escapeCharacter":"escape_character",
               "quoteCharacter":"quote_character",
               "fieldsTerminatedBy":"fields_terminated_by",
               "linesTerminatedBy":"lines_terminated_by"
           }
       }
    }
    

    ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ JSON ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    databases ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ, select ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ด์ „์— ์„ค์ •ํ•œ IAM ๊ถŒํ•œ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์ง€๊ธˆ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.
์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์ „์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์€ instances:export ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

REST v1beta4

  1. ๋‚ด๋ณด๋‚ด๊ธฐ์— ์‚ฌ์šฉํ•  ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    gcloud storage buckets create gs://BUCKET_NAME --location=LOCATION_NAME --project=PROJECT_NAME

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

  2. ์ธ์Šคํ„ด์Šค์— ๋ฒ„ํ‚ท์˜ storage.objectAdmin IAM ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.

    ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • project-id: ํ”„๋กœ์ ํŠธ ID
    • instance-id: ์ธ์Šคํ„ด์Šค ID
    • bucket_name: Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„
    • path_to_csv_file: CSV ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
    • database_name: Cloud SQL ์ธ์Šคํ„ด์Šค ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„
    • offload: ์„œ๋ฒ„๋ฆฌ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋ฆฌ์Šค ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    • select_query: ๋‚ด๋ณด๋‚ผ SQL ์ฟผ๋ฆฌ(์„ ํƒ์‚ฌํ•ญ)
    • escape_character: ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌธ์ž ์•ž์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • quote_character: ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์—ด ๊ฐ’์„ ๋ฌถ๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • fields_terminated_by: ์—ด ๊ฐ’์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "2C"๋Š” ์‰ผํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • lines_terminated_by: ์ค„ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "0A"๋Š” ์ค„๋ฐ”๊ฟˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)

    HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/export

    JSON ์š”์ฒญ ๋ณธ๋ฌธ:

    {
     "exportContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "databases": "database_name",
          "offload": true | false
          "csvExportOptions":
           {
               "selectQuery": "select_query",
               "escapeCharacter":  "escape_character",
               "quoteCharacter": "quote_character",
               "fieldsTerminatedBy": "fields_terminated_by",
               "linesTerminatedBy": "lines_terminated_by"
           }
       }
    }
    

    ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ JSON ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    databases ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํžˆ ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋งŒ ์ง€์ •ํ•ด์•ผ ํ•˜๋ฉฐ, select ์ฟผ๋ฆฌ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋™์ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  4. ์ด์ „์— ์„ค์ •ํ•œ IAM ์—ญํ• ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์ง€๊ธˆ ์ทจ์†Œํ•ฉ๋‹ˆ๋‹ค.
์ด ์š”์ฒญ์— ๋Œ€ํ•œ ์ „์ฒด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์€ instances:export ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

CSV ๋‚ด๋ณด๋‚ด๊ธฐ ํŒŒ์ผ ํ˜•์‹ ๋งž์ถค์„ค์ •

gcloud ๋˜๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSV ํŒŒ์ผ ํ˜•์‹์„ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ ๋‹ค์Œ ํ˜•์‹ ์ง€์ • ์˜ต์…˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CSV ์˜ต์…˜ ๊ธฐ๋ณธ๊ฐ’ gcloud ํ”Œ๋ž˜๊ทธ REST API ์†์„ฑ ์„ค๋ช…
Esc

"5C"

ํŒŒ์ผ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ์˜ ASCII 16์ง„์ˆ˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

--escape escapeCharacter

์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌธ์ž ์•ž์— ํ‘œ์‹œ๋˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

MySQL ๋ฐ PostgreSQL์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

Quote

"22"

ํฐ๋”ฐ์˜ดํ‘œ์˜ ASCII 16์ง„์ˆ˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

--quote quoteCharacter

๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์—ด ๊ฐ’์„ ๋ฌถ๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

MySQL ๋ฐ PostgreSQL์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ๊ตฌ๋ถ„ ๊ธฐํ˜ธ

"2C"

์‰ผํ‘œ์˜ ASCII 16์ง„์ˆ˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

--fields-terminated-by fieldsTerminatedBy

์—ด ๊ฐ’์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

MySQL ๋ฐ PostgreSQL์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์ค„๋ฐ”๊ฟˆ ๋ฌธ์ž

"0A"

์ค„๋ฐ”๊ฟˆ์˜ ASCII 16์ง„์ˆ˜ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

--lines-terminated-by linesTerminatedBy

์ค„ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค.

MySQL์—์„œ๋งŒ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ด๋Ÿฌํ•œ ์ธ์ˆ˜๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๋Š” gcloud ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

gcloud sql export csv INSTANCE_NAME gs://BUCKET_NAME/FILE_NAME \
--database=DATABASE_NAME \
--offload \
--query=SELECT_QUERY \
--quote="22" \
--escape="5C" \
--fields-terminated-by="2C" \
--lines-terminated-by="0A"

์ด์— ์ƒ์‘ํ•˜๋Š” REST API ์š”์ฒญ ๋ณธ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
 "exportContext":
   {
      "fileType": "CSV",
      "uri": "gs://bucket_name/path_to_csv_file",
      "databases": "DATABASE_NAME",
      "offload": true,
      "csvExportOptions":
       {
           "selectQuery": "SELECT_QUERY",
           "escapeCharacter":  "5C",
           "quoteCharacter": "22",
           "fieldsTerminatedBy": "2C",
           "linesTerminatedBy": "0A"
       }
   }
}

๊ธฐ๋ณธ์ ์œผ๋กœ CSV ์ถœ๋ ฅ์˜ ๊ฒฐ๊ณผ๋Š” ํ‘œ์ค€ CSV ํ˜•์‹์ž…๋‹ˆ๋‹ค. Cloud SQL์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ์˜ต์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ psql ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‹ค์Œ ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      \copy [table_name] TO '[csv_file_name].csv' WITH
          (FORMAT csv, ESCAPE '[escape_character]', QUOTE '[quote_character]',
          DELIMITER '[delimiter_character]', ENCODING 'UTF8', NULL '[null_marker_string]');

PostgreSQL์šฉ Cloud SQL๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

PostgreSQL์šฉ Cloud SQL๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ์— ํ•„์š”ํ•œ ์—ญํ•  ๋ฐ ๊ถŒํ•œ

๋ฐ์ดํ„ฐ๋ฅผ Cloud Storage์—์„œ Cloud SQL๋กœ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋‹ค์Œ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์—๋Š” ๋‹ค์Œ ์—ญํ•  ์ค‘ ํ•˜๋‚˜๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • storage.objectAdmin IAM ์—ญํ• 
  • ๋‹ค์Œ ๊ถŒํ•œ์ด ํฌํ•จ๋œ ๋งž์ถค ์—ญํ• :
    • storage.objects.get
    • storage.objects.list(๋™์‹œ์— ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒฝ์šฐ์—๋งŒ)

IAM ์—ญํ• ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ Identity and Access Management๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

CSV ํŒŒ์ผ์—์„œ PostgreSQL์šฉ Cloud SQL๋กœ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

CSV ํŒŒ์ผ ํ˜•์‹ ์š”๊ตฌ์‚ฌํ•ญ

CSV ํŒŒ์ผ์€ ๊ฐ ๋ฐ์ดํ„ฐ ํ–‰์— ์ค„์ด ํ•˜๋‚˜์”ฉ ์žˆ๊ณ  ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CSV ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜์—ฌ Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.

์ฝ˜์†”

  1. Google Cloud ์ฝ˜์†”์—์„œ Cloud SQL ์ธ์Šคํ„ด์Šค ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

    Cloud SQL ์ธ์Šคํ„ด์Šค๋กœ ์ด๋™

  2. ์ธ์Šคํ„ด์Šค์˜ ๊ฐœ์š” ํŽ˜์ด์ง€๋ฅผ ์—ด๋ ค๋ฉด ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  4. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋Š” ํŒŒ์ผ ์„ ํƒ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ์— ์‚ฌ์šฉํ•  ๋ฒ„ํ‚ท๊ณผ CSV ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ํŒŒ์ผ์„ ์ฐพ์œผ๋ ค๋ฉด ๋‹ค์Œ ์•ˆ๋‚ด๋ฅผ ๋”ฐ๋ฅด์„ธ์š”.
    1. ๋‘˜๋Ÿฌ๋ณด๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    2. ์œ„์น˜ ์„น์…˜์˜ ๋ชฉ๋ก์—์„œ ๋ฒ„ํ‚ท ์ด๋ฆ„์„ ๋”๋ธ”ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
    3. ๋ชฉ๋ก์—์„œ ํŒŒ์ผ์„ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
    4. ์„ ํƒ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

    ์••์ถ•๋œ ํŒŒ์ผ(.gz) ๋˜๋Š” ์••์ถ•๋˜์ง€ ์•Š์€ ํŒŒ์ผ(.csv)์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  5. ํ˜•์‹ ์„น์…˜์—์„œ CSV๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  6. Cloud SQL ์ธ์Šคํ„ด์Šค์—์„œ CSV ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  7. ๊ฐ€์ ธ์˜ค๊ธฐ ์ž‘์—…์˜ ์‚ฌ์šฉ์ž๋ฅผ ์„ ํƒ์‚ฌํ•ญ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  8. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํด๋ฆญํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

gcloud

  1. Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ ๊ฐ์ฒด ์—…๋กœ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  3. CSV ํŒŒ์ผ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  4. ๋‚ด๋ณด๋‚ผ Cloud SQL ์ธ์Šคํ„ด์Šค์˜ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ฐพ์Šต๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ ์‚ฌ์šฉํ•ด gcloud sql instances describe ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ถœ๋ ฅ์—์„œ serviceAccountEmailAddress ํ•„๋“œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
    gcloud sql instances describe INSTANCE_NAME
  5. serviceAccountEmailAddress ํ•„๋“œ๋ฅผ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
  6. gcloud storage buckets add-iam-policy-binding์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„ํ‚ท์˜ Cloud SQL ์ธ์Šคํ„ด์Šค ์„œ๋น„์Šค ๊ณ„์ •์— storage.objectAdmin IAM ์—ญํ• ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  7. ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
    gcloud sql import csv INSTANCE_NAME gs://BUCKET_NAME/FILE_NAME \
    --database=DATABASE_NAME \
    --table=TABLE_NAME

    import csv ๋ช…๋ น์–ด ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sql import csv ๋ช…๋ น์–ด ์ฐธ์กฐ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

  8. ์ด์ „์— ์„ค์ •ํ•œ IAM ๊ถŒํ•œ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด gcloud storage buckets remove-iam-policy-binding์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

REST v1

  1. Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ ๊ฐ์ฒด ์—…๋กœ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  3. ์ธ์Šคํ„ด์Šค์— ๋ฒ„ํ‚ท์˜ legacyBucketWriter ๋ฐ objectViewer IAM ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  4. ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • project-id: ํ”„๋กœ์ ํŠธ ID
    • instance-id: ์ธ์Šคํ„ด์Šค ID
    • bucket_name: Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„
    • path_to_csv_file: CSV ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
    • database_name: Cloud SQL ์ธ์Šคํ„ด์Šค ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„
    • table_name: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„
    • escape_character: ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌธ์ž ์•ž์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • quote_character: ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์—ด ๊ฐ’์„ ๋ฌถ๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • fields_terminated_by: ์—ด ๊ฐ’์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "2C"๋Š” ์‰ผํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • lines_terminated_by: ์ค„ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ 16์ง„์ˆ˜ ASCII ์ฝ”๋“œ์˜ ๋ฌธ์ž์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "0A"๋Š” ์ค„๋ฐ”๊ฟˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)

    HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

    POST https://sqladmin.googleapis.com/v1/projects/project-id/instances/instance-id/import

    JSON ์š”์ฒญ ๋ณธ๋ฌธ:

    {
     "importContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "database": "database_name",
          "csvImportOptions":
           {
             "table": "table_name",
             "escapeCharacter": "escape_character",
             "quoteCharacter": "quote_character",
             "fieldsTerminatedBy": "fields_terminated_by",
             "linesTerminatedBy": "lines_terminated_by"
           }
       }
    }
    
    

    ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ JSON ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ์ด ์š”์ฒญ์„ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ „์ฒด ๋ชฉ๋ก์€ instances:import ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  5. ์ด์ „์— ์„ค์ •ํ•œ IAM ๊ถŒํ•œ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

REST v1beta4

  1. Cloud Storage ๋ฒ„ํ‚ท์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. ํŒŒ์ผ์„ ๋ฒ„ํ‚ท์— ์—…๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

    ๋ฒ„ํ‚ท์— ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ์— ๋Œ€ํ•œ ๋„์›€๋ง์€ ๊ฐ์ฒด ์—…๋กœ๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  3. ์ธ์Šคํ„ด์Šค์— ๋ฒ„ํ‚ท์˜ storage.objectAdmin IAM ์—ญํ• ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. IAM ๊ถŒํ•œ ์„ค์ •์— ๋Œ€ํ•œ ๋„์›€๋ง์€ IAM ๊ถŒํ•œ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
  4. ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

    ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

    • project-id: ํ”„๋กœ์ ํŠธ ID
    • instance-id: ์ธ์Šคํ„ด์Šค ID
    • bucket_name: Cloud Storage ๋ฒ„ํ‚ท ์ด๋ฆ„
    • path_to_csv_file: CSV ํŒŒ์ผ์˜ ๊ฒฝ๋กœ
    • database_name: Cloud SQL ์ธ์Šคํ„ด์Šค ๋‚ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ด๋ฆ„
    • table_name: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ์ด๋ฆ„
    • escape_character: ์ด์Šค์ผ€์ดํ”„ ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฌธ์ž ์•ž์— ํ‘œ์‹œ๋˜์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • quote_character: ๋ฌธ์ž์—ด ๋ฐ์ดํ„ฐ ์œ ํ˜•์˜ ์—ด ๊ฐ’์„ ๋ฌถ๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "22"๋Š” ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • fields_terminated_by: ์—ด ๊ฐ’์„ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "2C"๋Š” ์‰ผํ‘œ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)
    • lines_terminated_by: ์ค„ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š” ๋ฌธ์ž์ž…๋‹ˆ๋‹ค. ์ด ์ธ์ˆ˜ ๊ฐ’์€ ASCII 16์ง„์ˆ˜ ํ˜•์‹์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด "0A"๋Š” ์ค„๋ฐ”๊ฟˆ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. (์„ ํƒ์‚ฌํ•ญ)

    HTTP ๋ฉ”์„œ๋“œ ๋ฐ URL:

    POST https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/import

    JSON ์š”์ฒญ ๋ณธ๋ฌธ:

    {
     "importContext":
       {
          "fileType": "CSV",
          "uri": "gs://bucket_name/path_to_csv_file",
          "database": "database_name",
          "csvImportOptions":
           {
             "table": "table_name",
             "escapeCharacter": "escape_character",
             "quoteCharacter": "quote_character",
             "fieldsTerminatedBy": "fields_terminated_by",
             "linesTerminatedBy": "lines_terminated_by"
           }
       }
    }
    
    

    ์š”์ฒญ์„ ๋ณด๋‚ด๋ ค๋ฉด ๋‹ค์Œ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ํŽผ์นฉ๋‹ˆ๋‹ค.

    ๋‹ค์Œ๊ณผ ๋น„์Šทํ•œ JSON ์‘๋‹ต์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

    ์ด ์š”์ฒญ์„ ์œ„ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ „์ฒด ๋ชฉ๋ก์€ instances:import ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  5. ์ด์ „์— ์„ค์ •ํ•œ IAM ๊ถŒํ•œ์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉด ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

PostgreSQL์šฉ Cloud SQL์˜ CSV ํŒŒ์ผ ํ˜•์‹ ๋งž์ถค์„ค์ •

gcloud ๋˜๋Š” REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CSV ํŒŒ์ผ ํ˜•์‹์„ ๋งž์ถค์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ˜ํ”Œ gcloud ๋ช…๋ น์–ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

gcloud sql import csv INSTANCE_NAME gs://BUCKET_NAME/FILE_NAME \
--database=DATABASE_NAME \
--table=TABLE_NAME \
--quote="22" \
--escape="5C" \
--fields-terminated-by="2C" \
--lines-terminated-by="0A"

์ด์— ์ƒ์‘ํ•˜๋Š” REST API ์š”์ฒญ ๋ณธ๋ฌธ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

{
 "importContext":
   {
      "fileType": "CSV",
      "uri": "gs://bucket_name/path_to_csv_file",
      "database": "DATABASE_NAME",
      "csvImportOptions":
       {
           "table": "TABLE_NAME",
           "escapeCharacter":  "5C",
           "quoteCharacter": "22",
           "fieldsTerminatedBy": "2C",
           "linesTerminatedBy": "0A"
       }
   }
}

ERROR_RDBMS ์˜ค๋ฅ˜๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”์ด ์žˆ์œผ๋ฉด ๋ฒ„ํ‚ท์— ๋Œ€ํ•œ ์˜ฌ๋ฐ”๋ฅธ ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. Cloud Storage์—์„œ ์•ก์„ธ์Šค ์ œ์–ด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•ก์„ธ์Šค์ œ์–ด ๋ชฉ๋ก ๋งŒ๋“ค๊ธฐ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ด ์ž‘์—…๊ณผ ๊ด€๋ จ๋œ ๊ธฐ๋ณธ REST API ์š”์ฒญ์ด ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ํ™•์ธํ•˜๋ ค๋ฉด instances:import ํŽ˜์ด์ง€์˜ API ํƒ์ƒ‰๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„