256bitの殺人メニュー

インフラエンジニアだったソリューションアーキテクトなくわののブログ。こちらのBlogは個人の意見となっていて会社とは全く関係ありません。お約束です。[twitter:@kuwa_tw]めんどくさがりが重い腰を上げて何かをアウトプットすることにどれほどの意味があるのかを試してみたいブログでもある。

boot2dockerのバージョンアップ時にハマった事やら

はい、どもども乙カレー様でつ。

boot2dockerをバージョンアップしたらちょっとハマった事をいくつかメモ。

もともと。前提。

もともとは1,2ヶ月前位に入れたboot2dockerで、入れ方は当時homebrewで入る物が若干古かったかなんかでGithubからwgetしてれる方法で。

mkdir -p ~/boot2docker
cd ~/boot2docker
wget https://github.com/boot2docker/boot2docker-cli/releases/download/v0.11.1-pre1/boot2docker-v0.11.1-pre1-darwin-amd64 -O boot2docker
chmod +x boot2docker

あんまり覚えてないけどこんな感じだった気がする。
これはこれで使えてはいたけど、久々に見たらhomebrewでの提供が新しくなってたので一回まっさらにして入れなおした。
時の話。

brewでのインストール

brew install docker boot2docker

これだけ、簡単ですね。

ClientとServerのAPIバージョンがあってない問題

kuwanombp% docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.3
Git commit (client): 990021a
2014/06/30 20:14:39 Error response from daemon: client and server don't have same version (client : 1.12, server: 1.11)

と、APIバージョンが違うので動かない事案が(´;ω;`)ブワッ


この場合は、boot2docker側のDockerServerが最新じゃないことが問題なので、以下コマンドで、boot2dockerのimageを最新にしてあげることで解決出来ます。

# boot2docker VM 停止
kuwanombp% boot2docker stop
# boot2docker VM 削除
kuwanombp% boot2docker delete
# 最新のboot2docker VM のiso imageを取得
kuwanombp% boot2docker download
# boot2docker VM 作成
kuwanombp% boot2docker init

DockerのPort変わってる問題

はー、これで動くわ−って思って実行するんですが、、、。

kuwanombp%  docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.3
Git commit (client): 990021a
2014/06/30 20:18:30 Get http://localhost:4243/v1.12/version: EOF

ん、、、?EOF?確かにDockerAPIにつながらねぇって言って実行出来ない。
っていうのはここのISSUEのやりとりであるみたいに他にPortかぶってるからIANAからちゃんと取得しなおしたらしい。


ちゅーわけで、VirtualBox側でNAT設定変更が必要。


VirtualBoxの画面開いて、ゲストポートを4243->2375に変更しましょう。


はい、

kuwanombp%  docker version
Client version: 1.0.1
Client API version: 1.12
Go version (client): go1.3
Git commit (client): 990021a
Server version: 1.0.1
Server API version: 1.12
Go version (server): go1.2.1
Git commit (server): 990021a

これでOK

おまけ:名前解決について

仕事場で作業してて、時間かかる作業は家でやろうと、docker pull centosとかを家でやろうとしても動かない場合に

kuwanombp% docker pull centos
Pulling repository centos
2014/06/30 22:40:33 Get https://index.docker.io/v1/repositories/centos/images: dial tcp: lookup index.docker.io on 172.17.241.37:53: no answer from server

てなる場合はDNSの設定が職場のままで、boot2docker VMのresolv.conf書き換わってないっつー事なので、boot2docker restartでDHCP取り直してくださいねw
当たり前ですけどw恥ずかしいw


ではでは!₍₍ ᕕ(´ ω` )ᕗ⁾⁾



ここではない、どこかへ

ここではない、どこかへ

