mysql:configure: error: Cannot find libmysqlclient under /usr

mysql5のconfigureで以下のようなメッセージが出るとき、

configure: error: Cannot find libmysqlclient under /usr/local.
Note that the MySQL client library is not bundled anymore!

かつ、アーキテクチャが64のときは./configure オプションに
--with-mysql=/usr/bin/ --with-libdir=lib64
が足りない。

アーキテクチャの確認方法は
uname -r

mysql:テーブルのrepair

mysqlでこんなエラーメッセージが出てた。

Table table_name is marked as crashed and should be repaired

とりあえず、エラーが出ているテーブルを調べる。

mysql> check table table_name;
+----+---+----+-------------------+
| Table | Op | Msg_type | Msg_text |
+----+---+----+-------------------+
| table_name | check | warning | Table is marked as crashed |
| table_name | check | warning | 1 client is using or hasn’t closed the table properly |
| table_name | check | error | Record at pos: 482160 is not remove-marked |
| table_name | check | error | record delete-link-chain corrupted |
| table_name | check | error | Corrupt |
+----+---+----+-------------------+

確かにテーブルにエラーがある。
これを直すにはrepairコマンドを使うらしい。
mysql> repair table table_name;
+----+----+----+--------------+
| Table | Op | Msg_type | Msg_text |
+----+----+----+--------------+
| table_name | repair | warning | Number of rows changed from 63 to 64 |
| table_name | repair | status | OK |
+----+----+----+--------------+
これで直ったっぽい。
どうしてこの手順で直るのかはいつか調べる。

mysql:DATETIME型とTIMESTAMP型

DATETIME型は8バイト、TIMESTAMP型は4バイト。
サポートする日付の範囲は
DATETIME: 0000年~9999年
TIMESTAMP: 1970年~2037年

4バイトくらいケチらずにDATETIME型を使うのが基本か。
TIMESTAMP型で更新日時など内部データを持つのはアリかもしれない。
けど、生年月日のようなデータ入れられない。
システムの中で何種類も日付型を使うのが面倒ならDATETIME型に統一したほうがいい。

mysql:MySQLのバックアップとリストア

mysqldumpでバックアップ&リストア

すべてのデータベースをdumpでバックアップ

$ mysqldump -u root -p -x --all-databases > dump.sql
特定のデータベースをバックアップするときは
$ mysqldump -u root -p データベース名 > dump.sql
すべてのデータベースを復元するときは
$ mysql -u root -p < dump.sql
特定のデータベースを復元するときは
$ mysql -u root -p データベース名 < dump.sql

mysql:mysqlとsennaのインストール

yumで要るものを全部入れる。

yum install mecab
yum install mecab-ipadic
yum install senna
yum install MySQL-shared
yum install MySQL-client
yum install MySQL-server

mysql -urootでログインして、↓このように”Tritonn Project”のバージョンが表示されればOK。 mysql -Vでは表示されないので注意。

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2419
Server version: 5.0.51a-modified-log MySQL Community Server (GPL) (portions (c) Tritonn Project)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysqlインストール後の儀式、rootのパスワードを変更する。
mysqladmin -u root password パスワード


次にmy.cnfを設定する。
/usr/share/mysql/にある雛形を使ってmy.cnfを作成する。雛形はサーバスペックにあわせて選ぶ。意味なく大きいのにしないこと。

my.cnf雛形選択の目安
my-small.cnf
64Mバイト以下のメモリの小規模サーバー向け
my-medium.cnf
32M~64Mバイトのメモリを持つMySQL専用サーバーか、128Mバイトのメモリを持つサーバー向け
my-large.cnf
512Mバイト程度のメモリを持ち、MySQL専用となる機械向け
my-huge.cnf
1G~2Gバイトのメモリを持つMySQL専用サーバー向け
my-innodb-heavy-4G.cnf
4Gバイトのメモリ、InnoDBのみ、ACID、少ない接続、大量のクエリ

/etc/my.cnfを作る
cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
デフォルトUTF8で使うときの文字コードの設定をmy.cnfに追加する
/etc/my.cnf
[mysqld]
default-character-set=utf8
skip-character-set-client-handshake
character-set-server = utf8
collation-server = utf8_general_ci
init-connect = SET NAMES utf8

[mysqldump]
default-character-set = utf8

[mysql]
default-character-set = utf8

MySQL:auto_incrementが最大値まで達したとき

auto_incrementにしたカラムの型がintなら2147483647、bigintなら9223372036854775807がautoincrementの最大になる。

