カテゴリーアーカイブ: SQL

apache2、mysqlはyumでインストール済みの前提で。

http://www.outoforder.cc/projects/apache/mod_log_sql/

ソースファイルをダウンロードして、インストールします。

# wget http://www.outoforder.cc/downloads/mod_log_sql/mod_log_sql-1.101.tar.bz2
# tar jxvf mod_log_sql-1.101.tar.bz2
# cd mod_log_sql-1.101
# ./configure
# make
# make install

設定を追加します。

# vi /etc/httpd/conf.d/mod_log_sql.conf
LoadModule      log_sql_module          modules/mod_log_sql.so
LoadModule      log_sql_mysql_module    modules/mod_log_sql_mysql.so

VirtualHostに記述できるようです。

# vi /etc/httpd/vhost.conf

  # DBアクセス情報
  LogSQLLoginInfo mysql://ユーザ名:パスワード@localhost/apache2_log
  # テーブルをつくります
  LogSQLCreateTables on
  # MySQLのソケット指定
  LogSQLDBParam socketfile /var/lib/mysql/mysql.sock
  # 記録するテーブル名
  LogSQLTransferLogTable access_logs

アクセスログを記録するデータベースをつくります。

mysql> create database apache2_log default character set utf8;

ブラウザからアクセスしてデータベースを確認します。

mysql> select count(*) from access_logs;
mysql> desc access_logs;
+------------------+----------------------+------+-----+---------+-------+
| Field            | Type                 | Null | Key | Default | Extra |
+------------------+----------------------+------+-----+---------+-------+
| id               | char(19)             | YES  |     | NULL    |       |
| agent            | varchar(255)         | YES  |     | NULL    |       |
| bytes_sent       | int(10) unsigned     | YES  |     | NULL    |       |
| child_pid        | smallint(5) unsigned | YES  |     | NULL    |       |
| cookie           | varchar(255)         | YES  |     | NULL    |       |
| machine_id       | varchar(25)          | YES  |     | NULL    |       |
| request_file     | varchar(255)         | YES  |     | NULL    |       |
| referer          | varchar(255)         | YES  |     | NULL    |       |
| remote_host      | varchar(50)          | YES  |     | NULL    |       |
| remote_logname   | varchar(50)          | YES  |     | NULL    |       |
| remote_user      | varchar(50)          | YES  |     | NULL    |       |
| request_duration | smallint(5) unsigned | YES  |     | NULL    |       |
| request_line     | varchar(255)         | YES  |     | NULL    |       |
| request_method   | varchar(10)          | YES  |     | NULL    |       |
| request_protocol | varchar(10)          | YES  |     | NULL    |       |
| request_time     | char(28)             | YES  |     | NULL    |       |
| request_uri      | varchar(255)         | YES  |     | NULL    |       |
| request_args     | varchar(255)         | YES  |     | NULL    |       |
| server_port      | smallint(5) unsigned | YES  |     | NULL    |       |
| ssl_cipher       | varchar(25)          | YES  |     | NULL    |       |
| ssl_keysize      | smallint(5) unsigned | YES  |     | NULL    |       |
| ssl_maxkeysize   | smallint(5) unsigned | YES  |     | NULL    |       |
| status           | smallint(5) unsigned | YES  |     | NULL    |       |
| time_stamp       | int(10) unsigned     | YES  |     | NULL    |       |
| virtual_host     | varchar(255)         | YES  |     | NULL    |       |
| bytes_in         | int(10) unsigned     | YES  |     | NULL    |       |
| bytes_out        | int(10) unsigned     | YES  |     | NULL    |       |
+------------------+----------------------+------+-----+---------+-------+

テーブルはどうなっているのだろう。

mysql> show table status\G
           Name: access_logs
         Engine: MyISAM
        Version: 10
     Row_format: Dynamic
           Rows: 11
 Avg_row_length: 176
    Data_length: 1940
Max_data_length: 281474976710655
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2009-06-01 20:22:14
    Update_time: 2009-06-01 20:26:17
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:

ほうほう。自動で作られるとMyISAMになるようだ。

他にも設定できる。

これを設定しないと日毎うん百万リクエストのサーバはレコードがうん百万できちゃいます。

LogSQLRequestAccept .html .jpg .gif .png
LogSQLRequestIgnore .exe .ico .php

SetEnvIf、SetEnvIfNoCaseと同じような動きになります。正規表現使えないのかな?

LogFormatみたいなことをやりたい場合は、

LogSQLTransferLogFormat StUR

この場合は、unixtime・いつもの日付・リクエスト部分のみ・リファラ、がレコードに記録されます。

