るいすのブログ

オタクエンジニアの雑記

MySQLのデータベースをインポートする際に存在するテーブルのレコードを削除せずにALTER文を作成、実行するスクリプトを作った


先月末に数学のテストを終えました。 C単位は降ってきてほしいと切に願います。 あと、中間発表を控えてます。

 

背景

ステージング環境のDBをプロダクション環境のDBへインポートする際に レコードを消すわけには行かず ・プロダクションにないテーブルは作成 ・すでに存在するテーブルはステージングとプロダクションの差異のALTER文を作成して実行 ということを実現したいと思っていたところ

・Workbench ・Schemea Sync ・手動 のどれかが解決方法らしい。

Workbenchを使うとうまく行かず、Schema Syncは導入が面倒、手動も面倒ということで シェルスクリプトで作ってみた。

 

schemaSync - シェルスクリプト

https://gist.github.com/rluisr/ace0513d0251d6ceb2a093cf23b6dafb

できること ・宛先DBにないテーブルを作成 ・宛先DBに既にあるテーブルはソース元と差異を取得してALTER文を作成、実行 ・AUTO_INCREMENTの値は不変

できないこと ・SSL ・テーブルオプション(文字コード等)の変更はされない

必要なコマンド ・mysql ・mysqldump ・mysqldiff

 

前準備


ソースのテーブル構造

 


宛先のテーブル構図 modifyがありません。

 


宛先テーブルにはレコードを追加しておきます。

 


ソースには追加でテーブルを1つ作り、計2つ

 


宛先DBのテーブルはそのまま1つ

 

実行する

./schemaSync.sh --src-host "localhost" --src-user "root" --src-pass "" --src-db "source" --dst-host "localhost" --dst-user "root" --dst-pass "" --dst-db "destination"


最後にALTER文1つずつに確認画面がでるので 確認しながら実行できまできます。

 


宛先DBにソースのテーブルが作成される。

 


どちらにも存在したusersテーブルはレコードが削除されることなく ソースで追加したmodifyカラムが追加されました。

割りと実現したいことはできたかも。 他のエラー文を残したまま、WARNING文(パスワードをコマンドに書くな)無視はいつかやろうと思う。

本番環境で使ってみようと思います。 あ、これを使って生じた如何なる問題も僕は責任を持ちません。