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
Plain db import with Go
Search
Seiji Takahashi
December 12, 2016
Technology
6.6k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Plain db import with Go
golang.tokyo#2での発表資料です。
Seiji Takahashi
December 12, 2016
More Decks by Seiji Takahashi
See All by Seiji Takahashi
AIエージェントのデータガバナンスの最新事情。そしてプロダクトのAIファースト化
timakin
0
3.8k
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
250
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
1k
Go Backends for frontends with GraphQL and gRPC
timakin
6
4.3k
Design Pattern for Image and Text Composition in Go
timakin
5
6.9k
Golang API Testing the HARD way
timakin
13
7.3k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Performance Optimization on Google AppEngine
timakin
5
6.7k
Other Decks in Technology
See All in Technology
IoTハンズオンの舞台裏
shirouz
2
130
DMMブックスのNext.js化を加速させるAI活用 / Migrating DMM Books to Next.js with AI
kentarom
1
330
データエンジニアリングワークショップ:Auto LoaderとSparkで学ぶデータパイプライン構築
databricksjapan
PRO
0
150
PM領域でのAI Agentの活用
lycorptech_jp
PRO
0
270
AndroidでHDRメディアを「壊さずに」扱う
chigichan24
0
400
深夜のクラウド懺悔室 1:29:300 or 1:0:0
kazzpapa3
0
170
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
150
20260903 Tokyo Jazug Night #62 | Azure エンジニアよ、 その環境は本当にセキュアか?
olivia_0707
1
620
Benchmarking Vector Databases: pgvector vs. LanceDB
tsho
0
140
少人数データチームのDevin活用実践事例
runandy16
2
440
生成AI時代の クレデンシャルとパーミッション設計
nrinetcom
PRO
3
1.5k
スクラムで身についていた動き方を、XPで捉え直してみた
codmoninc
PRO
1
200
Featured
See All Featured
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
sira's awesome portfolio website redesign presentation
elsirapls
0
400
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
WENDY [Excerpt]
tessaabrams
12
39k
Designing for Performance
lara
611
70k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
2
3.8k
A Soul's Torment
seathinner
7
3.5k
How STYLIGHT went responsive
nonsquared
100
6.3k
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Transcript
golang.tokyo #2 @__timakin__ Plain db import with Go
ࣗݾհ • timakinͱ͍͍·͢ɻ • twitter: @__timakin__ github: timakin • ࠷ۙboot.fmͱ͍͏
ϙουΩϟετΛ࢝Ί·ͨ͠ɻ
timakin/gopli https://github.com/timakin/gopli
timakin/gopli • Plain DB import tool with toml configuration. •
Without complex replication settings. $ gopli sync -f production -t local -c config/repli.toml
ͳͥ࡞͔ͬͨ • http://techlife.cookpad.com/entry/2014/10/03/110806
ͳͥ࡞͔ͬͨ • ຊ൪ͷσʔλΛ؆୯ʹϩʔΧϧʹ͖࣋ͬͯͨ͘ ͳΓ·͢ΑͶʁʢεςʔδϯάʹϨϓϦͯ͘͠ Δͷɺผ్͋Δͱͯ͠ʣ • Կʮname: testʯͳϢʔβʔɺʮcontent: aaaaaaaaaaaaaaaaʯͳߘ༰࡞͔ͬͨʁ •
seedσʔλ࡞Δͷਏ͘ͳ͍Ͱ͔͢ʁ
طଘͷํ๏ • ͔͍͋ͬͨshell • mysqlpump • maxbube/mydumper • mysqldump͕γϯάϧεϨουͳͷʹରͯ͠ɺ ্ه̎ͭϚϧνεϨου
• উखʹઃఆܾΊͱ͍ͯҙͷλΠϛϯάʹ ίϚϯυΛࢥ͍ग़ͣ͞ʹར༻ग़དྷΔͷ͕ͳ͍…
ࡶͳσʔλίϐʔͷϝϦοτ • ࡶͳೖྗσʔλͰͷςετ࠷దͳݟͨɺUXͷअຐΛ͠·͢Ͷʁ • ݟͨɿϨΠΞτͷͨΊʹtruncate͢Δจࣈྔௐɺ͕ͬͭΓͣ ΕΔը૾αΠζ • ։ൃ໘ɿόάͬͨ࣌ʹຊ൪ΛߥΒͣ͞ϩʔΧϧͰ࠶ݱͰ͖Δ֬Λ ্͛ΒΕΔɺϩʔΧϧ։ൃ࣌ͱຊ൪orεςʔδϯάͰվળʢਏ ͍ΫΤϦൃݟʣΛΪϟοϓͳ͘ߦ͑Δɻ
• ࣌ؒɿʢʮϒϥϯνAΛςετ͍ͨ͠ͷͰϒϥϯνBͷεςʔδϯά ͷσϓϩΠ15࣌͘Β͍͔Β͓ئ͍͠·͢ʯ͕ͳ͍ʣ
σʔλͷͱ͖ͬͯํ • ςʔϒϧҰཡͷऔಘ • goroutineΛར༻ͭͭ͠ɺςʔϒϧ͝ͱʹλϒ۠ΓͷSELECT݁ՌΛ tmpϑΝΠϧͱͯ͠txtʹอଘ • schema_migrations, repli_chkͷςʔϒϧϒϥοΫϦετͱͯ͠আ֎ •
ೖઌͷDBͷςʔϒϧΛҰ୴DELETE͢Δ • LOAD DATA LOCAL INFILEͰσʔλΛϦετΞɻ͜ͷࡍʹ֤ςʔϒϧ ʹಉ࣌ʹσʔλΛೖΕΔͨΊʹgoroutineΛར༻
toml configuration • TOML࠾༻͠·ͨ͠ɻ ڥ͝ͱͷଓઃఆɻ [database] [database.local] host = "localhost"
management_system = "mysql" name = "app_development" user = "root" password = "" [database.staging] host = "xxx.xxx.xxx.xxx" management_system = "mysql" name = "app_staging" user = "root" password = "" [database.production] host = "yyy.yyy.yyy.yyy" management_system = "mysql" name = "app_production" user = "root" password = ""
tomlͷϝϦοτ • ίϝϯτ͕͚ΒΕΔ • Array͕දݱ͍͢͠ • Tableͱ͍͏୯Ґ(gopliͩͱdatabase, sshͱ͍͏୯ҐΛ༻͍· ͨ͠)Ͱkey-valueΛάϧʔϓԽͰ͖Δɻ͜ΕʹΑͬͯෳڥ ͷଓઃఆ͕֊ߏͰॻ͚ΔΑ͏ʹͳΓ·͢
• BurntSushi/tomlͰtomlΛparse͢ΔɻValidator͜ͷϥΠϒϥ Ϧ͕ఏڙͯ͘͠ΕΔɻ
ઃఆϑΝΠϧΛಡΈࠐΉ • ssh༻ͷ伴ͷઃఆͳͲΛॻ͘ͱ͖ɺઈର”~/”ͱॻ͖·͕͢ɺ ৺ͩͬͨͷͰfilepathʹਖ਼֬ͳύεΛಡ·͍ͤͨɻ • os/userͷuser.Current()ͱɺͦͷuserͷHomeDir͕औΕΔ ͷͰɺ”~/”Λstrings.ReplaceΛͬͯஔ͖͑Δɻ • ʮ͜ΕΈΜͳͷGoݴޠͰͬͨ͜ͱͩʂʯ ͜ΕͰೋͱstrings.Replacerʹٽ͔͞Εͳ͍ͰࡁΉͧɻ
mysqlͷଓ • go-mysql-driver/mysqlܦ༝ͰͷϦϞʔτͷଓconstͰܾΊΒΕͯΔ maxPacketSizeΛ͑Δͱଈࢮ͠·ͨ͠ͷͰ͑ͣɻ • mysql -h ͰͷଓࢼΈ·͕ࣦͨ͠ഊɻgo-mysql-driver/mysqlΈͨ͘ Keep-Aliveͯ͘͠Εͳ͍ͷ͔ɺଈࢮ͠·ͨ͠ɻ •
Ͳ͏ΒϩʔΧϧͷmysqlΫϥΠΞϯτʹଓॲཧΛͤͯgoroutineΛ ͓͏ͱͯ͠ɺίωΫγϣϯ͕૿͑ΔͷͰࢮɻɹ • sshͰଓͨ͠ޙɺsession.RunͰʹΫΤϦΛ࣮ߦ͢ΔखஈΛऔΕɺί ωΫγϣϯΛ̍ͭுΓͭͭηογϣϯΛ૿ͤΔ & ఆͷ੍Λ֎ͤΔͷ Ͱɺฒྻ࣮ߦͰ͖Δ༷ࢠɻʢਏ͍ʣ
্࣮ͷ • golangύεϑϨʔζ͖ͷൿີ伴ΛparseͰ͖ͳ͍ͷͰɺopensslͰͷ ෮߸ͨ͠ΩʔΛར༻͠ͳͯ͘ͳΒͳ͍ɻ • σʔλྔ͕ଟ͍ͱϨεϙϯεͰࢮ͵ͷͰηϚϑΥͰಉ࣌ʹ3~5ݸఔͷ ςʔϒϧʹฒྻʹϦΫΤετΛ͛Δɻ • ϨεϙϯεͷύέοτྔΛ͍͍ײ͡ʹ੍ݶͰ͖ΔϥΠϒϥϦ͕͋ͬͨΒڭ ͍͑ͯͩ͘͞…
• mysqldumpͩͱsqlͷσʔλྔ͕૿͑ͯ͠·͍ͦ͏ͩͬͨͷͱɺ ൿಗͷͨΊʹޙ͔ΒσʔλΛॻ͖͍͑ͨ࣌ͱ͔ʹศརͦ͏ͩͬͨͷͰɺ ςʔϒϧ͝ͱʹSELECTͨ݁͠ՌΛtxtʹॻ͖ग़͢खஈΛͱΓ·ͨ͠ɻ
goroutineΛ͏໘ sem := make(chan int, MaxFetchSession) var wg sync.WaitGroup for
_, table := range tables { wg.Add(1) go func(table string) { sem <- 1 defer wg.Done() defer func() { <-sem }() session, err := conn.NewSession() if err != nil { panic("Failed to create session: " + err.Error()) } defer session.Close() var fetchTableStdoutBuf bytes.Buffer session.Stdout = &fetchTableStdoutBuf fetchRowsCmd := fmt.Sprintf(SelectTablesCmd, srcDBConf.User, srcDBConf.Password, srcDBConf.Name, table) err = session.Run(fetchRowsCmd) MySQL1ΫΤϦΛΑ͠ͳʹϚ ϧνίΞͰͬͯ͘ΕΔΈ ͕ͳ͍ͷͰɺμϯϓ/ϦετΞΛ goroutineͰฒྻԽ͢Δ͜ͱͰɺ γϡοͱσʔλΛऔͬͯ͜Ε· ͢ɻ
ࠓޙͷ՝ • sshͷηογϣϯͷඪ४ग़ྗΛͦͷ··͖࣋ͬͯͯɺϩʔΧϧͰtxtʹىͯ͜͠Δͷ ͰɺҰϦϞʔτͰॻ͖ग़ͨ͠txtΛgzipѹॖͯͦ͠ΕΛऔͬͯ͘Δɺͱ͔͕Ͱ͖ͳ ͯ͘ࠔͬͯΔɻ • sshͷϨεϙϯε͕Ͱ͔͗͢Δͱͨ·ʹଓ͕ΕΔͷͰϦτϥΠ/సૹྔ੍ޚ͕ඞ ཁ • γʔΫϨοτΧϥϜͷӅṭ
• mysqlҎ֎ͷରԠ • ύεϑϨʔζ͖ͷ伴Ͱ͑ΔΑ͏ʹ… • IDʹҙͷoffsetΛઃఆͰ͖ΔΑ͏ʹ͢Δ
timakin/gopli https://github.com/timakin/gopli ԿଔͬͯΈ͍ͯͩ͘͞ʂ