スキーマ情報みたらフィールドはすべて持っていて、設定したフィールドだけ記録されている。ほかのフィールドはNULLで記録。

LogSQLTransferLogFormatの内容。

この内容は公式のドキュメントにもあります。

A User agent agent varchar(255) Mozilla/4.0 (compat; MSIE 6.0; Windows)
a CGI request arguments request_args varchar(255) user=Smith&cart=1231&item=532
b Bytes transfered bytes_sent int unsigned 32561
c Text of cookie $^{\textrm{1}}$ cookie varchar(255) Apache=sdyn.fooonline.net.1300102700823
H HTTP request protocol request_protocol varchar(10) HTTP/1.1
h Name of remote host remote_host varchar(50) blah.foobar.com
I Request ID (from mod_unique_id) id char(19) POlFcUBRH30AAALdBG8
l Ident user info remote_logname varchar(50) bobby
M Machine ID $^{\textrm{2}}$ machine_id varchar(25) web01
m HTTP request method request_method varchar(6) GET
P httpd child PID child_pid smallint unsigned 3215
p httpd port server_port smallint unsigned 80
R Referer referer varchar(255) http://www.biglinks4u.com/linkpage.html
r Request in full form request_line varchar(255) GET /books-cycroad.html HTTP/1.1
S Time of request in UNIX format time_stamp int unsigned 1005598029
s HTTP status of request status smallint unsigned 404
T Seconds to service request request_duration smallint unsigned 2
t Time of request in human format request_time char(28) [02/Dec/2001:15:01:26 -0800]
U Request in simple form request_uri varchar(255) /books-cycroad.html
u User info from HTTP auth remote_user varchar(50) bobby
v Virtual host servicing the request virtual_host varchar(50) www.foobar.com

あとはパフォーマンスが気になるところ。

これでもしapacheが捌けるリクエストが1/10とかなったらorz

実用に耐えられるかちゃんと計測しておこう。

wget http://nchc.dl.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz
tar zxvf MySQL-python-1.2.2.tar.gz
vi site.cfg
mysql_config = /usr/bin/mysql_config

python setup.py build
python setup.py install

update テーブル名 set カラム名 = replace(カラム名,’置換対象文字列’,'置換後文字列’);

よく聞かれるのでメモっておきます。

たとえばProductIDが0001〜9999のユニークな連番にしたいとする。
普通なら、

ProductID serial

で十分なのだが、どうしても0001,0002…としたいらしい。

いろいろやり方はあると思うが、こんな感じでどう?

CREATE SEQUENCE test_ProductID_seq;
CREATE TABLE test (
ProductID char(4) default to_char(nextval(‘test_ProductID_seq’),’FM0000′)),


PRIMARY KEY (ProductID)
);
CREATE UNIQUE INDEX test_ProductID_key on test (ProductID);

なんかもっと良いやりかたあったら教えてください。

http://www.postgresql.org/よりクライアントをダウンロードする。
http://www.postgresql.org/ftp/のwin32ディレクトリからダウンロードできます。(現時点でv8.0.3)
postgres-x.x.x-ja.zipというファイルが日本語になっています。

先にpostgres用のユーザーを作成しておく。
解凍したファイルの*.msiを実行する。

作成しておいたpostgres用ユーザーとパスワードを入力して進めていく。
自動的にinit_dbされて完了。

ODBCドライバとかもインストールされていました。

データベースの操作はGUIのpgAdmin、もしくはコマンドラインのpgsqlで操作する。

MySQLの時と同じように、Perl,PHP,ASP,JSPなどで接続テストしてみる。

#ふと思ったのだけど、スクリーンショットとかあったほうがわかりやすいよね?

簡単に流れを書き留めておきます。

ここからWindows版をダウンロード。

解凍したファイルのSETUP.EXEを起動。
デフォルトでインストールを進める。

rootのパスワードを設定して完了。

ここからODBCドライバをダウンロード。
ダウンロードした*.exeまたは*.msiを実行して完了。

データベースの操作はLinuxとかと同じようにコマンドラインで操作する。

一応、win版MySQL Adminも使えるのでここからダウンロードして設定します。

あとはPerl,PHP,ASP,JSPで接続テストしてみるといいかも。

今回MySQL5を入れる目的は、噂のストアドプロシージャを試してみたかったのですよ。
MySQL4.x系はまたあとで。

ミラーサイトからダウンロード
http://download.softagency.net/MySQL/downloads/mysql/5.0.html

Tarball 5.0.3-betaをコンパイルしてインストール

wget http://download.softagency.net/MySQL/Downloads/MySQL-5.0/mysql-5.0.3-beta.tar.gz

