シェルから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をつくったが、忘れそうなのでメモしておく
プロジェクトを作成する
ここは、いつも通り、File→New→NewProjectでプロジェクトを作成します。
モジュールを作成する
ここから、もう早速モジュールの作成。
File→New→NewModuleでモジュール作成画面を開く
Android Libraryを選択してNext
Library nameとModule nameを決定(Package nameを変更したければ Editを押して編集)
Add No Activityを選択してFinish
下記の画面のようにプロジェクトにモジュールが作成されますので、Libraryにしたいコードを記述しましょう。
build.gradele(Module.mylibrary)を編集する
※ mylibrary.jarという名前で出力される。(ここは変更してもOK、ただし、2箇所同じ名前にする)
jar形式に圧縮する
さきほど作成したモジュールをjarにします。
プロジェクトのディレクトリへ移動し。下記のコマンドを実行します。
Android Studio New Module Command
すると、
./mylibrary/release/mylibrary.jar
が生成されます。
jarを読み込む
モジュールを作成しても読み込まないと意味が無いので、使いたいアプリケーションでjarを読み込みます。
- 使いたいアプリケーションのapp→libsディレクトリまで移動
- jarファイルをコピー
- build.gradle(Module: app)の dependenciesの項目にcompile files('mylibrary.jar')を追記
- Sync Now
実際使う
libraryをimportしてお好きにどうぞ!
MySQL5.5から、5.6にバージョンアップ
今更だけど、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でレプリケーションの設定をしてみた
redis memcachedって?
redis memcachedともに、イネーブラ型でオンメモリのKVS。
メモリ上で動作するので動作が高速なことで有名な両者。レプリケーションできれば幸せそうなので、やってみる。
てか、イネーブラ型って?
他の製品との組み合わせによって効果を発揮するもの
例えば、memcachedはMySQLなどと組み合わせ、読み出しの性能を向上させるために利用されている。
テストサーバー構成
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 ...
...
################################# 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
実行してみる
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
\ # /usr/bin/php ./memcached.php
string(5) "value"
string(5) "value"
bool(false)
おわり(´・ω・`)
おわり(´・ω・`)
おわり(´・ω・`)
ansibleしてみたので、やったことやハマったことをメモしてみる
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
ハマったことその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の設定した内容です。