MySQL5で文字化けと格闘

まだ、自分の中では実績のないMySQL5ですがUTF8でページ作成していたときは問題なかったのがSJISでページ作成したら思ったとおり文字化け起こしました。結局は文字列の照合を全てbinaryにして解決しましたが、いろいろと改造してしまったので確定要素がない…。(ページ作成を落ち着いたらテーブル設定以外を元に戻してみます)

◆以下は落ち着いたら元に戻す項目

php.iniを導入して言語を日本語、システムの文字コードをSJISに設定して再起動
# cp php.ini-dist /usr/local/lib/php.ini
# ee /usr/local/lib/php.ini

編集項目
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = SJIS

/etc/my.cnfにSJISの設定を追加

[mysqld]
default-character-set=sjis

[mysqldump]
default-character-set=sjis

[mysql]
default-character-set=sjis

と設定して再起動。
MySQLにログインしたあと下記のコマンドを発行して確認。

mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| character_set_client | sjis |
| character_set_connection | sjis |
| character_set_database | sjis |
| character_set_results | sjis |
| character_set_server | sjis |
| character_set_system | utf8 |
+————————–+——-+
6 rows in set (0.00 sec)

よくいろいろな薬を試して結果直ったけれど、どの薬が効いたのか分からない…そんな状況です。(多分、my.cnfやphp.iniの設定は不要だったきがしますが…)

findコマンドを使用したファイル改変検知

ファイル改変を含む侵入検知を行う場合は、通常IDS(Intrusion Detection System:侵入検知システム)を使いますが、結構これがファイヤーウォール以上に負荷が高く導入するとパフォーマンスを維持するコストが跳ね上がります。

例えば/home/user/ 直下で24時間以内に変更されたファイルを検出するには

# find /home/user/ -maxdepth 1 -mtime -1

と打ちます。maxdepthで検索ディレクトリからfindで検索する階層を指定(1なら直下、2なら直下のサブディレクトリの下まで)、mtimeで-1は1日以内、+nにするとn日以上になります。

また、mtimeの代わりにmminを使用した場合は単位は分になります。

# find /home/user/ -maxdepth 1 -mtime -1440

これをcron等に登録して定期実行しメールで渡してあげればファイル変更を検出できます。
これは外部からの侵入よりもソーシャルハッキングの検知やオペレーションミスの早期発見によいかもしれません。

巨大なログはsplitコマンドで分割

1GB弱のsqlダンプを編集する必要があってterapadで開こうとしたのですが、デスクトップでもダメでした。一度どこかにダミーサーバーを立てて必要な部分だけ抽出という作戦もありましたがバージョン互換性のあるDBが無くて困っていたところUNIX上でsplitコマンドを使いテキスト分割できることを発見。

行を一区切りとする場合
# split -1000 filename SPLIT

こうするとfilenameを1000行ずつSPLITを先頭文字とした分割ファイルが生成されます。
これを行数ではなくバイト数で分割する場合は

# split -b 1048576 filename SPLIT
# split -b 1024k filename SPLIT
# split -b 1m filename SPLIT

のようにします。上記3つのコマンドは単位を替えて表記したもので全て同じ意味になります。
1m=1024k
1k=1024bytes
1m=1048576bytes