2009年9月16日水曜日

MySQLのALTER TABLE構文のまとめ

こんばんわ、俺@家でまったり中です。
今日は、プログラマがよく使うであろうMySQL(ver5.x)のALTER TABLE構文についてメモします。
ALTER TABLE構文はMySQLのテーブルの構造を変更する時に使います。

1)カラムを追加
mysql> ALTER TABLE [テーブル名] ADD COLUMN [カラム名] [型] [制約] [FIRST | AFTER カラム名]
最後の[FIRST|AFTER カラム名]はなくてもOK。
例:
msql> ALTER TABLE table_name ADD COLUMN name VARCHAR(64) NOT NULL DEFAULT ''

2)カラムを削除
mysql> ALTER TABLE [テーブル名] DROP COLUMN [カラム名]

3)テーブル名変更
mysql> ALTER TABLE [テーブル名] RENAME TO [新テーブル名]

4)カラムの型を変更
mysql> ALTER TABLE [テーブル名] MODIFY [カラム名] [型] [制約]
または
mysql> ALTER TABLE [テーブル名] CHANGE COLUMN [カラム名] [新カラム名] [型] [制約]

5)カラム名を変更
mysql> ALTER TABLE [テーブル名] CHANGE COLUMN [カラム名] [新カラム名]

6)インデックスを追加
mysql> ALTER TABLE [テーブル名] ADD INDEX [インデックス名] ([カラム名,...])
または
mysql> CREATE INDEX [インデックス名] ON [テーブル名] ([カラム名,...])

7)インデックスを削除
mysql> ALTER TABLE [テーブル名] DROP INDEX [インデックス名]
または
mysql> DROP INDEX [インデックス名] ON [テーブル名]

8)AUTO_INCREMENTの値を変更
mysql> ALTER TABLE [テーブル名] AUTO_INCREMENT = [値]

9)テーブルの使用しているエンジン(ENGINE)を変更
mysql> ALTER TABLE [テーブル名] ENGINE = [ENGINE名]

10)テーブルのデフォルト文字セットを変更
mysql> ALTER TABLE [テーブル名] DEFAULT CHARSET = [文字コード名]

11)デフォルト値を変更
mysql> ALTER TABLE [テーブル名] ALTER COLUMN [カラム名] SET DEFAULT [デフォルト値]

12)デフォルト値を削除
mysql> ALTER TABLE [テーブル名] ALTER COLUMN [カラム名] DROP DEFAULT

詳しくはMySQL::5.1マニュアル ALTER TABLE構文をば。

以上どぇぇぇぇーす。

2009年9月9日水曜日

mmeasureのインストール

どうも、俺@仕事中、2度目の投稿です。
決して暇な訳ではありませんよ。

mmeasureのインストールについて覚書き。
インストールは至って簡単シンプルです。
まずはmmeasure projectからソースをダウンロード。2009年9月9日時点でのバージョンは1.0.7でした。

次に解凍
# tar zxvf mmeasure-1.0.7.tar.gz
出てきたディレクトリを/usr/local下(デフォルト)へ移動
# mv mmeasure/ /usr/local
# cd /usr/local/mmeasure


perlのモジュールをインストールします。
cpanについてはオデの日記@cpanモジュールを見てね。
# cpan install Socket
# cpan install DBI // ←MySQLを起動させてないとダメっぽい
# cpan install Jcode
# cpan install DBD::mysql // ←ココでずっこける
RRDsモジュールはrrdtoolをインストールすればOKの模様。
# wget 'http://oss.oetiker.ch/rrdtool/pub/rrdtool-1.0.x/rrdtool-1.0.49.tar.gz'
# tar zxvf rrdtool-1.0.49.tar.gz
# rrdtool-1.0.49
# ./configure
# make
# make install // ←ついでにrrdtoolインスト
# cd /usr/local/src/rrdtool-1.0.x/perl-shared
# perl Makefile.PL
# make && make install
で、DBD::mysqlですが、何をどう頑張ってもインストールできませんでした。
同じくインストールできなかったけど、頑張ればインストできた人がいれば解決方法を教えて下さい。
とりえずyumで
# yum install perl-DBD-MySQL
で何とかインスト。