『Chef実践入門』で、今風なChefの使い方を料理してやるぜ(ベタ

乙カレー様です。

書評ばっかりしてる人みたいになっててやなのでマジブログ更新しよう(嗚咽


今年の年末年始にご縁があって『Chef実践入門』のレビューをさせていただきましたということで、献本頂いた(ありがとうございますm(_ _)m)ので改めて読んでみました。



Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

内容

期せずしてChef活用ガイドという本もでていて、Chefの本が充実してきている昨今なのですが、Chef活用ガイドの方はChefそのものに対する詳しい説明、という感じで、Chefの内部構造やら、どのように動いているか、と言った部分にフォーカスしている様に感じました。こちらの本はChefそのものについて知るのにいい本です。


対してこの本は「今現在のChefの使い方を教える」本だと思います。
Chefの基本的な概念や、構築方法という部分はもちろんですが、VagrantやBerkshelf、Serverspecを使用した今のChefを使った運用はこうやっている、と言う事が考え方からわかる、一線でサービスを運用されているエンジニアの方々が書いただけあって構築から運用まで目を向けた本になっています。


この本で主にとりあげられているのはChef Soloとしての使い方ですが、Chef Serverの活用シーンの章もあり、Chefの現状を知るのに良いと思います。
加えて、Appendixにある、各種チートシートが運用時にリファレンス的に使えて地味に効く、長く使える本になっているなーという印象。

まとめ

Ansibleも流行りはじめ、どっちを選択したらいいんだろうといった所に悩んでいる方もいる昨今では有るかと思いますが、機能の充実、特に周辺アプリケーションはChefは充実しています。その部分の充実はAnsible->Sinatra, Chef->RoRという対比で良く表されますが、大規模な環境になればなるほど恩恵を受けられることになるかと思います。
今のモダン(かつ、常識になりつつある)なChef環境を知る上でこの本を手にとって見てはいかがでしょうか!


ザ・シェフ 1巻

ザ・シェフ 1巻

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

Chef実践入門 ~コードによるインフラ構成の自動化 (WEB+DB PRESS plus)

『開発効率をUPする Git逆引き入門』はGitの情報の洪水に飲まれないための浮き輪みたいなものだね。

「Git管理しているファイルをあとから除外対象に設定したい」はい?どうやります?


Gitって最初とっつきにくいですよねぇえええ。
Git使い始めた時は概念がよくわかんなくて、これなんなの?どういうことなの?って思いながら使ってました。(今も使えてないけど)
その頃は書籍もそんなに無いしWebの情報とDocumentみたり、聞いたりでやってた記憶があります。


開発効率をUPする Git逆引き入門』を献本頂いたので読んだのですが、非常によく出来たGitの書籍だったので紹介させていただこうとこの記事を書いております。



開発効率をUPする Git逆引き入門

開発効率をUPする Git逆引き入門

  • 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2014/04/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る

内容

まず最初に、装丁がカッコイイw


とw
最近Gitの本がいっぱい出ていて、Gitが流行ってるんだなぁ(今更何を)なんて思いましたが、どれみてもほとんどの本が、”Gitについて網羅的に説明している本”だなぁという印象でした。
前述しましたが、元々Gitの概念からわかりやすく紹介した本ってあんまりなくって、すっげーとっつきにくい印象があります。もちろんそういった本もいい本なのですが、最初の最初に読むと、Gitって難しいって思っちゃう人も多いんじゃないかと思います。


そんな中、@さんが社内勉強会で発表されていた、「いつやるの?Git入門」はすごくわかりやすく概念の説明をしていて目からウロコでした。


開発効率をUPする Git逆引き入門』は@さんをはじめ、弊社の開発の中心になっている人たちになって”Gitの機能の逆引き”をテーマに書かれた本です。
1章では基本的なGitの説明を、前述の資料をかかれた@さんが書かれています。Gitの本なのに図解が多い説明は直感的にGitのアーキテクチャを理解できる良い説明でした。


そして、逆引き。
「ブランチをマージしたい」という、基本的な操作から、冒頭にあったような「Git管理しているファイルをあとから除外対象に設定したい」「Git管理していないファイルだけ削除したい」というちょっとアレって思うようなものまでいろんな機能を逆引きして確認することができます。


そりゃ調べたらわかるんだけど、、、これかな、、、これじゃねーな、、、あーこれか、、、違うな、、、(´;ω;`)
みたいな疑問に答えてくれるわけです。


あ、SourceTreeでの操作も一緒に説明*1しているので、おれはGUI派だっていう方や、ずっとCUIでやってたけど、GUIでやりたいというかたの移行するのに使うのもいいなと思いました。

まとめ

@さん献本いただきましてありがとうございました。
手前味噌ながら弊社のエンジニアの方々で書かれた本なのですが、そういうのを抜きにしてもいい本だと思いますのでGit始めたいという方をはじめ、リファレンス的に机に1冊あるとこれどうやんだっけ、と言う時に役に立つと思います。


デハデハ━━━( ´∀`)・ω・) ゚Д゚)゚∀゚)・∀・) ̄ー ̄)´_ゝ`)−_)゚∋゚)´Д`)゚ー゚)━━━!!!!

