シェルからMySQLを実行するときにハマったのでメモしておく

MySQLで、月別に作成されるテーブルをダンプして、バックアップのDBに移すときにちょっとハマったのでメモ。

やりたかったこと

table201401dump.sql、table201402dump.sql、table201403dump.sql........

こんな感じのバックアップファイルがあったので、DBに展開して閲覧したかった。

失敗した

mysql backupdb < ...sql を一個一個ダンプを展開していくのはしんどいので、ループ書いて処理することにした。

作った処理は以下の様な感じ

実行してみると、、、、できない。。。

mysqlクライアントが起動しているっぽい。

できた

mysql以降の変数評価ができてないな。

ってことで、evalつけたら出来ました。

Linuxコマンド集 - 【 eval 】 複数の変換処理を一度に行う:ITpro

ちょっと調べてたら、そんなの常識って感じですね。。。

知らなかったので、戒めのためと忘れないために書き残しておきます。

MySQLで大文字と小文字が比較されなかった件

UNIQUE KEYを設定しているのに、文字列がUNIQUE判定されないってことがあった。

以前に同じようなことがあったのを、すっかり忘れていたのでもう忘れないようにメモメモ。。。

カラムにTEXT型とかCHAR型とか利用していると思いますが、

文字列を比較するときに実は落とし穴があったりします。

何かというと。。。。

英字の大文字小文字の比較をしてくれません!

こんなものでパスワードを比較した場合、とんでもないことになりますね。

a=A が成立しているということです。

password,paSSword,PassWord,PASSWORD

あいうえおA,あいうえおa

全部同じ文字として処理されます。

検索したときなんか、ユーザーが同じパスワードを設定していた場合

SELECT user, password FROM table WHERE password = "password";

user1,Password

user2,password

こんなことになります。

さて困った。そんな時には、BINARY型を使いましょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 11.4.2 BINARY および VARBINARY 型

文字列をbinaryとして保存してくれるので、比較の大文字小文字問わず比較してくれます。

ということで、重複を許さないデータはBINARYとして保存しておきましょう。

テーブルを作成してしまった後でも、

ALTER TABLE table MODIFY col TEXT BINARY;

みたいな感じで変更可能です。

(^_^;)

Android Studioでjarをつくったが、忘れそうなのでメモしておく

f:id:isopan:20150519130816p:plain

プロジェクトを作成する

ここは、いつも通り、File→New→NewProjectでプロジェクトを作成します。

モジュールを作成する

ここから、もう早速モジュールの作成。

  1. File→New→NewModuleでモジュール作成画面を開く

  2. Android Libraryを選択してNext f:id:isopan:20150519131238p:plain

  3. Library nameとModule nameを決定(Package nameを変更したければ Editを押して編集)

  4. Add No Activityを選択してFinish f:id:isopan:20150519131318p:plain

下記の画面のようにプロジェクトにモジュールが作成されますので、Libraryにしたいコードを記述しましょう。

f:id:isopan:20150519131336p:plain

build.gradele(Module.mylibrary)を編集する

Android Studio New Module

※ mylibrary.jarという名前で出力される。(ここは変更してもOK、ただし、2箇所同じ名前にする)

jar形式に圧縮する

さきほど作成したモジュールをjarにします。

プロジェクトのディレクトリへ移動し。下記のコマンドを実行します。

Android Studio New Module Command

すると、

./mylibrary/release/mylibrary.jar

が生成されます。

jarを読み込む

モジュールを作成しても読み込まないと意味が無いので、使いたいアプリケーションでjarを読み込みます。

  1. 使いたいアプリケーションのapp→libsディレクトリまで移動
  2. jarファイルをコピー
  3. build.gradle(Module: app)の dependenciesの項目にcompile files('mylibrary.jar')を追記
  4. Sync Now

実際使う

libraryをimportしてお好きにどうぞ!

 

 

MySQL5.5から、5.6にバージョンアップ

f:id:isopan:20150305163250j:plain

今更だけど、MySQL5.5で動いていたサービスのDBがあったので、DBをアップデートした。

その時のメモ

MySQLを停止

# service mysqld stop
mysqld を停止中: [OK]

 

不要パッケージの削除

# rpm -qa | grep mysql
mysql-server-5.5.27-1.el6.x86_64
mysql-5.5.27-1.el6.x86_64
mysql-devel-5.5.27-1.el6.x86_64
mysql-libs-5.5.27-1.el6.x86_64

# yum remove mysql-server mysql mysql-devel mysql-libs

 

MySQL5.6のインストール

# rpm -ivh http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm
http://repo.mysql.com/mysql-community-release-el6-5.noarch.rpm を取得中
準備中... ########################################### [100%]
1:mysql-community-release########################################### [100%]

# yum install mysql mysql-server enablerepo=mysql56-community

 

コンフィグの書き直し

5.5で使えていたものが使えなくなったり、逆に必要そうなものを追加

* 「sql_mode」を変更。5.6でデフォルトで設定してある
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

5.5と同じ動作にするなら、空にする
sql_mode=

