yumで古いバージョンのmysql(5.1)をインストール

古いバージョンのアプリケーションは最初からはいっているリポジトリでは無い事が多い。

No package mysql51 available.
No package mysql51-devel available.
No package mysql51-server available.
No package mysqlclient15 available.


1. リポジトリ設定ファイルを取得

wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/ius-release-1.0-11.ius.el5.noarch.rpm
wget http://dl.iuscommunity.org/pub/ius/stable/Redhat/5/x86_64/epel-release-5-4.noarch.rpm

2.インストール

rpm -Uvh *-release*rpm

3. mysql5.1インストール

yum -y install mysql51 mysql51-devel mysql51-server mysqlclient15

MySQL4系の罠 query interrupt

MySQLで、モニタから適当にクエリ投げている時
「あっ、これは返ってこないな」とおもってCtrl+Cでクエリ実行を中断することがある。

業務で初めてつかったのはMySQL5.1で、そういう手段は特に問題はなかった。
レガシーな保守をすることになって業務では初めてMySQLで4.0を触った。


これで同様なことをするとCtrl+Cは実はモニタを抜けるだけで、クエリは実行されたままだ。

しかもストレージエンジンがMyISAMで、書き込みが多く走るテーブルの場合。。。

  1. 重いクエリを投げる
  2. 共有ロックがかかる(read only)
  3. 更新クエリがたまる
  4. (さらにクエリがたまると) コネクションの上限に達する
  5. Webサーバーからアクセスできなくなる
  6. フロントがテンポる^0^


[対策]
一度モニタを抜け、重いプロセスを確認

show processlist;

プロセスKill

kill 12345;

これで一応大丈夫。
※Killするときは間違って他のプロセスを切断しないこと
(特にReplicationのI/Oスレッド、クエリスレッド)

QFixHowm.vimが糞便利な件

今更感だけど。


アイディアとか、残しておきたいテキストとか、サクッとメモれるツールないかなーと
思っており、通常はmacのsticky使ったりEvernoteとかそこらへん。

vimでメモしやすいプラグイン見つけたから今日からつかってる

QFixHowm

  • install
NeoBundle 'git://github.com/fuenor/qfixhowm.git'

NeoBundleならこれで。

  • 設定

↓のような感じで保存先ディレクトリとか決めておく

"---------------------------------------------------------------------------
" QFixHowm

"QFixHowmキーマップ
let QFixHowm_Key = 'g'

"howm_dirはファイルを保存したいディレクトリを設定。
let howm_dir             = '~/Dropbox/memo'
let howm_filename        = '%Y/%m/%Y-%m-%d-%H%M%S.howm'
let howm_fileencoding    = 'utf-8'
let howm_fileformat      = 'unix'

let QFixHowm_DiaryFile = 'diary/%Y/%m/%Y-%m-%d-000000.howm'