リンク

@さんの書いているこの本についてのブログエントリです。


開発効率をUPする Git逆引き入門

開発効率をUPする Git逆引き入門

  • 作者: 松下雅和,船ヶ山慶,平木聡,土橋林太郎,三上丈晴
  • 出版社/メーカー: シーアンドアール研究所
  • 発売日: 2014/04/09
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログ (6件) を見る


*1:しかも図解入りで!

vagrant-berkshelf(非推奨)を無理やりインストールする

はい、乙カレー様です。桑野です。
最近喉がイガイガ、鼻がムズムズ、身体は重い、これなーんだ(10点)


と、vagrant-berkshelfって非推奨になってしまったんですね。。。気付かずに入れようとしてたメモをなんとなくもったいないので書いとくw

インストール時エラー

$ vagrant plugin install vagrant-berkshelf
The plugin(s) can't be installed due to the version conflicts below.
This means that the plugins depend on a library version that conflicts
with other plugins or Vagrant itself, creating an impossible situation
where Vagrant wouldn't be able to load the plugins.

You can fix the issue by either removing a conflicting plugin or
by contacting a plugin author to see if they can address the conflict.

Vagrant could not find compatible versions for gem "celluloid":
  In Gemfile:
    vagrant-berkshelf (>= 0) ruby depends on
      celluloid (~> 0.13.0) ruby

    vagrant (= 1.5.0) ruby depends on
      celluloid (0.15.2)


 Ah, there you go. The conflict is a real issue. I haven't tried since updating the Vagrant dependencies. Unfortunately, that is not a dependency I can change.



Perhaps vagrant-berkshelf can have its dependencies updated... I'll open a ticket there.

なんかcelluloidのバージョン依存がvagrantvagrant-berkshelfで違うよーっていわれてインストール出来ないと。vagrant側がGEM管理から抜けてしまった影響ですね。

インストール手順

で、インストールどうやんのかな、と思って調べてたらvagrant-berkshelfのgithubのIssueにあった
で、やってみた


手順としてはGistにある。

berkshelf build
$ cd /tmp/dir
$ git clone https://github.com/berkshelf/berkshelf.git
$ cd berkshelf
$  gem build berkshelf.gemspec

ってやると

rbenv: version `2.0.0-p451' is not installed
rbenv: version `2.0.0-p451' is not installed

って出るのですが、これ ./.ruby-versionが残ってるからですね。
このバージョンじゃないとダメだっていってんのかもしれないですが、とりあえず2.1.0でやってみます。

$ rbenv local 2.1.0
# gemsetsを管理してる場合はこれも
$ echo >.rbenv-gemsets testgemsets
$ gem build berkshelf.gemspec

そしたらVagrantの管理してるGemにインストール

gem install berkshelf-*.gem --conservative --no-ri --no-rdoc --install-dir $HOME/.vagrant.d/gems
vagrant-berkshelf build

次は vagrant-berkshelf

$ cd /tmp/dir
$ git clone https://github.com/berkshelf/vagrant-berkshelf.git
$ cd vagrant-berkshelf
# gemsetsを管理してる場合はこれも
$ echo >.rbenv-gemsets testgemsets
$ gem build vagrant-berkshelf.gemspec


できたらgemファイル指定してvagrant plugin installで終わり。

$ vagrant plugin install vagrant-berkshelf-*.gem

インストールされたか確認