SQLモードに関してのマニュアル

MySQL :: MySQL 5.6 Reference Manual :: 5.1.7 Server SQL Modes

 

* 使えなくなった設定を削除(自分が設定していて使えなくなったものは以下の3つ)
使えなくなったものを設定している場合は、起動時にエラーログにでる。
thread_cache
table_cache
innodb_additional_mem_pool_size

 

ローカルIPが変わったのでサーバーIDを振り直す

# hostname -I | sed -e 's/ /n/' | grep -v '^$' | tail -1 | awk -F. '{print $3 * 256 + $4}'

出力された値をserver_idに設定

MySQL起動

# service mysqld start

 

ログをみると

[ERROR]

Column count of mysql.slow_log is wrong. Expected 12, found 11. Created with MySQL 50525, now running 50623. Please use mysql_upgrade

to fix this error.

 

こんなエラーがでたので、

 

# mysql_upgrade

 

したらなおりました

 

redis memcachedでレプリケーションの設定をしてみた

 

f:id:isopan:20150305163436p:plain

redis memcachedって?

redis memcachedともに、イネーブラ型でオンメモリのKVS。

メモリ上で動作するので動作が高速なことで有名な両者。レプリケーションできれば幸せそうなので、やってみる。

てか、イネーブラ型って?

他の製品との組み合わせによって効果を発揮するもの

例えば、memcachedMySQLなどと組み合わせ、読み出しの性能を向上させるために利用されている。

テストサーバー構成

CentOS6.5 メモリ2GB

  • Master : 192.168.100.10
  • Slave01 : 192.168.100.11
  • Slave02 : 192.168.100.12

redis編

redisをインストール

# yum -y install redis

Master,Slave01,Slave02で実行

redisを起動

# service redis start

Starting redis-server: [ OK ]

Master,Slave01,Slave02で実行

redisは、デフォルトで6379ポートを利用するようになっている。

/etc/redis.conf にて変更可能。

詳しい設定に関しては、公式ドキュメントを参照してください。

設定ファイル — redis 2.0.3 documentation

 

redisレプリケーションの設定

//コンフィグファイルの設定

# vi /etc/redis.conf ...

#bind 127.0.0.1  #コメントアウト

...

################################# REPLICATION #################################

...

slaveof 192.168.100.10 6379 #これ追加

...

ポートが空いてない場合は、iptablesでポートを開放する

-A INPUT -s 192.168.100.11 -p tcp --dport 6379 -j ACCEPT

-A INPUT -s 192.168.100.12 -p tcp --dport 6379 -j ACCEPT

再起動

# service redis restart

Slave01,Slave02で実行

redisレプリケーション確認

Masterで確認

# redis-cli info

...

role:master

slave0:192.168.100.11,54393,online

slave1:192.168.100.12,48366,online

...

role:masterの箇所にスレーブの一覧が出てくればOK

phpで動作確認

PHPのバージョンは5.6。redisを利用するにはpeclの拡張を入れる必要がある。

# yum -y install php-pecl-redis

# vi ./redis.php

gistc06000b0ae61d8149ccf

 

実行してみる

# /usr/bin/php ./redis.php

string(5) "value"

string(5) "value"

string(5) "value"

レプリケーションできているようでした。

おわり( ^ω^)

memcached

memcachedにはレプリケーションの機能が備わっておらず、レプリケーションを利用するには、他のミドルウェアを使わないと行けない。

今回は、KLabが開発したmemcachedレプリケーション機能をつけた「repcached」を利用する。

repcached - add data replication feature to memcached

こちらのサイトを参考にさせて頂きました。

repcachedをインストールして、memcachedをレプリケーションしてみる | 本日も乙

repcachedのインストール

# yum install libevent-devel

# wget http://sourceforge.net/projects/repcached/files/repcached/2.2.1-1.2.8/memcached-1.2.8-repcached-2.2.1.tar.gz

# tar zxvf memcached-1.2.8-repcached-2.2.1.tar.gz

# cd memcached-1.2.8-repcached-2.2.1

# ./configure --enable-replication

# make

# make install

# memcached -h

memcached 1.2.8

repcached 2.2.1

ポートが空いてない場合は、iptablesでポートを開放する

memcachedのポート番号はデフォルトで11211だが、レプリケーションするために必要なポート番号がデフォルトで11212なので、レプリケーション対象に対して11212を開けておく必要があるらしい。

-A INPUT -s 192.168.100.11 -p tcp --dport 11212 -j ACCEPT

-A INPUT -s 192.168.100.12 -p tcp --dport 11212 -j ACCEPT

ユーザーの追加

# useradd -M -s /sbin/nologin memcached

起動スクリプトを編集

こちらを参照→http://nagamoo.blogspot.jp/20120701_archive.html

レプリケーションの設定

Slaveで

# /etc/sysconfig/repcached

PORT="11211"

USER="memcached"

MAXCONN="1024"

CACHESIZE="1024"

OPTIONS=""

REPHOST="192.168.100.10"

自動起動の設定