設定ファイルを修正
# cp mmeasure_template.conf mmeasure.conf
# vim mmeasure.conf
で、この設定ファイルを色々変更します。デフォルトの設定ファイルには間違いもあるので必ず修正します。
#------------------
# MySQL
#------------------

MYSQL_HOST=[MySQLのIP]
MYSQL_USER=mmeasure # あとでmmeasureユーザを追加します。
MYSQL_PASSWORD=password # 接続パスワード
MYSQL_PORT=3306
MYSQL_SOCKET=/tmp/mysql.sock
MYSQL_SLOW_QUERY_LOG="/usr/local/mysql/var/mysql-slow" # スローログのPATH。ない場合はコメントアウトで
#------------------
# Mail
#------------------

MAIL_HOST=foo.com # 自サーバホスト名
MAIL_FROM=info@foo.com # 実在するアカウントで!
MAIL_TO=bar@tohost.com
#MAIL_CC= # いらん!
#MAIL_BCC= # いらん!
MAIL_SUBJECT="alert" # メールの件名を適当に。
#------------------
# Pathes
#------------------

PATH_RRDTOOL="/usr/local/rrdtool-1.0.49/bin/rrdtool" # パスが違う場合は修正
#------------------
# Web setting
#------------------

WEBDIR="$PATH_MEASURE/web/images/graphs" # /imagesを追加!
WIDTH_SMALL="200" # 追加!
HEIGHT_SMALL="100" # 追加!
WIDHT_LARGE="400" # 追加!
HEIGHT_LARGE="100" # 追加!

次にMySQLサーバにmmeasureユーザの追加です。僕の環境ではローカル接続の別サーバにMySQLがあったので
# mysql -h 192.168.0.2 -u mysql
mysql> GRANT ALL ON *.* to mmeasure@192.168.0.1 indentified by 'password';
mysql> SET password FOR mmeasure@192.168.0.1 = old_password('password'); // ←MySQL4.1以前の互換
mysql> FLUSH PRIVILEGES;
でOK。一応接続テストもしておく。
# mysql -h 192.168.0.2 -u mmeasure -p
Enter password: パスワード入力


次に、MySQLのデータを取るために./mmeasure/daemon/data-mysql/read-data.plを修正します。ココはだいぶハマったのですが、クエリ回数、クエリ比率などを表示するために変更するべきです。
# vim ./mmeasure/daemon/data-mysql/read-data.pl
50 my %status = select_2column( $db, "show global status" ); # globalを追加