$ vagrant plugin list
vagrant-berkshelf (1.4.0.dev1)
vagrant-login (1.0.1, system)
vagrant-omnibus (1.3.1)

まあ、非推奨なんで

これからVagrant使う方はvagrant-berkshelf使わないほうがいいと思いますw
生Berkshelfを活用する方向にしましょうw(なんなんだ)


ではでは(◉◞౪◟◉`) 三 (´◉◞౪◟◉)ヒュンヒュン

追記

入れても上手く動かなかったんでやっぱ非推奨のものをつかうもんじゃないんや!って思ったんで忘れましょう。はいw

実践 Vagrant

実践 Vagrant

DENIX(デニックス) シェリフバッヂ ゴールド [113/L]

DENIX(デニックス) シェリフバッヂ ゴールド [113/L]

Vagrant起動時にVagrantfileの場所を切り替える

はい、乙カレー様です。桑野です。



ということだったんで、やってみた。
結果やりたいこととなんか違う気がするけどメモ書きとして入れておくw

やってみた

ドキュメント見ると環境変数VAGRANT_CWDでVagrantfileの検索パスの変更が出来るということなんで、やってみる。

テスト用のディレクトリ作成
$ mkdir test1 test2
テスト用のディレクトリにそれぞれVagrantfile作成
$ cat <<'EOF' > test1/Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos-65-x86_64"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.hostname = "test1"

  config.vm.provider :virtualbox do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end
EOF


$ cat <<'EOF' > test2/Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "centos-65-x86_64"
  config.vm.network :private_network, ip: "192.168.33.10"
  config.vm.hostname = "test2"

  config.vm.provider :virtualbox do |vb|
    vb.gui = false
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
end
EOF
テスト用のディレクトリに作ったVagrantfileをみるようにvagrant 起動テスト
$ export VAGRANT_CWD=./test1/
$ vagrant up
$ vagrant ssh
[vagrant@test1 ~]$
$ vagrant destroy default


$ export VAGRANT_CWD=./test2/
$ vagrant up
$ vagrant ssh
[vagrant@test2 ~]$

で、とりあえずいけた様な、、、。

とりあえず切り替えられるけど、Vagarntfileを簡単に切り替えられる方法ってもっとスマートな方法ないんだろうかw
だれか知ってたら教えて下しあw
(☝ ՞ਊ ՞)=☞)՞ਊ ՞)<それでは!

実践 Vagrant

実践 Vagrant


神星記ヴァグランツ (1)

神星記ヴァグランツ (1)

〜さよなら自作サーバ〜 自作サーバ同窓会に参加&発表してきました

どうも乙カレーさまです。桑野です。


自作サーバカンファレンスをやってもう4、5年近く経つんだなぁと思って感慨深いです。
思えば大きな発表をしたのは自作サーバカンファレンスが初めてに近いですし、@さんにお誘い頂いて発表できた事で色々得るものがあったなー、と思っています。
それだけに@ さんが今回来られなかったのは残念でした(´;ω;`)ウッ…


そして、その自作サーバですが、ぼくもうちの自作サーバはガチの自作サーバはもうやっていないよ、という卒業生としての立場で参加しました。

自作サーバカンファレンスの資料

こちらは前回の自作サーバカンファレンスの資料です。


自作サーバ同窓会の資料

こちら今回の資料、テイストを合わせてみましたw



たまにお話聞いても大体の所で自作をやる事に対しては無い、または限定的、という感じの所が多いなぁと思っていましたが、そのままな話がほとんどでした。ただ、一部の方々が「たわませて!つめこむ!」「レベルを上げて物理で殴る」等、突き抜けてて凄かったですw


この5年で変わったこととして、クラウドサービスの席捲があります。
自分たちの事業を伸ばす事、サービスを安定的に運営する為に必要な事は自作サーバを作る事ではなく、それを行うときに何を選択するか、そのためにクラウドサービスを積極的に使う事はまったくもって正しいと思います。