# chkconfig add repcached

# chkconfig repcached on

# service repcached start

Starting repcached(memcached): [ OK ]

レプリケーションの確認

# ps aux | grep memcached 501 4895 0.0 0.1 17656 956 ? Ss 08:06 0:00 /usr/local/bin/memcached -d -x 192.168.100.10 -p 11211 -u memcached -m 1024 -c 1024 -P /var/run/memcached/repcached.pid

-x 192.168.100.10 これがついていれば大丈夫らしい。

phpで動作確認

# yum -y install php-pecl-memcache

# vi ./memcached.php

gist9d2e34c5fe57e4a9cbdf

 

\ # /usr/bin/php ./memcached.php

string(5) "value"

string(5) "value"

bool(false)

 

複数台のレプリケーションはできないようでした。

おわり(´・ω・`)

おわり(´・ω・`)

おわり(´・ω・`)

ansibleしてみたので、やったことやハマったことをメモしてみる

f:id:isopan:20150305163536p:plain

ansibleとは、Pythonで書かれたプロビジョニングフレームワークです。

私の実行環境は、CentOS6.6でした。

 

ドキュメント

Ansible Documentation — Ansible Documentation

プロビジョニングって?

サーバに対してミドルウェアのインストールや設定等の環境構築を行うこと。

ansibleは、そのプロビジョニングを自動化してやってくれるフレームワーク

自動化することで冪等性が担保される( ^ω^)

冪等性

ある操作を1回行っても複数回行っても結果が同じであることをいう概念。

サーバーが複数台あると、冪等性を保つのが大変!

マニュアル通りにやっていても、「僕の開発環境では動きました!(`・ω・´)キリッ」「あれ?このツール入れたっけ?」「あれもこれもこの開発環境だけいれておこうww」

のようなカオス状態がなくなります。

 

鍵の作成とユーザーの作成

作成するユーザーはansibleとし、各サーバーのIPは以下のとおりとします。

ansibleサーバーIP:192.168.1.1

ansibleクライントIP:192.168.1.2

 

gista5c1bca7ae7ebd10688e

 

ハマったことその1

クライアント環境では、実行者にsudo権限が必要だった。

色々sudoしなくてはならないのに、sudoをパスワードなしで実行できる権限を付与しておくの忘れた。

ansibleを利用するユーザーには、必ず付与しておこう。

# visudo

ハマったことその2 

なぜかaction service コマンドが使えない

ntpdやらhttpdを起動したかったのに、action serviceが使えない。

No JSON object could be decoded

こんなエラーがでる。

 

クライアント側で

# yum install python-simplejson

してみるといいよってドキュメントに書いてあった。 

Installation — Ansible Documentation

 

けど、、、解決できなかったから。もう

/etc/init.d/xxxx start|restart|stop init.dを直接commandで実行しちゃったよ。

command: /etc/init.d/ntpd start

 

ハマったことその3

対話型を自動入力する

memcachedをインストールしたときに、なかなか進まないと思ったら、文字入力を促されている箇所で止まっていた。

 

expectを使う手もあるけど、簡単にやるなら

command: yes yes | pecl install memcached 

 

ってyesコマンドを使う手もある。

 

まださわりしかやっていないので、他にも色々ハマるところはでてきそうだけど、ansibleは覚えることが少なくて、個人的にはかなりオススメ。

 

また、完全に冪等性を保つためには、サーバーからの返り値を取ってごにょごにょするみたい。もう少し踏み込んでみよう!

 

 

screenで検索したら自分のブログに辿り着いたのでもう一度書いてみる

screenを忘れてしまった、、、

検索しているうちに自分の過去に書いたブログに辿り着いた。

ということで、再度メモ。

 

①インストールが簡単 #yum install screen で一発OK

②操作に違和感がなく使える
 使い慣れたターミナルで仮想的に複数の端末を起動させることになるので
 screenコマンドをちょこっと覚えるだけで使える

③ターミナルを複数起動しないので邪魔にならない
 仮想端末を一つのターミナルのウィンドウで立ち上げるので、接続先に対して複数のターミナルを
 立ち上げる必要がない。スッキリ綺麗。

④接続状態の保存ができる
 screenを起動しているサーバーの落とさない限り接続が続いている。
 自分の端末からやっているとたまに、接続切れて転送失敗してるやん!
 とか言う悲しい事がない。

⑤仮想端末を再利用できる
 screen -r 起動した仮想端末名 で接続状態が再利用できる
 これがめっちゃ便利。
 接続状態だけではなく、コマンドも実行された状態が残っているから、ビビる。
ex)
 screen -S test と起動した場合
 screen -r test で起動すると以前の端末の状態が復元できる

とこんな感じ、使ってみるとなんで今まで使わなかったんだと思うくらい良い。

ちなみにDetachedが増えてきたら

rm -rf /var/screen/run/S-ユーザー/*

で消し去ればOK。

たくさん作ったなぁと思ったら。

screen -list

で仮想端末を確認してみるといいかも。

 

 以下、.screenrcの設定した内容です。