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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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.7k
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
240
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
960
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
検索技術知識0のエンジニアが広告検索システムを内製化して運用するまで
lycorptech_jp
PRO
0
210
脱Jenkins、インターン生が挑んだCIツールGitHubActions移行
mixi_engineers
PRO
1
330
変化の早いClaude Codeを 書籍に落とし込む
oikon48
6
1.2k
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
150
タクシーアプリ『GO』の実践的データ活用〜位置情報データの収集とStreamlitでの可視化〜
mot_techtalk
2
200
Service Connect 上のサービスに ECS Service の外側から到達できなかった話
ota1022
1
110
AI時代の強いチームの作り方
yuukiyo
23
15k
侵入は突然に 〜 IoTマルウェアと悪用される家庭の機器 ~ / When Intrusion Strikes: IoT Malware and the Abuse of Home Devices
nttcom
0
1.4k
Master Dataグループ紹介資料
sansan33
PRO
1
4.8k
メルカリのグローバルアプリで挑んだ AlloyDB 運用と課題解決の実践記
hatappi
0
140
新しい SLO が良い感じにハマっている話
z63d
4
2.1k
データ組織の転換期 一足飛びしない段階的戦略
leveragestech
PRO
0
150
Featured
See All Featured
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
2.1k
Skip the Path - Find Your Career Trail
mkilby
1
180
Evolving SEO for Evolving Search Engines
ryanjones
0
250
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
A Tale of Four Properties
chriscoyier
163
24k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
460
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
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 ԿଔͬͯΈ͍ͯͩ͘͞ʂ