自分は資料にもありますが、自作サーバでやる意義、メリットを見出しやすい2009年時期にやっておいてよかったなぁと思っています。
が、myfinderさんが兵站で表現されていましたが、自作サーバは茨の道でした。サーバが壊れてはDCへいき部材交換、在庫管理の煩雑さ、部材のスペック不整合をどうするか、大量確保の問題、性能比(世代間格差)をどう吸収するか、などなど規模感が増すに従って加速度的に運用は大変になりました。
# 撤去の時はなみかわさんが大変苦労したので感謝しきりですm(_ _)m


会後の懇親会でも話がでていましたが、IaaSでもハードウェア上で動いているわけで、ハードウェア、ネットワーク、必要な知識ではあると思います。
でもそれはそれを知るために自作サーバをやる、やらせる、と言うのはおかしい訳で、ただそういったことを意識しましょう、というだけの事です。自分も含めて、今後も自作サーバをやる機会があるならあればそれがどのようなベネフィットを生むのかどうかが明確にあるかの再確認が無いといけないのではないかと思っています。


だからもし自作サーバをやることでその会社のエンジニアのスキルを底上げし、オンプレで最適環境のサーバを整えられて、DC運用も、、、兵站を揃えられるのだったらやる価値は有るかもしれません。しかし楽しいから、やりたいからやる、自作PCの延長線でやるならやらない方がいいと思います。(あ、もちろんこの辺も規模感とか、そういう要素は絡んでくると思うのでこれが絶対正しい訳ではないと思います)


同窓会をやるにあたって昔のことを思いだしました。
自作サーバを実際やってみて色々わかることがありました。
それを色々な人に伝えて行くのが自分のやりたい事の一つではあるかなと思ったのでこう言う会がやれた事は非常に良かったですし、ひとつの区切りに出来たと思っています。(最初はただの飲み会だと思っていたのがこんなに大きなイベントになるとはおもっていませんでしたwww)

最後にお礼

発案者のはてなの @ さん
会場提供、懇親会などやっていただいたフリークアウトの @ さんはじめスタッフのみなさま。
来ていただいた皆様。
Ustreamみていただいた皆様。


ありがとうございました!

追記

そうだ一応。
サーバ売られるの流れありましたが、こちらデータ削除等はちゃんとされているものだったので何か損害がでている訳ではないです。単純にパーツ売りされてた形がアレすぎ...ということですねw

追記2

自作サーバ同窓会のについて言及したツイートをまとめました。
自作サーバ同窓会とげった


Dynatron P199 1U ソケット 775 CPUクーラー[P199]

Dynatron P199 1U ソケット 775 CPUクーラー[P199]

MySQL5.5でパーティショニング使って時系列のデータを分散する

はい、乙カレーさまです。寒い日が続きますね。
そしてMySQLも続きそうな私です。


前回はトリガをやってみましたが、今度はパーティショニングをしてみます。

パーティショニングとは

パーティショニングは、特定のカラム情報を使って、テーブルを論理的/物理的に自動で分ける事で管理を簡単にしたり、パフォーマンスを確保する機能のことです。例えば今回は、更新日時でパーティショニングを行うことで、特定期間のデータを削除する等の運用が簡単になります。

パーテションの設定

プライマリキーの設定


まず既存のテーブルの場合は最初にパーテションを行うカラムがプライマリキーが含まれていないといけないので貼り直します。

mysql> ALTER TABLE usermaster_cs DROP PRIMARY KEY, ADD PRIMARY KEY(user_id, upd_datetime);
新規テーブルの場合

これから作るテーブルをパーティショニング対応するならCREATE TABLE文に含めることが出来ます。
この場合はupd_datetimeカラムを使用して、2013年1月からの月ごとのデータが入る様にパーティショニングを設定します。