あと、僕の場合ですが、mmeasure.errでアラートメール送信時のエラーが出まくっていたのでメール送信処理部分をコメントアウトしました。アラートはNAGIOSとかで監視してるので、、、。
# vim ./mmeasure/daemon/daemon-mmeasure.pl
224 # alerter_sendmail( $conf{ 'MAIL_HOST' },
225 # $conf{ 'MAIL_TO' }, $conf{ 'MAIL_FROM' },
226 # $conf{ 'MAIL_SUBJECT' }, $alert_message,
227 # $conf{ 'MAIL_CC' }, $conf{ 'MAIL_BCC' } );
なんでエラーが出るのか謎です。時間があるときに調査します。分かる方いたら教えてください><
エラー内容
# vim ./mmeasure/daemon/log/mmeasure.err
52 RCPT command failure(Bad file descriptor)... at ../library/mailer.pl line 93.
53 print() on closed filehandle SH at ../library/mailer.pl line 127 (#1)
54 (W closed) The filehandle you're printing on got itself closed sometime
55 before now. Check your control flow.
56
57 readline() on closed filehandle SH at ../library/mailer.pl line 128 (#2)
58 (W closed) The filehandle you're reading from got itself closed sometime
59 before now. Check your control flow.
60
61 Use of uninitialized value in substitution (s///) at ../library/mailer.pl line
62 205 (#3)
63 (W uninitialized) An undefined value was used as if it were already
64 defined. It was interpreted as a "" or a 0, but maybe it was a mistake.
65 To suppress this warning assign a defined value to your variables.
66
67 To help you figure out what was undefined, perl tells you what operation
68 you used the undefined value in. Note, however, that perl optimizes your
69 program and the operation displayed in the warning may not necessarily
70 appear literally in your program. For example, "that $foo" is
71 usually optimized into "that " . $foo, and the warning will refer to
72 the concatenation (.) operator, even though there is no . in your
73 program.
74
75 Use of uninitialized value in pattern match (m//) at ../library/mailer.pl line
76 130 (#3)
77 print() on closed filehandle SH at ../library/mailer.pl line 132 (#1)
78 DATA command failure(Bad file descriptor)... at ../library/mailer.pl line 134.
79 print() on closed filehandle SH at ../library/mailer.pl line 143 (#1)
80 readline() on closed filehandle SH at ../library/mailer.pl line 144 (#2)
81 Use of uninitialized value in pattern match (m//) at ../library/mailer.pl line
82 146 (#3)
83 print() on closed filehandle SH at ../library/mailer.pl line 148 (#1)
84 Body & header send failure(Bad file descriptor)... at ../library/mailer.pl line 150.
85 print() on closed filehandle SH at ../library/mailer.pl line 156 (#1)

次はApacheにAliasを作ります。
# vim /usr/local/apache2/conf/httpd.conf
Alias /mmeasure "/usr/local/mmeasure/web"

# /usr/local/apache2/bin/apachectl restart

ではデーモンの起動!
# ./mmeasure/daemon/mmeasure.sh start


以上~!あとはチューニングアドバイスを信じるも信じないもアナタ次第!

MySQLで再起動せずに設定変更

こんちわ、俺@仕事中です。
周知の事実すぎるかもしれませんが、MySQLの設定(通常はmy.cnfに書かれてあるもの)を再起動せずに変更する方法について。

mysql> SET GLOBAL <変数名>=<値>
または
mysql> SET @@global.<変数名>=<値>
で設定を変更できます。
例えば、query_cache_sizeを1MBに変更する場合
mysql> SET GLOBAL query_cache_size=1048576;

で変更できます。

変更後は必ずmy.cnfの値を変更する事を忘れずに!じゃないと、MySQLがいつか再起動した後元に戻っちゃいますよー。



以上どぇ~す。

2009年9月8日火曜日

Linuxで"-"ハイフンから始まるファイルの削除

どうも、俺@仕事中です。
今日は滅多に起こりえない"-"ハイフンから始まるファイルの削除について。

そもそもハイフンから始まるファイルを作成する事はないと思います。
$ touch -a
touch: file arguments missing
Try `touch --help' for more information.

ただ、vimでファイルを修正中などに
:w -a
などとタイプミスすると、「-a」というファイルが出来上がってしまいます。
$ ls -l
total 64
-rw-r--r-- 1 user group 0 Sep 8 10:29 -a

これを頑張って削除しよとしても
$ rm -a
rm: invalid option -- a
Try `rm --help' for more information.
$ rm "-a"
rm: invalid option -- a
Try `rm --help' for more information.
$ rm \-a
rm: invalid option -- a
Try `rm --help' for more information.
削除できません。

そんな時は"--"ハイフン二つ付けて
$ rm -- -a
とすれば削除できちゃうよ!
というお話。

2009年9月1日火曜日

MySQLのCASE構文

どうも、俺@残業中です。
忘れないために備忘録。

MySQLはCASE構文が使えるようになっています。
mysql> SELECT CASE WHEN 1=1 THEN 'true' ELSE 'FALSE' end;
+--------------------------------------------+
| case when 1=1 then 'true' else 'false' end |
+--------------------------------------------+
| true |
+--------------------------------------------+
1 row in set (0.00 sec)
となります。

構文は
CASE WHEN <条件式> THEN <真の場合> ELSE <偽の場合> END;
です。

応用して、例えば別テーブル(B)に自テーブル(A)を参照しているカラム(a_id)があり、BテーブルがAテーブルを参照しているデータを`refered`として取得する場合は
mysql> SELECT
CASE WHEN a_id>0 THEN 'refered' ELSE 'no refered' END
FROM A INNER JOIN B ON A.id=B.a_id;
で取得できます。

さらに拡張して、AテーブルのデータがBテーブルに参照されていた場合に、Aテーブルの`refered`カラムを`refered`、そうでない場合を`no refered`と更新したい場合は
mysql> UPDATE A INNER JOIN B ON A.id=B.a_id
SET refered= CASE WHEN a_id > 0 THEN 'refered' ELSE 'no refered' END;
のように、MySQLのUPDATE文+JOIN句でできます。

以上どえす。