たくさんのホストを一人で管理したいけどメールが錯乱

VMWareで管理してるFreeBSDのホストが7台。
その他FreeBSDの独立ホストが5台とか6台とか。
im using NFS.
DA ☆ KA ☆ RA
メールを簡単に管理したいです安西先生。
各マシンのうち一台、いや二台がメールサーバとして稼働中(Courier-mta)。
他はsendmailが稼働。
ホームディレクトリに.forwardを記述すればひとまず一般のユーザは一つのメールアドレスに集約できる。
ついでにNFSが有効であれば一つのファイルだけで複数台のメールアドレスを転送させることができる。
大切なのはroot宛のメール。
これは/etc/aliasesを書き換えて転送。
sendmailを再起動すればおk。

aliasesの警告文

The program “newaliases” must be run after this file is updated for any changes to show through to sendmail.

newaliasesをかけないとだめらしい。


PHPからMDB2を使ってのSQL実行エラーというかワーニングというか

Warning: preg_match() expects parameter 2 to be string, object given in /usr/local/share/pear/MDB2/Driver/mysql.php on line 655
function _modifyQuery($query, $is_manip, $limit, $offset)
{
if ($this->options[‘portability’] & MDB2_PORTABILITY_DELETE_COUNT) {
// “DELETE FROM table” gives 0 affected rows in MySQL.
// This little hack lets you know how many rows were deleted.
if (preg_match(‘/^\s*DELETE\s+FROM\s+(\S+)\s*$/i’, $query)) {
$queryにpear_errorなオブジェクトが来てるくさい。バグじゃねーの?

FreeBSDではPortsからインストールするとデフォルトで/var/db/mysqlに設定される.
/varはログ用,と思って容量を割り当てているため,あっという間にいっぱいになってしまう.
変更する方法
mysqldを止める
# mysqladmin -p shutdown
->/usr/local/etc/rc.d/mysql-server stopでもおk?
新しくディレクトリを作成し,/var/db/mysqlをコピーする
念のため,古いディレクトリをリネーム
# mkdir /usr/local/db
# cp -Rp /var/db/mysql /usr/local/db/mysql
# mv /var/db/mysql /var/db/mysql.old
/etc/rc.confに以下の行を追加
mysql_dbdir=”/usr/local/db/mysql”
/etc/my.cnf[mysqld]のセクションに以下の行を追加
datadir = /usr/local/db/mysql
再起動
# reboot
->再起動だとまずいのでmysqlを起動
きちんと動いていることを確認.
別解
リンクを張るという手もある
ln -s /usr/local/db/mysql /var/db/mysql
こっちのが手軽
http://d.hatena.ne.jp/sleepy_yoshi/20070720/p3
トラックバックってこういう為にあるのかな。使い方わかんねー。

大きなSQLを実行する際(インポート)

mysql> set max_allowed_packet=640000000;
Query OK, 0 rows affected (0.01 sec)
mysql> set global max_allowed_packet=64000000;
Query OK, 0 rows affected (0.00 sec)
mysql> source kimama.sql
Query OK, 0 rows affected (0.00 sec)
Query OK, 0 rows affected, 1 warning (0.01 sec)
ERROR 1153 (08S01): Got a packet bigger than ‘max_allowed_packet’ bytes
ERROR 1153 (08S01): Got a packet bigger than ‘max_allowed_packet’ bytes
mysql> \q
Bye
%mysql –max_allowed_packet=300M hoge -p < hoge.sql Enter password: mysqlのインタフェースからじゃ言うことを聞いてくれないが、なぜかunixのcuiからのリダイレクトならうまくいく。恐らくtcpのどでかいパケットを一括でfragmentをたてて送ろうとしてるような。 そして最後にこんなオチ。 /var: write failed, filesystem is full

右辺にNULL値が存在したらIN述語がうまくうごかない

NOT INを使おうとしても右辺に不定(NULL値)が存在するとうまく動きません。EXISTSならうまく動いたりします。なぜならばEXISTS述語はANY,ALL限定述語と違い、右辺に不定(NULL値など)があったとしても行を返すか否かにより判定を行うことができるからです。
9.16.1. EXISTS
EXISTS (subquery)
EXISTSの引数は、任意のSELECT文または副問い合わせです。副問い合わせはそれが何らかの行を返すか否かの決定のために評価されます。もし1つでも行を返すのであれば、EXISTSの結果は”真”となり、副問い合わせが行を返さない場合、EXISTSの結果は”偽”となります。
9.16.5. ALL
expression operator ALL (subquery)右辺は括弧で括られた副問い合わせで、正確に1つの列を返さなければなりません。左辺の式は副問い合わせの結果行それぞれに対して、指定されたoperatorを使用して評価、比較されます。なお、operatorは結果として論理値を生成する必要があります。(副問い合わせが行を返さない特別な場合を含む)全ての行が真になる場合、ALLの結果は”真”です。1つでも偽の結果があると、結果は”偽”です。比較がすべての行で偽を返さず、かつ、少なくとも1つの行でNULLを返した場合、結果はNULLとなります。
NOT INは<> ALLと等価です。
http://www.postgresql.jp/document/current/html/functions-subquery.html

PostgreSQLにおける列とかの名前規則とかとか

PostgreSQLは大文字と小文字を認識できるっぽい。
今まですべてのデータベースが列名などは全部小文字に変換してやるって思ってた(恐らくそれはOracleでどこかのHPで見たのだろう)。
大文字とか(特殊な文字)で列名などを指定する場合にはダブルクォートで囲めばいいっぽい。
つまり下記の二行は意味が違うってこった。
ALTER TABLE tbl1 ADD COLUMN pk integer;
ALTER TABLE tbl1 ADD COLUMN “PK” integer;

courierのブラックリストに入れられてしまった場合の対処

1. Courierのブラックリスト

Courierにはブラックリスト機能が備わっている。存在しないメールアドレスに何度もメールを送ったり、ループしたり、maildropの設定をミスっていたりすると、当該メールアドレスへのメールをしばらくの間ブロックしてしまうらしい。
courierでメールの配送テスト中などに、User Unknownとかでメールの配送ミスが連発してしまい、コネクションを確立して宛先を伝えた瞬間にService unavailableとか言われてしまう。コネクションを確立して宛先を、というのは、手動でsmtpをやりとりした際、RCPT TOを入れた後に拒否されてしまう。

shell> grep 456 /var/log/maillog
Oct 27 15:39:20 mailhost courieresmtpd: error,relay=192.168.1.1,from=,to=: 456 Address temporarily unavailable.

ちなみに、この”Address temporarily unavailable.”というエラーメッセージに対するエラーコード、456なんだけれど、smtp over SSLのデフォルトポート番号465と混同してしまいそう。 続きを読む courierのブラックリストに入れられてしまった場合の対処