Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Plain db import with Go
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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による実践
timakin
4
3.5k
AIエージェントのデータガバナンスの最新事情。そしてプロダクトのAIファースト化
timakin
0
3.9k
営業、広報、開発。 多面的なAIネイティブ化のための 基盤について
timakin
0
290
権限と承認 〜ユーザー信頼性に繋がる管理画面の根幹について〜
timakin
0
1.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.4k
Head First Golang Image Package
timakin
2
10k
React Native Beyond Prototype
timakin
2
1.7k
Other Decks in Technology
See All in Technology
エンタメ企業のM&Aを支えるデータ基盤 ― 統合から店舗のリアルタイム分析まで / Data Engineering Summit 2026
genda
0
170
DWH の限界突破! AI エージェント向け爆速リアルタイムデータ基盤 ClickHouse
jozono
1
470
ストレスなくAIと付き合いたい!こんなときどうしてる?
namiki64
3
490
Persisting Massive Data with Rails ~Designing for 60 billion rows, and fighting the bottlenecks~ Railsで挑む大量データ永続化 〜600億件を永続化するための設計とボトルネックとの戦い〜
occhi
0
730
フロントエンドカンファレンス関西2026 - 速すぎるUIに、待ち時間を
teamlab
PRO
0
130
事業成長とデータ活用を止めないためのマネジメントへ挑戦
hiracky16
0
390
Claude の新機能を、 出た日に触って社内に届けるまで
rfdnxbro
1
170
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
120
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
570
Temporal 最高!でも改めて「日付」について調べたら人類の負債すぎる件
riyaamemiya
0
140
USB PDを使ってスマホを労わりたい
raspython3
0
180
『SAR衛星データ解析入門』のご紹介とその応用
syuchimu
0
120
Featured
See All Featured
Music & Morning Musume
bryan
48
7.4k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
520
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.4k
Navigating Weather and Climate Data
rabernat
0
560
Side Projects
sachag
456
43k
Building Applications with DynamoDB
mza
96
7.2k
The browser strikes back
jonoalderson
0
1.8k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
HDC tutorial
michielstock
2
960
30 Presentation Tips
portentint
PRO
1
430
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
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 ԿଔͬͯΈ͍ͯͩ͘͞ʂ