mysql> CREATE TABLE `usermaster_cs` (
	  `user_name` varchar(255) NOT NULL,
	  `user_id` int(10) NOT NULL,
	  `type` int(10) DEFAULT NULL,
	  `status` int(10) DEFAULT NULL,
	  `upd_datetime` datetime NOT NULL,
	  PRIMARY KEY (`user_id`,`upd_datetime`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE  COLUMNS(upd_datetime)
(PARTITION p201301 VALUES LESS THAN ('2013-02-01 00:00:00') COMMENT = '2013-01',
 PARTITION p201302 VALUES LESS THAN ('2013-03-01 00:00:00') COMMENT = '2013-02' ,
 PARTITION p201303 VALUES LESS THAN ('2013-04-01 00:00:00') COMMENT = '2013-03' ,
 PARTITION p201304 VALUES LESS THAN ('2013-05-01 00:00:00') COMMENT = '2013-04' ,
 PARTITION p201305 VALUES LESS THAN ('2013-06-01 00:00:00') COMMENT = '2013-05' ,
 PARTITION p201306 VALUES LESS THAN ('2013-07-01 00:00:00') COMMENT = '2013-06' ,
 PARTITION p201307 VALUES LESS THAN ('2013-08-01 00:00:00') COMMENT = '2013-07' ,
 PARTITION p201308 VALUES LESS THAN ('2013-09-01 00:00:00') COMMENT = '2013-08' ,
 PARTITION p201309 VALUES LESS THAN ('2013-10-01 00:00:00') COMMENT = '2013-09' ,
 PARTITION p201310 VALUES LESS THAN ('2013-11-01 00:00:00') COMMENT = '2013-10' ,
 PARTITION p201311 VALUES LESS THAN ('2013-12-01 00:00:00') COMMENT = '2013-11' ,
 PARTITION p201312 VALUES LESS THAN ('2014-01-01 00:00:00') COMMENT = '2013-12' ,
 PARTITION p201401 VALUES LESS THAN ('2014-02-01 00:00:00') COMMENT = '2014-01' ,
);
既存テーブルの場合

既存のテーブルに設定するならALTER TABLE を使いましょう。

mysql> ALTER TABLE usermaster_cs
PARTITION BY RANGE COLUMNS(upd_datetime) (
PARTITION p201301 VALUES LESS THAN ('2013-02-01 00:00:00') COMMENT = '2013-01',
 PARTITION p201302 VALUES LESS THAN ('2013-03-01 00:00:00') COMMENT = '2013-02' ,
 PARTITION p201303 VALUES LESS THAN ('2013-04-01 00:00:00') COMMENT = '2013-03' ,
 PARTITION p201304 VALUES LESS THAN ('2013-05-01 00:00:00') COMMENT = '2013-04' ,
 PARTITION p201305 VALUES LESS THAN ('2013-06-01 00:00:00') COMMENT = '2013-05' ,
 PARTITION p201306 VALUES LESS THAN ('2013-07-01 00:00:00') COMMENT = '2013-06' ,
 PARTITION p201307 VALUES LESS THAN ('2013-08-01 00:00:00') COMMENT = '2013-07' ,
 PARTITION p201308 VALUES LESS THAN ('2013-09-01 00:00:00') COMMENT = '2013-08' ,
 PARTITION p201309 VALUES LESS THAN ('2013-10-01 00:00:00') COMMENT = '2013-09' ,
 PARTITION p201310 VALUES LESS THAN ('2013-11-01 00:00:00') COMMENT = '2013-10' ,
 PARTITION p201311 VALUES LESS THAN ('2013-12-01 00:00:00') COMMENT = '2013-11' ,
 PARTITION p201312 VALUES LESS THAN ('2014-01-01 00:00:00') COMMENT = '2013-12' ,
 PARTITION p201401 VALUES LESS THAN ('2014-02-01 00:00:00') COMMENT = '2014-01' ,
);


稼働中ならPercona-Toolkitで提供しているpt-online-schema-changeで無停止で行うことが出来ます。ありがたやありがたや。

pt-online-schema-change --charset="utf8" --set-vars="sql_log_bin=OFF" --execute --alter="
PARTITION BY RANGE COLUMNS(upd_datetime) (
PARTITION p201301 VALUES LESS THAN ('2013-02-01 00:00:00') COMMENT = '2013-01',
(snip)
 PARTITION p201401 VALUES LESS THAN ('2014-02-01 00:00:00') COMMENT = '2014-01' ,
);" h=localhost,D=database,t=usermaster_cs,u=dbuser
パーテション追加

もし、2014年2月分のレンジ追加を行う場合は以下のSQLで可能です。

mysql> ALTER TABLE usermaster_cs
ADD PARTITION (
PARTITION p201412 VALUES LESS THAN ('2014-03-01 00:00:00') COMMENT = '2014-02' ENGINE = InnoDB,
);

実行時はロックがかかります。データが無ければ一瞬で終わりますが、気になる場合は前述のpt-online-schema-changeを使いましょう。


レンジを都度追加していく場合はもしもレンジの追加を忘れていた場合等に、その存在しないパーテションレンジへデータの追加しようとした場合にはデータ追加が出来ない、と言う事になります。


その場合はMAXVALUEを指定して、このレンジよりも最新のデータはこのパーテションレンジで救う事が可能となります。素晴らしい。

mysql> ALTER TABLE usermaster_cs ADD PARTITION (PARTITION pmaxvalue VALUES LESS THAN (MAXVALUE));


その代わり2月分をまとめたい、と言う話になった場合はREORGANIZE PARTITIONでパーテションレンジを分離する必要が出てきます。
どっちが楽かみたいな話はありますが、自動でADDするような仕組みを作るならMAXVALUEは設定しなくてもいいかもしれないですね。

mysql> ALTER TABLE usermaster_cs REORGANIZE PARTITION pmaxvalue INTO (
    PARTITION p201412 VALUES LESS THAN ('2014-03-01 00:00:00') COMMENT = '2014-02',
    PARTITION pmaxvalue VALUES LESS THAN (MAXVALUE)
);
パーテション削除

(2014/2/8:追記 削除完全に書き忘れてたw)
2013年1月のデータが要らなくなったんで削除したい、と言う場合はDROP PARTITIONで該当のパーテションを削除したらOKです。
これもそんなに時間かからないですが、ロックかかるので気になる環境であればpt-online-schema-change使いましょう。
当たり前ですけどデータも消えちゃうので注意。

mysql> ALTER TABLE usermaster_cs DROP PARTITION p201301;
データ入れ込み

じゃあデータを入れてみませう。(実際はトリガでデータを入れ込む予定)

mysql> insert into usermaster_cs select * from copy_source_table;

設定の確認

SHOW CREATE TABLE

SHOW CREATE TABLE を使用すると、パーティショニングされたテーブルの作成に使用されたPARTITION句をみると大体わかります。

mysql> SHOW CREATE TABLE usermaster_cs;
(snip)
SHOW TABLE STATUS

SHOW TABLE STATUS を使用するとテーブルがパーティショニングされているかを判定することができます。

mysql> SHOW TABLE STATUS \G
(snip)
 Create_options: partitioned
(snip)

INFORMATION_SCHEMAで確認

下記クエリでusermaster_csにあるパーテションを確認できます。

mysql> SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE table_name='usermaster_cs' \G
EXPLAIN PARTITIONS SELECT

EXPLAIN PARTITIONS SELECT ステートメントを使用するとパーティショニング環境のクエリのEXPLAINが行うことができます。
どのパーティションが SELECT で使用されているか判別できます。


条件を入れない場合は全てのパーテションに対してアクセスが行くのに対して、

mysql> EXPLAIN PARTITIONS SELECT * FROM usermaster_cs \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: usermaster_cs
   partitions: p201301,p201302,p201303,p201304,p201305,p201306,p201307,p201308,p201309,p201310,p201311,p201312,p201401,pmaxvalue
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 68886025
        Extra:
1 row in set (0.00 sec)


条件を入れた場合には該当パーテションにだけアクセスが行くことがわかります。

mysql> EXPLAIN PARTITIONS SELECT * FROM usermaster_cs WHERE upd_datetime='2013-10-30 21:04:06' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: usermaster_cs
   partitions: p201310
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 2247981
        Extra: Using where
1 row in set (0.00 sec)


この前のトリガと組み合わせると特定テーブルのデータを別テーブルで期間保存とか出来たりして便利かもしれないですね。
ではでは三ʅ(◔౪◔ʅ)三(ʃ◔౪◔)ʃ


実践ハイパフォーマンスMySQL 第3版

実践ハイパフォーマンスMySQL 第3版