実際に最大値までauto_incrementを進めてみる。

 ALTER TABLE table1 AUTO_INCREMENT= 2147483647;
auto_incrementが最大値に達するともうそのテーブルには行を追加することはできなくなります。

oracleのシーケンスならCYCLEオプションがあるけどmysqlのauto_incrementにはそのような機能は無いらしい。

ではauto_incrementが最大値に達したとき、どうすればよいのか?

単純に
 ALTER TABLE table1 AUTO_INCREMENT= 1;
としても、table1に1より大きいキーが存在する限りauto_incrementは1に戻らない。
 DELETE FROM table1; --データを全部消す。
 ALTER TABLE table1 AUTO_INCREMENT= 1;
ならばauto_incrementは1に戻るので、循環シーケンスと似たような動きにするにはINSERTトリガーで

1. 対象テーブルのauto_increment値が最大に達しているかチェック。最大なら2.へ
2. 対象テーブルのデータを別テーブルに退避
3. 対象テーブルのデータをDELETE
4. ALTER TABLE~でauto_incrementを初期値に設定

という流れになるけど、INSERTの度に1.のチェックを走らせるのはちょっと嫌(1/2147483647の為に余計な処理を入れたくない)。また、退避後のデータをどう扱うかも微妙(UNIONするにしても別のキーが要るし・・・)だから
int autoincrementでキーの枯渇が心配ならbigint型にしたほうがよいと思う。
bigintの最大値は9223372036854775807。intの約42億倍もある。
これは1日に1億個のキーを消費しても2億年持つという計算になる。

MySQL:プロセスをkillする

MySQLにログインして、プロセスの一覧を表示し削除したいプロセスのIDを確認する。

SHOW PROCESSLIST;
IDを指定して削除する。
kill [ID];

php:Windows環境でphp.exe+apache+MySQLの環境を作る

php


php.netからバイナリをダウンロードする。
インストーラでもいいけど、とりあえずzipにしとく。

解凍したらフォルダごと適当なところに移動する。(以降、仮にC:\php-5.2.6-Win32に置いたと仮定して読んでください。)
フォルダの中にあるphp.ini-recommendedをコピーしてphp.iniに名前を変える

apache

apache.orgから現在の最新版Apache2.2のWindows用インストーラをダウンロード&実行する。
オプションは適当に選ぶ。

httpd.confに設定を追加する。
標準のパスでインストールしたなら、C:\Program Files\Apache Software Foundation\Apache2.2\conf\に設定ファイルhttpd.confがある。
以下の設定を追記する。
LoadModule php5_module "C:\php-5.2.6-Win32\php5apache2_2.dll"
PHPIniDir "C:\php-5.2.6-Win32"
AddType application/x-httpd-php .php
AddType application/x-httpd-php-source .phps
linux環境の”httpd configtest”に変わるコマンドは
httpd.exe -t
このコマンドを実行して”Syntax OK”が表示されることを確認する。
OKならapacheを再起動する。
httpd.exe -k restart

公開ディレクトリにtest用のphpファイルを置いて、phpが実行されていればOKです。


XdebugをWindows環境で使うには
http://pecl4win.php.net/ext.php/php_xdebug.dll
からphp_xdebug.dllをダウンロードしてエクステンションDirに保存する。

エクステンションとPEARを使う&開発環境用にphp.iniを編集する

php.ini
#pearディレクトリをinlude_pathに入れる
include_path = ".:C:\php-5.2.6-Win32\pear"

#開発用にdisplay_errorsをOnにする
display_errors = On

#extension_dirを設定する
extension_dir = "C:\php-5.2.6-Win32\ext"

#エラーログを出力する
error_log = php_error.log

拡張を有効にする。php_xdebug.dllも追記する。
extension=php_mbstring.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll

PEARを使えるようにする

1.go-pear.batを実行して適当に進める。
2.PEAR_ENV.regをダブルクリックしてレジストリに登録する。
3.環境変数pathにpear.batがあるディレクトリを追加する。
4.コマンドプロンプトで “pear list”コマンドが通ればOK。
5.プロクシ環境ならpear configにプロクシ設定を行う。
pear config-set http_proxy プロクシサーバ名:ポート番号

MySQL

mysql.comからMySQL Community ServerのWindouws用Setup.exeをダウンロードします。
ウィザードに従ってインストールします。
インストールが終わるとそのまま設定ウィザードに続くので適当に。