#Unicodeに対応しているのでUTF-8を指定
#–with-charsets=utf8
./configure –prefix=/usr/local/mysql5 –with-charset=utf8 –with-extra-charsets=all –with-mysqld-user=mysql
make
make install

データベースの初期化して以前の設定ファイルを参考に新しい設定ファイルを作成

./scripts/mysql_install_db –user=mysql
mv /etc/my.cnf /etc/my–.cnf
cp ./support-files/my-medium.cnf /etc/my.cnf
vi /etc/my.cnf // 設定を変更する
# ディレクトリのオーナーをmysqlにする
chown -R mysql.mysql /usr/local/mysql5

データベースの起動

/usr/local/mysql5/bin/mysqld_safe –user=mysql &

予めdumpしておいたバックアップをリカバリ。
ついでに自動起動スクリプトも変更しておく。

./support-files/mysql.server /etc/init.d/rc.mysql

rootのパスワードを設定

mysqladmin -u root password ‘パスワード’
mysqladmin reload

データベースからユーザー・パスワードが空のものはDELETEしておく。

PHPやらJavaから使うには再度これらをコンパイルしなきゃならないが、とりあえず今はやらない方向で。

ん~なんでMySQLはコンパイルするのに時間がかかるんだろう…そんなわけでストアドプロシージャを試すのはまた今度。

postgreSQL8.0をインストールしてみました。

まず現在のデータベースをバックアップ。
pg_dumpで個別にするか、pg_dumpallで全てダンプするか迷う。
とりあえず両方でバックアップ。

最新のアーカイブをダウンロードしてくる。
http://www.postgresql.org/

downloads→FTP Browser→v8.0.1→postgresql-8.0.1.tar.gz

コンパイルしてインストール。
データベースを初期化したらバックアップしたデータをインポート。
ついでにPHPも再コンパイルしてsslに対応させてみた。

特に目立った問題も無く終了。

JAVAで接続するための準備
# export JAVA_HOME=/usr/local/j2sdk
# export ANT_HOME=/usr/local/ant
# export PATH=$PATH:$JAVA_HOME/bin:$ANT_HOME/bin
# export CLASSPATH=$CLASSPATH:$ANT_HOME/lib/ant.jar

postgres用のユーザーを作る。
# useradd postgres //通常はpostgres

コンパイルしてインストール。java使うので –with-java
# ./configuer --with-java
# make
# make check
# make install

postgresのパスを通しておく。
# export PATH=$PATH:/usr/local/pgsql/bin
# export POSTGRES_HOME=/usr/local/pgsql
# export PGLIB=$POSTGRES_HOME/lib
# export PGDATA=$POSTGRES_HOME/data
# export MANPATH=$MANPATH:$POSTGRES_HOME/man
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGLIB

データベースの初期化
# /usr/local/pgsql/bin/initdb --encoding=EUC_JP -D /usr/local/pgsql/data

postgresql.confを修正
vi posgresql.conf
tcpip_socket = true
syslog = 2
syslog_facility = 'LOCAL0'

サーバー起動時に立ち上がるように起動スクリプトを作っておくと便利

postgresの起動
# pg_ctl start -l logfile
postgresの停止
# pg_ctl stop

mysqlのユーザーを作る
# groupadd mysql
# adduser -g mysql -d /usr/local/var mysql

コンパイルしてインストール
# ./configure \
--prefix=/usr/local/mysql \
--with-charset=ujis \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--without-bench \
--localstatedir=/usr/local/mysql/data
# make
# make install

データベースの初期化
# ./scripts/mysql_install_db --user=mysql
# chown -R mysql /usr/local/mysql/data
# chgrp -R mysql /usr/local/mysql/data

起動スクリプトの設定
# cp /usr/local/src/mysql-3.23.58/support-files/mysql.server /etc/rc.d/init.d/rc.mysql
# cp /usr/local/src/mysql-3.23.58/support-files/my-***.cnf /etc/my.cnf
# chmod 755 /etc/rc.d/init.d/rc.mysql
# ln -s /etc/rc.d/init.d/rc.mysql /etc/rc.d/rc0.d/K13mysql
# ln -s /etc/rc.d/init.d/rc.mysql /etc/rc.d/rc3.d/S90mysql
# ln -s /etc/rc.d/init.d/rc.mysql /etc/rc.d/rc5.d/S90mysql

起動
# /usr/local/mysql/bin/safe_mysqld --user=mysql &

ルートのパスワードは変更しておく
# /usr/loca/mysql/bin/mysql
$ mysql> set password for root=password('パスワード');
$ mysql> quit

DBがローカルにあるなら接続はローカル限定にするといいかも。
通常つかうためのユーザーも作成しておく。