カテゴリー
MySQL サーバ管理

MySQL(Tritonn)を複数インストール

MySQL4.12が稼働しているサーバにMySQL5.0.67(Ttitonn)をインストールする
(MySQL4.12はYUMでインストール済)

my.cnf (MySQL4.12)

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
err-log=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

1)mecabのインストール

mecabのインストール

2)sennaのインストール

senna 1.1.4のインストール

3)インストールするのはTritonn(MySQL5.0.67)
/usr/local/mysql5にインストールする
※mecab sennaはインストール済み

wget http://iij.dl.sourceforge.jp/tritonn/36449/tritonn-1.0.12-mysql-5.0.67.tar.gz
tar xzf tritonn-1.0.12-mysql-5.0.67.tar.gz
cd tritonn-1.0.12-mysql-5.0.67
su--
./configure --prefix=/usr/local/mysql5 --localstatedir=/usr/local/mysql5/data --with-unix-socket-path=/usr/local/mysql5/data/mysql5.sock --with-tcp-port=3307 --with-charset=utf8 --with-extra-charsets=all --with-mysqld-user=mysql --with-senna --with-mecab
make
mkdir /usr/local/mysql5
make install
cd /usr/local/mysql5
mkdir /usr/local/mysql5/data
chown -R mysql:mysql /usr/local/mysql5
su mysql
./bin/mysql_install_db --datadir=/usr/local/mysql5/data

複数インストールしない場合のconfigureオプションはこんな感じ

CC='gcc' CFLAGS='-g' CXX='gcc' CXXFLAGS='-g' LDFLAGS='' ASFLAGS='' \
./configure \
'--prefix=/usr/local/mysql' \
'--localstatedir=/usr/local/mysql/data' \
'--libexecdir=/usr/local/mysql/bin' \
'--with-comment=MySQL Community Server (GPL)' \
'--with-server-suffix=' \
'--enable-thread-safe-client' \
'--enable-local-infile' \
'--enable-assembler' \
'--with-pic' \
'--with-fast-mutexes' \
'--with-client-ldflags=-static' \
'--with-mysqld-ldflags=-static' \
'--with-zlib-dir=bundled' \
'--with-big-tables' \
'--with-yassl' \
'--with-readline' \
'--with-archive-storage-engine' \
'--with-blackhole-storage-engine' \
'--with-ndbcluster' \
'--with-csv-storage-engine' \
'--with-example-storage-engine' \
'--with-federated-storage-engine' \
'--with-innodb' \
'--with-charset=utf8' \
'--with-extra-charsets=all' \
'--with-senna' '--with-mecab'

configure時に以下のエラーが出た時の対処

checking for termcap functions library... configure: error: No curses/termcap library found

curses/termcapのライブラリが無いらしい

yum install ncurses-devel

4)データベースの初期化

/usr/local/mysql/bin/mysql_install_db --user=mysql

5)初期ユーザー作成
MySQL起動後に初期ユーザーrootでログイン。
このrootはローカルから接続出来るユーザー。

初期ユーザーを全て削除し、新規ユーザーを作成する。

./bin/mysqld_safe --defaults-file=/etc/my5.cnf --pid-file=/var/run/mysqld/mysqld5.pid &
/usr/local/mysql5/bin/mysql --user=root

MySQLに接続後、既存ユーザー削除

/usr/local/mysql5/bin/mysql --user=root
mysql> TRUNCATE TABLE mysql.user;

mysql> FLUSH PRIVILEGES;

管理ユーザー作成( 管理ユーザー:root パスワード:password)

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

補足:シンボリックリンクを貼って「mysql5」でアクセスする

su --
ln -s /usr/local/mysql5/bin/mysql /usr/bin/mysql5

$ mysql5 --user=***** --password=************
でアクセス可能。

カテゴリー
MySQL プログラミング

連続で大量のデータをINSERTする実験

PERLでMySQLにデータを挿入する実験。

実験スクリプト

INSERT を100万回繰り返す。

for(1..1000000){
$sql = <<"EOM";
INSERT INTO `table_name`
(`col1`,`col2`,`col3`,`col4`) VALUES ('10','11','12','13');
EOM

$sth = $dbh->do($sql)|| die $dbh->errstr;
}

結果:途中でサーバエラー

Server error!

The server encountered an internal error and was unable to complete your request.

Error message:

Premature end of script headers: xxxx.cgi

If you think this is a server error, please contact the webmaster.

Error 500

httpd/error_logの出力:

[Fri Feb 06 20:04:00 2009] [error] [client xx.xxx.xxx.xxx] Premature end of script headers: sql.cgi

挿入されたデータ:約83万行

httpd.confの設定が、TimeOut 60によるエラーか?

カテゴリー
MySQL perl プログラミング

DBI & MySQLでカウントする

$COUNT = $dbh->selectrow_array("SELECT COUNT(*) FROM  `テーブル名` WHERE `カラム` = '条件'");
カテゴリー
MySQL perl

自分が追加した最新のauto_increment番号を取得する

$sql = "INSERT INTO `db_01` ( data1, data2 ) VALUES ( $data1, $data2 )";
$sth = $dbh->prepare( "$sql" );
$sth->execute();
$id = $sth->{mysql_insertid};

これで$idに「自分が追加した最新のauto_increment番号」が代入される

ただし下記のようにdoでは使えない。

$sql = "INSERT INTO `db_01` ( data1, data2 ) VALUES ( $data1, $data2 )";
$sth = $dbh->do( "$sql" );
$id = $sth->{mysql_insertid};
カテゴリー
MySQL

MySQLの複合インデックス注意点

インデックスには、複数の列に対してまとめて設定する複合インデックスという種類がある。
検索条件に複数列を指定する場合などでは、単一カラムのインデックスよりも複合インデックスの方が高速な検索を行うことが出来る。

複合インデックスを作成するには、CREATE INDEXを使用。下記では、テーブル名tbl_nameのcol1、col2カラムに、col1and2という複合インデックスを作成する。


CREATE index_name ON tbl_name (col1, col2)


作成した複合インデックスを利用するのに特別な構文はなく、下記のようなSELECT文で複合インデックスが自動的に使われる。

SELECT * FROM tbl_name
WHERE col1=1 AND col2=1;

複合インデックスにはいくつかの利用制限があり、最初に指定したカラムを検索対象にする場合は有効となりますが、最初に指定したカラムを検索条件に含まなかったり、順番が違っていたりする場合などは無効になる。また、カラムとカラムをORで検索する場合は複合インデックスが無効になる。

追記:

最初に指定したカラムを検索対象にする場合は有効となりますが、最初に指定したカラムを検索条件に含まなかったり、順番が違っていたりする場合などは無効になる。

どうも5.0以降のバージョンでは動作が違う気がする。

最初に指定したカラムでなくてもインデックスが使われるような。。。

下記のSELECT文では、最初と2番目のクエリがインデックスを使用できる。

# 複合インデックスが有効
... WHERE col1=1;
... WHERE col1 AND col2=1;
... WHERE col1 AND (col2=1 OR col2=2);


# 複合インデックスが無効
... WHERE col1=1 OR col2=1;
... WHERE col2=1 AND col1=1;
... WHERE col2=1;
... WHERE col2=1 AND col3=1;

col2だけの検索もインデックスを利用したい場合は、col2のインデックスを別に作成する事。


参考になるURL:
http://www.res-system.com/weblog/item/550