Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DMSを使った異種DB移行で学んだPostgreSQLの面白い所/chugokudb27-postgresql-is-interesting

 DMSを使った異種DB移行で学んだPostgreSQLの面白い所/chugokudb27-postgresql-is-interesting

# 概要

所属の会社にて 去年の8月頃から AWSのDMSを使用して MySQL から PostgreSQLへ異種間のDB移行をやっています。 これまでMySQLしか使ってこなかった自分がPostgreSQLを始めて使って行った中で面白いな、と思ったPostgreSQLの話を紹介させて頂きたいと思います。

# 対象者

・ DMSって何って方(概要は説明しようと思います)
・ MySQLを業務で触っている方
・ PostgreSQLを業務で触っている方
・ アプリケーションエンジニア寄りの方

Takahashi Ikki

May 18, 2019
Tweet

More Decks by Takahashi Ikki

Other Decks in Programming

Transcript

  1. ࠓ೔ͷ͓࿩ • ΦϛΧϨʹͯDBϦϑΝΫλϦϯάΛ΍ͬͯΔɻ • ͦΕʹ͸DMSͱ͍͏AWSͷαʔϏεΛ׆༻͍ͯ͠Δɻ • DMSͬͯԿʁ • ͲΜͳ෩ʹ΍ͬͯΔͷʁ •

    MySQL͔͠΍ͬͯແ͔ͬͨ๻͕PostgreSQLΛ৮ͬͯΈͯ ͜Μͳࣄग़དྷΔͷ͔ɺͱࢥͬͨࣄΛ঺հ ʮ໘ന͍ͱ͜Ζʢখฒײʣʯ 8
  2. ΦϛΧϨʹ͍ͭͯ • αʔϏε։͔࢝Β໿8೥͕ܦա͍ͯ͠Δɻ • ͜͜1೥Ͱ ։ൃਓһ͕ࣾһ1໊ + ֎஫ ͷମ੍͔Β ։ൃࣾһ9໊

    ͷମ੍ʹมֵɻ • ৭Μͳେਓͷࣄ৘͔Β͍ΘΏΔٕज़తෛ࠴ͱ ݺ͹ΕΔ΋ͷ͕ͦΕͳΓʹ͋Δɻ 11
  3. gender ΧϥϜ ૝ఆ ࣮ࡍ ܕ int ೖΔσʔλ 0, 1, 2

    σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 16
  4. gender ΧϥϜ ૝ఆ ࣮ࡍ ܕ int ೖΔσʔλ 0, 1, 2

    σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ PostgreSQLʮ!!cannot convert int!!ʯ 17
  5. gender ΧϥϜ ૝ఆ ࣮ࡍ ܕ int varchar ೖΔσʔλ 0, 1,

    2 0, 1, 2, உੑ, ঁੑ σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 18
  6. AWS DMS ͷߏ੒ཁૉ • ιʔεΤϯυϙΠϯτ • σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3

    ͳͲɻ • λʔήοτΤϯυϙΠϯτ • σʔλͷίϐʔઌɻEC2onDB, RDS, ΦϯϓϨDB, S3, DynamoDB ͳͲɻ • ϨϓϦέʔγϣϯΠϯελϯε • ίϐʔݩ͔Βίϐʔઌ΁σʔλͷϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ • λεΫ • ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ େମ͜Ε͚͓͚֮ͩ͑ͯ͹׬શʹཧղग़དྷΔ 23
  7. ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ • ΠϯελϯεΫϥε͸ T2, C4, R4ͷ̏छྨΛαϙʔτ. • T2: ։ൃɾݕূ༻ •

    C4: େྔͷԋࢉΛߦ͏৔߹ʹ໾ཱͭɻ (AWSతʹ͸ ҟछDBҠߦ͸͜ΕΛ͢͢Ί͍ͯΔ) • R4: ϝϞϦ૿ՃΠϯελϯεɻ (ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͸͜Ε.) • ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ. • ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠Δͷ͸͜ͷΠϯελϯεར༻ྉͱετϨʔδ͚ͩɻ ʢ※ॾઆʣ 24
  8. DBͷϦϑΝΫλϦϯά • ϦϑΝΫλϦϯάͨ͠ޙͷDBΛ༻ҙ͠ DMSΛͰϨϓϦέʔγϣϯ͢Δɻ • ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰ DBͷτϦΨʔΛൃಈͤ͞Δ • AuroraͷҠߦઌΛPostgreSQLʹͨ͠ͷ ͸

    PostgreSQLͷํ͕τϦΨʔ͕ॊೈͳҝ • τϦΨʔ಺ͰچσʔλΛՃ޻͠ ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷ ܗࣜʹ߹͏Α͏ʹొ࿥͢Δɻ 35
  9. 37

  10. ͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ • ߋ৽API͸MySQL΁ॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠΋ طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ • ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ໰୊͕͋Ε͹ௐ੔͢Δɻˠ ... ͳͲͷΑ͏ʹ

    ΧφϦΞϦϦʔε ܗࣜͰ গͮͭ͠վળΛਐΊ͍͚ͯΔɻ • σʔλͷಡࠐ͸PostgreSQL͔Βߦ͏ͷͰ ॻࠐAPIΛݺͿଆ͸ͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λ ؾʹ͠ͳͯ͘΋ྑ͍ɻ 38
  11. ͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ • ϩʔΧϧͷ։ൃ؀ڥΛ࡞੒͢Δࣄ͕ग़དྷͳ͍ɻ ※ ຊ౰ਏ͍ɻ͍͍ײ͡ͷແ͍Ͱ͔͢Ͷɾɾʁ • DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ ※ τϦΨʔΤϥʔ౳ͰDMS͕ࢭ·ΔͱαʔϏε͕ࢭ·Δɻ •

    DMS͕஗Ԇͨ࣌͠ͷߟྀ͕೉͍͠ɻ ※ ࠓͷॴɺக໋ই͸ͳ͍ɻ(ই͕ແ͍ͱ͸ݴͬͯͳ͍) • ίϯϑϦΫτ͢Δࣄ͕ݒ೦͞ΕΔͷͰϦʔυϨϓϦΧʹ·ͰτϦΨʔΛషΕͳ͍͕ ϦʔυϨϓϦΧ͕Ϛελʔʹঢ֨͢ΔͱαʔϏε͕ࢭ·Δɻ • ͦͷଞ৭Μͳҋ͸࠙਌ձͰʂ Suddenly Kigenzen ͱ͔ God Unknown Datetime ͱ͔ɻ 39
  12. 3. DMSΛ࢖ͬͨDBϦϑΝΫλϦϯά ·ͱΊ • AWS DMSͰ MySQL͔ΒPostgreSQLʹ ϨϓϦέʔγϣϯ͍ͯ͠Δɻ • DMS͕Ҡߦͨ͠λΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠

    ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ • ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭ ϦϑΝΫλϦϯάͨ͠DBʹࢀরΛ੾Γସ͍͚͍͑ͯͯΔɻ • ϩʔΧϧͷ؀ڥߏங͕೉͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹ ࢀরAPI͕ίέΔͷͰߟྀ͕೉͍͠ɻ 40
  13. Returning۟ ྫ͑͹ɺ (id͸serialܕ (auto increment) ) INSERT INTO users (email,

    password) VALUES ('[email protected]', 'password') RETURNING id, email, password; ͱॻ͘ͱ ૠೖ݁Ռ͕ฦͬͯ͘Δɻ MySQLͷLAST_INSER_ID()ΑΓ΋ڧྗ. 54
  14. parties = [ {'title': 'ύʔςΟʔ1', date: '2019೥06݄10೔'}, {'title': 'ύʔςΟʔ2', date:

    '2019೥06݄11೔'}, {'title': 'ύʔςΟʔ3', date: '2019೥06݄12೔'}, ] inserted_parties = Party.objects.bulk_create(parties) # ↓ ͜͏ͳΔ [ {'id': 1, 'title': 'ύʔςΟʔ1', date: '2019೥06݄10೔'}, {'id': 2, 'title': 'ύʔςΟʔ2', date: '2019೥06݄11೔'}, {'id': 3, 'title': 'ύʔςΟʔ3', date: '2019೥06݄12೔'}, ] 57
  15. ఆٛͨ͠ Materialized View͸௨ৗͷςʔϒϧͷΑ͏ʹ ΞΫηε͕ՄೳͱͳΔɻ -- SELECT͸΋ͪΖΜͷ͜ͱ SELECT * FROM active_users;

    -- JOIN΋Մೳ SELECT * FROM reserves INNER JOIN active_users ON reserves.user_id = active_users.id; 60
  16. ͦͷଞʹ΋IndexΛషΕͨΓ͢Δ. CREATE MATERIALIZED VIEW active_users AS SELECT id , name

    , gender , created_at FROM users WHERE delete_flag = 0; CREATE INDEX active_users_idx1 ON active_users (created_at); 61
  17. Materialized ViewͷσϝϦοτ ͱ͸͍͑ɺ͋͘·Ͱ ʮΩϟογϡʯ ͳͷͰ ϦΞϧλΠϜੑͷ͋Δ΋ͷ౳ʹ͸޲͔ͳ͍ɻ ߋ৽͢Δʹ͸ MATERIALIZED VIEW active_users;

    Λ͠ͳ͍ͱ͍͚ͳ͍͕ શσʔλΛߋ৽͢ΔͷͰ ॏ͍Query͸REFRESHͷ౓ʹྲྀΕͯ͠·͏ɻ ʢPostgreSQLʹ͸ϚςϏϡʔͷ෦෼ߋ৽ͷػೳ͸ͳ͍ʣ 63
  18. Πϕϯτࠂ஌ • Φʔϓϯηϛφʔ2019@Ԭࢁ • 2019೥06݄29೔ (౔) • ࠓճͷςʔϚ͸ʮTechnology X Societyʯ

    ࠓ೥ͷΦʔϓϯηϛφʔԬࢁͰ͸ɺςΫϊϩδʔͰࣾձͱؔΘΓʹ͓ ͍ͯϢχʔΫͳൃ૝΍࢖໋Λ͓࣋ͪͷํͨͪͷ͓࿩Λ͓ಧ͚͠·͢ɻ ਃ͠ࠐΈ: https://okayama.open-seminar.org/ ʢΦϛΧϨ͸ΰʔϧυεϙϯαʔʂʣ 72