"---------------------------------------------------------------------------
  • 使い方
    • g,
      その日の日付でファイルが作成される。
      二度目もそのファイルが開かれるので、ぱっとだしやすい
    • g,m
      最近閲覧、更新したエントリ一覧を表示
    • g,g
      grepする(howm保存ディレクトリ配下


これだけで結構便利。

Editor

色々エディタ、IDE渡り歩いたけど、Vimがやはり安定かもしれない。


渡り歩いたエディタ/IDE

  1. notepad.exe
  2. terapad
  3. eclipse
  4. netbeans
  5. vim
  6. eclipse
  7. vim
  8. sublime text 2
  9. php storm
  10. vim

で、結局vimに落ち着いた。

vimな理由

  • テキストエディタだから
  • テキストエディタのくせに柔軟だから
    • IDEのように扱うこともできる
    • grepもできる
    • タブ管理(buffer)も可能
  • 細かいショートカットが多い
    • その行の特定の文字列まで移動、削除、選択するのが簡単
  • プラグインが豊富
    • プラグインの管理はめんどいけど、neobundleいれたら楽ちんになった
  • 矩形選択
    • 割といろんなエディタにあるけど、各種ショートカットと組み合わせてすごい使いやすい
  • window分割


数えきれないくらいあるんだけど、
vimshellいれて移動も全部ショートカットでできるし、
無理やりinsertモードはいって、コピーとかいろいろいできるしね。柔軟ですね

mysql4.0チューニング

諸事情で今となってはレガシーなmySQL4.0に大量のデータをプログラムからぶちこむことになり。。
1時的にでもパフォーマンスをあげなければいけなくなった。

条件

MySQL4.0
対象テーブルのストレージエンジンはMyISAM、数百万レコード
3年以上稼働しており、枯れているのでmy.cnfはいじらず。。

検討

  • 対象テーブルのindexを一旦解除し、index作成のオーバーヘッドを減らす。
    • 対象テーブルのindexを試しに一つ削除してみる
      mysql> drop index index_name on table_name;
      • 消し終わるのに45minかかってしまった。。これでは意味が無い。
      • 試しにcreate indexしても同じくらいの時間を要する。一つのindexでこれだけ時間かかってはたまらない。
    • alter table disable keysで一時的にindexを無効にしてみる
      • ほぼ一瞬で完了。
      • しかし、プログラムでデータインサートしており、その際に対象テーブルの参照も行われるので、indexがないことにより逆にめちゃくちゃ時間かかる
      • ためしにalter table enable keysでindexしたところ、これも1時間近くかかる
    • optimize table table_nameをしてみる
      • optimize tableはデータとindexを最適化する。(デフラグのようなもの)
      • データ更新が多いMyISAMに強い効果がある
      • 実行し、プログラムを実施したら劇的に早くなった。
      • ただし、、45minほど時間を要してしまったので、トータルでみると元の時間と結局≒に。。
      • しかも読み取りまでロックされてしまうので、影響が多い。
      • 途中で止めたら死ぬ。(repearするまで動かない
    • analyze table table_nameをしてみる
      • optimize tableのindexのみ版
      • optimizeと比較してかなり早くおわった。
      • ただしプログラム実行時間にそこまで違いがないような。。。
    • alter table table_name key MyISAM
      • 今度はこれで試す

mysqlリストア方法

結局切り戻すことになったのでメモ

構成

MySQL4.0
ストレージエンジンはすべてMyISAM
マスター1台、スレーブ2台の冗長構成

方法

  1. slaveとmasterのmysqlを落とす
    1. slave側は念のためレプリケーションを止めておく
      mysql> stop slave;
    2. master,slaveともに落とす
      /sbin/service mysql stop
  2. 事前にバックアップしたmySQLのデータを用意します(自分の環境では/var/lib/mysql以下
    1. masterとslaveの全てに用意しておく(ex /var/lib/mysqlBK に展開
  3. /var/lib/mysqlを移動
    1. mv /var/lib/mysql /var/lib/mysql_origin
  4. /var/lib/mysqlBKを移動
    1. mv /var/lib/mysqlBK /var/lib/mysql

データの移動自体はこれでOK
以下起動とレプリケーションの設定

  1. 各masterとslaveを立ち上げ
    1. /sbin/service mysql start
  2. 念のためデータを確認
    1. mysqlモニタにログインしshow tables; など
  3. レプリケーションの開始
    1. masterにて
      mysql> reset master;
    2. slaveにて
      mysql> reset slave;
      これでレプリケーションの同期をしなおすことができる。
    3. slaveにて
      mysql> show slave status;

補足

  • my.cnfにレプリケーションの情報が書かれていること前提
  • 今回はデータのみバックアップしており、binlogなどはバックアップしておらず。。本来ならbinlogもそのままリストアすればreset masterをする必要がない。また、マスタだけじゃなくスレーブもバックアップしてると、それらを元の場所へリストアするだけでちゃんと動く

mysqlBackup方法

MySQLを止めていいのであれば、データディレクトリごとバックアップOK

# /sbin/service mysql stop
# tar cvzf mysql_backup.tar.gz /var/lib/mysql

mysqlのデータはMYI、MYD、frmファイルがある。

:
users.MYD
users.MYI
users.frm
:


それぞれ、下記のデータが保存されている。

テーブル名.frmファイル どのようなカラム構成にてできているかなどのテーブル構造のデータ
テーブル名.MYDファイル テーブルのレコードデータ
テーブル名.MYIファイル そのテーブルに対して作成された複数のインデックスデータとテーブルの統計情報