Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapa...
Search
Takahashi Ikki
November 22, 2018
Programming
5
8k
MySQLからPostgreSQLへの移行とDBリファクタリング/postgresqlJapan2018
2018-11-22 に行われた PostgreSQL Conference Japan 2018 のスライドです!
Takahashi Ikki
November 22, 2018
Tweet
Share
More Decks by Takahashi Ikki
See All by Takahashi Ikki
のびしろを広げる巻き込まれ力:偶然を活かすキャリアの作り方/oso2024
takahashiikki
1
740
ビジネスを止めずにシステムリプレースを進める為のCDCという選択肢/osc24ng-2-b
takahashiikki
0
68
アプリケーションエンジニアから見たPostgreSQL16 の新機能/postgresql16-new-information
takahashiikki
0
320
システムリプレースの中でCDCを取り入れている話/chugokudb32-cdc
takahashiikki
1
510
DBリファクタリングのデータリモデリング勘所/stafesstudy-db-modling
takahashiikki
5
2.1k
アプリケーションエンジニアから見たPostgreSQL15 の新機能/postgresql15-new-information
takahashiikki
7
2.9k
HowDoYouLikePostgreSQl12/Chugokudb28-1
takahashiikki
1
1.2k
SQLチューニング_理論と改善の実例_/pgcon19j_t4
takahashiikki
10
3.6k
SQLチューニング 理論と実践/osc19ni
takahashiikki
0
790
Other Decks in Programming
See All in Programming
テスターからテストエンジニアへ ~新米テストエンジニアが歩んだ9ヶ月振り返り~
non0113
2
240
SQLアンチパターン第2版 データベースプログラミングで陥りがちな失敗とその対策 / Intro to SQL Antipatterns 2nd
twada
PRO
35
10k
状態遷移図を書こう / Sequence Chart vs State Diagram
orgachem
PRO
3
300
Vibe Codingの幻想を超えて-生成AIを現場で使えるようにするまでの泥臭い話.ai
fumiyakume
18
9.5k
Understanding Kotlin Multiplatform
l2hyunwoo
0
230
Streamlitで実現できるようになったこと、実現してくれたこと
ayumu_yamaguchi
2
240
Vibe coding コードレビュー
kinopeee
0
110
Workers を定期実行する方法は一つじゃない
rokuosan
0
130
PHPカンファレンス関西2025 基調講演
sugimotokei
6
1k
AI コーディングエージェントの時代へ:JetBrains が描く開発の未来
masaruhr
2
220
抽象化という思考のツール - 理解と活用 - / Abstraction-as-a-Tool-for-Thinking
shin1x1
1
890
AI Agent 時代のソフトウェア開発を支える AWS Cloud Development Kit (CDK)
konokenj
6
1k
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.3k
GitHub's CSS Performance
jonrohan
1031
460k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
A designer walks into a library…
pauljervisheath
207
24k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
656
60k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
161
15k
Designing for humans not robots
tammielis
253
25k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
48
2.9k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
Speed Design
sergeychernyshev
32
1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.3k
Transcript
MySQL ͔Β PostgreSQL ͷҠߦͱ DBϦϑΝΫλϦϯά 2018-11-22 PostgreSQL Conference Japan 2018
ຊPostgreSQLϢʔβʔձ தࠃํࢧ෦ ߴڮ Ұٍ 1
͓͠ͳ͕͖ 1. ࣗݾհ 2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏ 3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝ 4. AWS Database
Migration Serviceͱ 5. ҠߦࣦഊͷࢹΛͲͷΑ͏ʹ͍ͬͯΔ͔ 6. ·ͱΊ 2
ҙࣄ߲ • εϥΠυެ։͠·͢ɻ • ࣭ͱ͔͝ࢦఠͱ͔ॾʑͷϑΟʔυόοΫ͕͍͟͝·ͨ͠Β #pgcon18j ͓ئ͍க͠·͢ɻ • EC2
RDS ͳͲͱ͍ͬͨAWSͷαʔϏεͷࣄલ͕ࣝඞཁͰ͢ɻ • EC2: AWS͕ఏڙ͢ΔԾαʔόʔ • RDS: AWS͕ఏڙ͢ΔϚωʔδυRDBαʔϏε 3
1. ࣗݾհ • ߴڮ Ұٍ • Ԭࢁࡏॅ • גࣜձࣾΦϛΧϨ WebΤϯδχΞ
• ຊPostgreSQLϢʔβʔձ தࠃࢧ෦ • PostgreSQLྺ 4ϲ݄ ! 4
גࣜձࣾΦϛΧϨ (ࣗࣾʹ͍ͭͯͪΐͬͱએ) શࠃ35,000݅ͷࠗ׆ύʔςΟΛ ܝࡌͨ͠ϙʔλϧαΠτ 25ສਓڧͷձһͷํʑʹ͝ར༻͍͍ͯ· ͢ɻ ࠗ׆ͱݴ͑ΦϛΧϨʂ \\͍͍݁ࠗͧʂʂ// 5
ʮMySQL͔ΒPostgreSQLͷҠߦͱDBϦϑΝΫλϦϯάʯ ΦϛΧϨͰݱࡏਐߦதͷϓϩδΣΫτɻ • ԿނDBϦϑΝΫλϦϯάΛΔͷ͔ɻ • ԿނMySQL͔ΒPostgreSQLͳͷ͔ɻ • ΤϥʔͷࢹͲ͏͍ͬͯΔͷ͔ɻ • ͲΜͳࣄͰΜͩͷ͔ɻ
6
2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱ ͦͷख๏ 7
ΦϛΧϨʹ͍ͭͯ • αʔϏε։͔࢝Β͕̓ܦա͍ͯ͠Δɻ • ͜͜ఔͰ ։ൃਓһ͕ࣾһ1໊ + ֎ ͷମ੍͔Β ࣾһ6໊
ͷମ੍ʹมֵɻ • ৭Μͳେਓͷࣄ͔ΒͦΕͳΓʹ͍ΘΏΔٕज़తෛ࠴ͱݺ ΕΔͷ͕͋Δɻ 8
ྫ͑ɾɾ ʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ 9
ྫ͑ɾɾ ʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ ʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯ 10
ྫ͑ɾɾ ʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ ʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯ ʮʮʮ͍͊ɻɻɻ ! ʁʯʯʯ 11
ྫ͑ɾɾ ʮσʔλϕʔεߏΛோΊΔձΖ͏ʂʯ ʮ͜ͷςʔϒϧԿʹͬͯΔ͔୭͔ͬͯΔʁʯ ʮʮʮ͍͊ɻɻɻ ! ʁʯʯʯ ୭Βͳ͍ςʔϒϧͷڪා... 12
gender ΧϥϜ ఆ ࣮ࡍ ܕ int ೖΔσʔλ 0, 1, 2
σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 13
gender ΧϥϜ ఆ ࣮ࡍ ܕ int varchar ೖΔσʔλ 0, 1,
2 0, 1, 2, உੑ, ঁੑ σʔλͷҙຯ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 0: ະఆٛ, 1: உੑ, 2: ঁੑ 14
ݱঢ়ͷ՝ • ࠓޙͷࣄۀͷͷҝʹεϐʔυײ͕ඞཁෆՄܽɻ • WebʹRDBʹϦϑΝΫλϦϯάͷ՝͕͋Δɻ • ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄग़དྷͳ͍ɻ • ͳΔ͘ແఀࢭͰ͔ͭԁʹ։ൃΛਐΊΔͨΊʹ ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ
͝հ͖ͤͯ͞·͢ʂʂ 15
ݱঢ়ͷ՝ • ࠓޙͷࣄۀͷͷҝʹεϐʔυײ͕ඞཁෆՄܽɻ • WebʹRDBʹϦϑΝΫλϦϯάͷ՝͕͋Δɻ • ݶΒΕͨϦιʔεΛશͯϦϑΝΫλϦϯάʹׂ͘ࣄग़དྷͳ͍ɻ • ͳΔ͘ແఀࢭͰ͔ͭԁʹ։ൃΛਐΊΔͨΊʹ ฐࣾCTOͦʔ͍ͩ(@soudai1025)͞Μ͕
ߟ͑ͨRDBϦϑΝΫλϦϯάͷํ๏Λ ͝հ͖ͤͯ͞·͢ʂʂ 16
ϦϑΝΫλϦϯάख๏ 17
ݱঢ়ͷΞʔΩςΫνϟ ෳͷαʔϏε͕ӡ༻͞Ε͓ͯΓ ୯ҰͷMySQLͷhogeεΩʔϚ͔Β σʔλΛࢀর͍ͯ͠Δɻ ՝ • ͕ݶΒΕ͍ͯΔҝɺ ϦϑΝΫλϦϯάͨ͠ޙɺશαʔϏεͷ ࢀরՕॴͷमਖ਼Λ͍ͯ͘͠ͷ͍͠ɻ •
Өڹൣғ͕ಡΊͳ͍ɻ 18
WebͷϦϑΝΫλϦϯάํ๏ APIαʔϏεΛ৽͘͠࡞Γɺ ֤ػೳΛݸผͷAPIͱͯ͠࡞͢Δɻ APIΛ࡞͢Δஈ֊Ͱ֤αʔϏεͰෆཁʹͳͬͯ ͍ΔॲཧͳͲΛআͯ͠ϦϑΝΫλϦϯά͢Δɻ ·ͨɺAPIܦ༝ʹมߋΛ͢ΔλΠϛϯάͰWebଆ ͷίʔυϦϑΝΫλϦϯά͢Δɻ ྫ͑ • ΦϛΧϨձһొ/ࢀরAPI
• ࠗ׆ύʔςΟΛݕࡧ͢Δػೳ • ࠗ׆ύʔςΟͷ༧͢ΔAPI 19
DBͷϦϑΝΫλϦϯάํ๏ • ผͷΠϯελϯεΛ༻ҙ͠ɺ AWS Database Migration ServiceΛ ༻ͯ͠ϨϓϦέʔγϣϯ͢Δɻ • ϨϓϦέʔγϣϯ͞ΕͨλΠϛϯάͰ
DBͷτϦΨʔΛൃಈͤ͞Δɻ • τϦΨʔͰچσʔλΛՃ͠ ϦϑΝΫλϦϯάͨ͠ςʔϒϧͷ ܗࣜʹ߹͏Α͏ʹొ͢Δɻ • ࠓޙNEWεΩʔϚΛࢀর͢Δɻ 20
ϦϑΝΫλϦϯάख๏ • Webগͮͭ͠APIܦ༝Ͱ ࢀরɾॻࠐ͢ΔΑ͏ʹมߋΛ ਐΊΔɻ (WebͷϦϑΝΫλϦϯά) • APIॻࠐMySQLଆߦ͍ɺ ಡࠐPostgreSQLଆ͔Βߦ͏ɻ (DBͷϦϑΝΫλϦϯά)
• WebଆΛશͯAPIܦ༝ʹग़དྷͨΒ APIͷॻࠐPostgreSQLଆ มߋ͢Δɻ 21
22
͜ͷϦϑΝΫλϦϯάํ๏ͷϝϦοτ • ߋ৽APIMySQLॻࠐΛ͢ΔͷͰগͮͭ͠APIܦ༝ʹͯ͠ طଘαʔϏεͷςʔϒϧͷࢀরՕॴʹӨڹ͕ແ͍ɻ • ҰՕॴAPIܦ༝ʹͯ͠ΈΔ → ͕͋Εௐ͢Δɻˠ ... ͳͲͷΑ͏ʹ
ΧφϦΞϦϦʔε ܗࣜͰ গͮͭ͠վળΛਐΊ͍͚ͯΔɻ • σʔλͷಡࠐPostgreSQL͔Βߦ͏ͷͰ ॻࠐAPIΛݺͿଆͲͪΒʹॻ͖ࠐΜͰ͍Δ͔Λ ؾʹ͠ͳͯ͘ྑ͍ɻ 23
͜ͷϦϑΝΫλϦϯάํ๏ͷσϝϦοτ • ϩʔΧϧͷ։ൃڥΛ࡞͢Δࣄ͕ग़དྷͳ͍ɻ ※ ࠓɺׂͱҰ൪·͍͠ॴɻ • DMS͕ࢭ·ͬͨ࣌ʹࢀরAPI͕ίέΔɻ ※ τϦΨʔΤϥʔͰDMS͕ࢭ·ΔͱαʔϏε͕ࢭ·Δɻ •
DMS͕Ԇͨ࣌͠ͷߟྀ͕͍͠ɻ ※ ࠓͷॴɺக໋ইͳ͍ɻ(ই͕ແ͍ͱݴͬͯͳ͍) • ίϯϑϦΫτ͢Δࣄ͕ݒ೦͞ΕΔͷͰϦʔυϨϓϦΧʹ·ͰτϦΨʔΛషΕͳ͍͕ ϦʔυϨϓϦΧ͕Ϛελʔʹঢ֨͢ΔͱαʔϏε͕ࢭ·Δɻ 24
2. DBϦϑΝΫλϦϯάΛΔཧ༝ͱͦͷख๏ ·ͱΊ • AWS DMSͰ MySQL͔ΒPostgreSQLʹ ϨϓϦέʔγϣϯ͍ͯ͠Δɻ • DMS͕Ҡߦͨ͠λΠϛϯάͰઃఆͨ͠τϦΨʔ͕ൃಈͯ͠
ϦϑΝΫλϦϯά͞ΕͨςʔϒϧʹॻࠐΛ͢Δɻ • ߋ৽ɾࢀরΛAPIܦ༝ʹ͢ΔࣄͰطଘͷ։ൃΛਐΊͭͭ ϦϑΝΫλϦϯάͨ͠DBʹࢀরΛΓସ͍͚͍͑ͯͯΔɻ • ϩʔΧϧͷڥߏங͕͍͠ͷͱɺDMS͕ࢭ·ͬͨ࣌ʹ ࢀরAPI͕ίέΔͷͰߟྀ͕͍͠ɻ 25
3. MySQL͔ΒPostgreSQLΛ ҠߦઌʹબΜͩཧ༝ 26
ͦΓΌɺ(JPUGཧࣄ͕ೋਓډΔΜ͔Β) ͦ͏Ζɻ 27
ͱ͍͏ͷຊԻɺͰͳ͍Ͱ͕͢ɻ 28
PostgreSQLͷํ͕MySQLΑΓ༏Ε͍ͯΔ(ͱࢥͬͨ)2 29
1ɿ PostgreSQLτϦΨʔͷಛ (Ұ෦) ------------------------------------------------------------ CREATE TRIGGER 'τϦΨʔ໊' trigger_time trigger_event ON
'ςʔϒϧ໊' FOR EACH ROW '࣮ߦؔ' ------------------------------------------------------------ MySQL PostgreSQL trigger_time BEFORE, AFTER ͷͲͪΒ͔ BEFORE, AFTER ͷͲͪΒ͔ trigger_event INSERT, UPDATE, DELETE ͔ΒҰͭͷΈબ INSERT, UPDATE, DELETE ͔Βෳબ ෳτϦΨʔ ֤Πϕϯτຖʹ1ͭͣͭ (※ v5.6·Ͱ) ෳࢦఆՄೳ ෳτϦΨʔࢦఆ࣌ͷॱং ίϚϯυͰࢦఆ ໊લॱ 30
1ɿ PostgreSQLτϦΨʔʹ͍ͭͯ • PostgreSQL͚ͩͷػೳ • UPDATE࣌ʹSETʹࢦఆΧϥϜ͕͋Δ߹ͷτϦΨʔΛఆٛग़དྷΔɻ • UPDATE࣌ʹࢦఆΧϥϜ͕࣮ࡍʹมߋ͞Εͨ߹ͷτϦΨʔΛఆٛग़དྷ Δɻ •
ߦϨϕϧ͚ͩͰແͯ͘จϨϕϧͰτϦΨʔΛఆٛग़དྷΔɻ ※ ྫɿ DELETEͰ10ߦফ͑ͨͱͯ͠ɺߦϨϕϧ10֤݅ߦʹର࣮ͯ͠ߦ ͞ΕΔɻจϨϕϧDELETEจʹର࣮ͯ͠ߦ͞ΕΔɻಛʹ TRUNCATEจ ʹରͯ͠༗ޮɻ 31
2ɿ PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) τϦΨʔͷ࣮ߦؔΛҎԼͷ֤ݴޠͰఆ͕ٛग़དྷΔɻ ໊শ ݴޠ ํ๏ PL/pgSQL SQL جຊ PL/Perl
Perl جຊ PL/Python Python جຊ PL/Java Java ֦ு PL/v8 JavaScript ֦ு ※ ͦͷଞ 32
PostgreSQLͷڧΈ(खଓ͖ܕݴޠ) • ※ୠ͠ɺAmazon RDS PL/Python Λαϙʔτͯ͠ͳ͍ɻɻ • ΦϛΧϨͰ PL/v8Λར༻͍ͯ͠Δɻ
• ࠾ཧ༝ɿ ܦݧͷ͋Δݴޠͷ͔ؔΒpgSQLͱv8͙Β͍͔͠બࢶ͕ແ͔ͬͨɻ ϕϯνϚʔΫͱͯ͠ pgSQLΑΓv8ͷํ͕ഒ͍ɺͱͷࣄͰpl/v8Λ࠾༻ɻ (PL/PythonΛ͍͔ͨͬͨͳɾɾ) • ※ΦϛΧϨͰϐϡΞJavaScriptΛ͍ͬͯΔ͕ɺ CoffeeScriptReact.js͑ΔΒ͍͠ɻ 33
(ࢀߟ) PL/v8 ͷ༗ޮԽํ๏ RDS for PostgreSQLʹσϑΥϧτͰ plv8͕Πϯετʔϧ͞Ε͍ͯΔͷͰɺextensionΛ༗ޮԽͯ͠Εok. ------------------------------------------------ # Extension͕ରԠͯ͠Δ͔νΣοΫ
postgres=> show rds.extensions; postgres=> create extension plv8; CREATE EXTENSION ------------------------------------------------ 34
3. MySQL͔ΒPostgreSQLΛҠߦઌʹબΜͩཧ༝ ·ͱΊ • PostgreSQLͰτϦΨʔΛॊೈʹఆٛ͢Δࣄ͕ग़དྷΔɻ • ·ͨPostgreSQLͰτϦΨʔʹࢦఆ͢ΔϢʔβʔఆٛؔͷ ༻ݴޠͱͯ͠ෳͷݴޠΛαϙʔτ͍ͯ͠Δɻ • ݱࡏɺΦϛΧϨͰ࠾༻͍ͯ͠Δͷ
JavaScript. 35
4. AWS Database Migration Service ͱ 36
AWS Database Migration Service ωοτϫʔΫӽ͠ʹ σʔλҠߦΛߦ͏ࣄ͕ग़དྷΔαʔϏε ಄จࣈΛऔͬͯɺDMSͱݺΕΔɻ ※ ੍ݶ͕͋ͬͯɺίϐʔݩɾίϐʔઌͷ ͲͪΒ͔͕AWSͷΤϯυϙΠϯτͰແ
͍ͱɺϨϓϦέʔγϣϯΛ͢Δࣄ͕ग़དྷ ͳ͍ɻ 37
AWS Database Migration Serviceͷ͝հ • AWS DMS ͰΘΕΔΩʔϫʔυ • ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ
• λεΫͷৼΔ͍ʹ͍ͭͯ • λεΫͷઃఆํ๏ʹ͍ͭͯ • ҟछDBؒҠߦͷࡍͷΧϥϜͷܕมʹ͍ͭͯ 38
AWS DMS ͰΘΕΔΩʔϫʔυ • ιʔεΤϯυϙΠϯτ • σʔλͷίϐʔݩɻEC2onDB, RDS, ΦϯϓϨDB, S3
ͳͲɻ • λʔήοτΤϯυϙΠϯτ • σʔλͷίϐʔઌɻEC2onDB, RDS, ΦϯϓϨDB, S3, DynamoDB ͳͲɻ • ϨϓϦέʔγϣϯΠϯελϯε • ίϐʔݩ͔ΒίϐʔઌσʔλͷϨϓϦέʔγϣϯΛߦ͏Πϯελϯεɻ • λεΫ • ͲͷςʔϒϧΛͲͷΑ͏ʹҠߦ͢Δ͔ΛఆΊͨϧʔϧɻ 39
40
ϨϓϦέʔγϣϯΠϯελϯεʹ͍ͭͯ • ΠϯελϯεΫϥε T2, C4, R4ͷ̏छྨΛαϙʔτ. • T2: ։ൃɾݕূ༻ •
C4: େྔͷԋࢉΛߦ͏߹ʹཱͭɻ (AWSతʹ ҟछDBҠߦ͜ΕΛ͢͢Ί͍ͯΔ) • R4: ϝϞϦ૿ՃΠϯελϯεɻ (ҰճͷτϥϯβΫγϣϯ͕େ͖͍࣌͜Ε.) • ϚϧνAZʹରԠ͍ͯͯ͠ɺϑΣΠϧΦʔόʔΛαϙʔτ. • ࣮ࡍɺDMSͱ͓͕͔͔ͯۚ͠ΔͷΠϯελϯεར༻ྉͱετϨʔδ͚ͩɻ 41
λεΫͷৼΔ͍ͷछྨʹ͍ͭͯ λεΫͷৼΔ͍ओʹ3λΠϓ͋Δɻ • શϩʔυ+ܧଓతͳϨϓϦέʔγϣϯ(CDC). • ΦϛΧϨͰར༻͍ͯ͠ΔλΠϓɻ • طଘͷσʔλΛϑϧϩʔυͨ͠ޙ(PostgreSQLͩͱCOPYจͰߦ͏.) ͦͷޙτϥϯβΫγϣϯϩά͔ΒܧଓతʹϨϓϦέʔγϣϯΛߦ͏. ֤DBΤϯδϯຖʹઐ༻ͷػೳΛ͏ɻ(PostgreSQLͰtest_decodingϓϥάΠϯͰ)
• ܧଓతͳϨϓϦέʔγϣϯ(CDC)ͷΈ • શϩʔυͷΈ 42
λεΫͷઃఆํ๏ʹ͍ͭͯ • ϨϓϦέʔγϣϯΛߦ͏ςʔϒϧͷࢦఆํ๏̎छྨ • userɿ จࣈྻҰகͰ user ςʔϒϧͷΈΛରͱ͢Δɻ • user_%ɿ
ਖ਼نදݱͰ user_xxx ςʔϒϧʹ߹க͢Δશͯͷ ςʔϒϧΛରͱ͢Δɻ • ਖ਼نදݱͳͲͰෳࢦఆͨ͠߹λεΫͰฒྻͰςʔϒϧ͕ ϩʔυ͞ΕΔɻ (σϑΥϧτͰ8ςʔϒϧ) 43
λεΫͷઃఆํ๏ʹ͍ͭͯ • ·ͨɺ֤ςʔϒϧʹରͯ͠ҠߦϧʔϧΛઃఆ͢Δࣄ͕ग़དྷ Δɻ • ྫ͑Ҡߦޙͷςʔϒϧ໊/ΧϥϜ໊Λมߋͨ͠Γ ରͷσʔλΛWHERE۟ͷΑ͏ʹϧʔϧͰߜΓࠐΜͩΓ ग़དྷΔɻ 44
ΦϛΧϨͷλεΫӡ༻ํ άϧʔϓ୯ҐͰখ͘͞ϨϓϦέʔγϣϯλεΫΛઃఆͯ͠ ҠߦΛਐΊ͍ͯΔɻ ྫɿ ϢʔβʔҠߦλεΫ, ύʔςΟҠߦλεΫ, ༧ҠߦλεΫ, ... • ཧ༝
Ҡߦྃͨ͠ςʔϒϧΑΓDMSͷλεΫΛআ͍ͯ͘͠ࣄΛ ఆ͍ͯ͠ΔͨΊɻ ӡ༻Λͯ͠ؾ͍͕ͨɺখ͘͞λεΫΛׂ͓ͯ͘͠ࣄͰҰݸͷςʔϒϧҠ ߦ͕ ࣦഊͨ࣌͠ʹαʔϏεશମͷোʹͳΒͳ͍ɻ 45
ҟछDBҠߦͷࡍͷΧϥϜͷܕมʹ͍ͭͯ • ιʔεͷܕ → DMSઐ༻ͷܕʹΩϟετ → λʔήοτͷܕʹΩϟετ ͱม͢Δɻ DMSͷܕ ༰
STRING จࣈྻ DATE DATETIME λΠϜελϯϓ INT1 1όΠτɺූ߸͖ (INT2, INT4, INT8͕͋Δ) BOOLEAN ϒʔϧ BLOB όΠφϦϥʔδΦϒδΣΫτ ※ ͦͷଞ 46
ͦͷଞDMSͷओͳ׆༻ࣄྫ • ΦϯϓϨͷDB͔ΒAWSͷRDSσʔλΛҠߦ͢Δɻ • ͔ͷߴڮগɾɾҎલਂϑϧόοΫΞοϓΛऔͬͯ AWSʹసૹͯ͠෮ݩ͢Δ࡞ۀΛ͍ͯͨ͠ɻɻ • Lambda+RDSಉ࣌ଓͷ͔Βਪ͞Ε͍ͯͳ͍ͷͰɺ RDS →
DynamoDB ʹܧଓతʹϨϓϦέʔγϣϯΛͯ͠ Lambda͕ଓ͢ΔDynamoDBΛ࡞Δɻ 47
4. AWS DMSʹ͍ͭͯ ·ͱΊ • DMSωοτϫʔΫӽ͠ʹϨϓϦέʔγϣϯΛ࣮ݱ͢ΔαʔϏε. • σʔλͷίϐʔݩͱઌΛࢦఆͯ͠ҠߦϧʔϧͱͳΔλεΫΛ࡞͢ΔࣄͰ σʔλͷҠߦશͯDMSͷͰ࣮ݱͯ͘͠ΕΔɻ •
λεΫͷཻΛଟͨ͘͠Γখͨ͘͞͠Γ͢ΔࣄͰ શମͷϨϓϦέʔγϣϯͷཻΛௐग़དྷΔɻ • DMS୯ମͱͯ͠ϨϓϦέʔγϣϯΠϯελϯεͷӡ༻අ͕͔͔ΔఔͰ ҆ՁͰਐΊΔࣄ͕ग़དྷΔɻ 48
5. ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔ 49
ҠߦࣦഊͷࢹΛͲ͏͍ͯ͠Δ͔ ࠓ·Ͱ͓͖ͯͨ͠௨ΓɺDMSඇৗʹศརͳαʔϏεͰ ΦϛΧϨͷαʔϏεΛࢧ͑Δ্ͰඇৗʹॏཁͰ͋Δɻ ͕ɺτϦΨʔσʔλҠߦλεΫ͕ίέΔͱͪʹ γεςϜোʹͳΔσϝϦοτ͋Δɻ => ͳΔૣ ͰDMS͕ࣦഊ͍ͯ͠Δࣄʹؾͮ͘Έ͕ඞཁ. 50
ҠߦࣦഊͷࢹͷΈ MackerelͷνΣοΫϓϥάΠϯΛͬͯ RDSͷϩάࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜΛఆظతʹୟ͍ͯ ࢹ͍ͯ͠Δɻ Mackerel ... RDSͷϩάࢹΛ࣮ࢪ͢ΔPHPͷϓϩάϥϜ ... 51
Mackerel ͱ αʔόʔཧΛߦ͏αʔϏεɻ Ϧιʔεͷঢ়گΛάϥϑԽͯ͠ՄࢹԽ͞ΕͨΓɺ ·ͨোൃੜ࣌ͳͲʹଟ༷ͳπʔϧΞϥʔτΛ௨ग़དྷΔɻ 52
νΣοΫࢹ߲ ------------------------------------------------ [plugin.checks.rds_log] command = "php /path/to/rds_log.php" check_interval = 5
memo = "RDS Τϥʔϩάࢹ" ------------------------------------------------ • mackerelͷઃఆϑΝΠϧʹ্هΛهड़͢Δͱ 5͓͖ʹ ࢦఆͨ͠ίϚϯυΛ࣮ߦͯ͘͠ΕΔ. 53
PHPͷதʹ͍ͭͯ AWS SDK for PHP Ͱ downloadDBLogFilePortionؔΛ࣮ߦ. ʢDBͷϩάΛ ࢦఆҐஔ͔Βμϯϩʔυ͢Δɻʣ •
:ERROR: ͳͲͷΩʔϫʔυΛरͬͯɺ Ωʔϫʔυ͕͋Ε ͦͷจࣈྻΛechoͯ͠exit(1) Ͱऴྃ͢Δ. • MackerelͷcheckϓϥάΠϯ exit(0) : ਖ਼ৗ exit(1) : ҟৗ(WARNING) exit(2) : ۓٸ(CRITICAL) • MackerelͷઃఆͰWARNINGΞϥʔτ্͕͕ͬͨ࣌ͷ௨ઌΛઃఆ͢Δɻ 54
ಋೖޙͷঢ়گ • ൃݟ͕ඇৗʹૣ͍ͷͰোલʹਝʹରԠ͕ग़དྷΔɻ Τϥʔͷ༁ • ύʔςΟͷ։࠵ͱऴ͕ྃٯసͯ͠Δɻ • ҠߦޙͰൣғܕΛ͍ͬͯΔҝམͪΔɻ • ຊདྷɺඞਢͰ͋Δͣͷ߲͕nullͰͬͯ͘Δɻ
• ֎෦ࢀর੍ͰམͪΔɻ 55
࠷େͷϝϦοτ • WebαʔϏεଆͷطଘόά(͜ΜͳσʔλೖΒͳ͍)ʹ ؾ͘ࣄ͕ग़དྷΔɻ ʢ..ඞਢ߲ͳΜͰ NOT NULL͡Όͳ͍ͷʁͬͯɾɾʣ • τϦΨʔͰ ϩάʹ
:ERROR: ͬͯจࣈΛؚΊΔࣄͰ௨ΛϋοΫग़དྷΔɻ ʮ͜ͷݱআϑϥά͕1͔Β0ʹΒͳ͍ͱى͜Γ͑ͳ͍ʯ ͬͯʹରͯ͠ UPDATEͷτϦΨʔͰআϑϥά͕ͬͯͨΒ :ERROR:ͱϩάΛు͘ॲཧΛࠐΉࣄͰࣄ͕ൃੜ͍ͯ͠Δࣄʹؾ͚Δɻ ʢ࣮ࡍͬͯͨɻɻɻʣ 56
࣮ࡍʹಈ͔ͯ͠Έͯൃੜͨ͠ • ੑผσʔλ int͡Όͳ͍ͷʁ. • Zero Date • with timezone
• etc... 57
Zero Date MySQLͰ 0000-00-00 Λ DatetimeܕͷΧϥϜʹొ͢Δࣄ͕ग़དྷΔɻ PostgreSQLͰ 0000-00-00 Λ ʹΩϟετ͢Δࣄવग़དྷͳ͍ɻ
• DMSͰϨϓϦέʔγϣϯ͠Α͏ͱͨ࣌͠ͰίέΔɻ • hoge_date NOT NULL DEFAULT '0000-00-00' ͷڪා... 58
Zero Dateͷରॲ • ·ͣɺจࣈྻͰड͚ͱΔɻ ALTER TABLE hoge ALTER COLUMN hoge_date
TYPE VARCHAR(35); - BEFORE τϦΨʔͰ จࣈྻҰகͰஔ͢Δɻ if (NEW.hoge_date === '0000-00-00 00:00:00') { NEW.hoge_date = '0001-01-01 00:00:00'; } 59
with timezone MySQLͷJSTͰདྷΔ(͕ɺTimezoneͷใͳ͍)ɻ PostgreSQLͰͦͷ··Insert͢Δɻ(UTCͱͯ͠ѻΘΕΔ) ↓ ʮύʔςΟͷ։࠵͕ਂͷ1͔࣌Β2࣌ͬͯͳͬͯ·͢Αʁʯ JSTΛUTCʹมͨ͠ঢ়ଶͰೖΕΔɻ 60
with timezone ͪͳΈʹ RDSͩͱ SELECT NOW(); ͕ UTCʹͳΔɻ ίʔυͷόάͰ NOW()
ͰσʔλΛೖΕͯΔ࣌ɾɾ Կͱ18࣌ؒͣΕΔɻɻ 61
5. ·ͱΊ • MackerelͷνΣοΫϓϥάΠϯΛར༻͍ͯ͠Δɻ • νΣοΫϓϥάΠϯͰ͖ͳίϚϯυΛୟ͘ࣄ͕ग़དྷΔɻ • DBϩάͷࢹΤϥʔͷࢹͱϦϑΝΫλϦϯάͷ྆ํʹޮ ͘ɻ •
ࢥͬͯΔΑΓఆ֎ͷσʔλೖΔɻ 62
6. ·ͱΊ 63
ࠓճͷDMSϦϑΝΫλϦϯάͷ ࠷େͷϝϦοτ ຊདྷലେͳֻ͕͔Δ(͘͠ಡΊͳ͍)ͣͷ DBϦϑΝΫλϦϯάͷॲཧΛDMSλεΫ(Ҡߦ୯Ґ)Λ খͨ͘͞͠ࣄͰগͮͭ͠खΛೖΕΔࣄ͕ग़དྷΔɻ ͦͷ݁ՌɺӨڹൣғಡΈ͘͢վળΛਐΊΔࣄ͕ग़དྷͨɻ 64
ݱࡏ • ·ͩ·ͩӡ༻ͱͯ͠3ϲ݄ͰΓ࢝Ί͔ͨΓɻ ࠓͷॴɺக໋ইແ͍ɻ(ই͕ແ͍ͱݴ͍ͬͯͳ͍) • ͜Ε͔Β͍ͬͯ͘தͰ৭ΜͳࠈΛݟ͍ͯ͘ͱࢥ͏ɻ Ξτϓοτ͍͖͍ͯͨ͠ͷͰָ͓͠Έʹʂʂ 65
ࠂ 66
Πϕϯτࠂ • ୈ25ճ தࠃํDBษڧձ in ௗऔ • 2018-12-01() 13:00ʙ PostgreSQL
11ੌ͍ͧʂ MySQL 8.0ੌ͍ͧʂ → ʮͲ͏ͬͯόʔδϣϯΞοϓ͢Δͷʁʯ ख๏Λ͓ग़དྷΔߨࢣਞͷํΛ͓ট͖ͯ͠͝հ͠·͢ʂ 67
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝· ͨ͠ʂʂ 68