EC2 に MySQL (InnoDB Plugin + Q4M) インストールからセットアップまで

インスタンス:m1.small
対象 OS:Ubuntu 9.04

apt で入る MySQL は 5.1.31 とちょっと古いので、MySQL 公式で配布しているバイナリを利用しました。備忘録です。

前準備

ユーザー作成

UID/GID などは Ubuntu 9.04 の MySQL パッケージのトリガースクリプトが作成するものに合わせました。

sudo addgroup --gid 109 mysql
sudo adduser --home /var/lib/mysql --shell /bin/false --no-create-home --uid 105 --gecos 'MySQL Server' --gid 109 --disabled-password --disabled-login mysql
ログ・その他ディレクト
mkdir /var/log/mysql
chown mysql.adm /var/log/mysql
chmod 2750 /var/log/mysql
mkdir /var/run/mysqld
chown mysql /var/run/mysqld

ダウンロード

wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-devel-5.1.49-1.glibc23.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-shared-5.1.49-1.glibc23.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-client-5.1.49-1.glibc23.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/MySQL-server-5.1.49-1.glibc23.i386.rpm/from/http://ftp.iij.ad.jp/pub/db/mysql/

インストール

本体

MySQL のオフィシャルバイナリには Ubuntu 用の deb パッケージは用意されていませんので、aliendeb に変換してインストールします。

sudo alien -i MySQL-devel-5.1.49-1.glibc23.i386.rpm
sudo alien -i MySQL-shared-5.1.49-1.glibc23.i386.rpm
sudo alien -i MySQL-client-5.1.49-1.glibc23.i386.rpm
sudo alien -i MySQL-server-5.1.49-1.glibc23.i386.rpm
InnoDB Plugin

InnoDB Plugin のライブラリは Generic Linux 向け RPM 版パッケージには入っていませんので、適当に SuSE 向けパッケージから抜き出します。
認識されて動いたかのように見えましたが、InnnoDB Plugin のテーブルを CREATE したら落ちました。ソースコンパイルで入れましょう。

Q4M
cd /tmp/
wget http://dev.mysql.com/get/Downloads/MySQL-5.1/mysql-5.1.49.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
wget http://q4m.31tools.com/dist/q4m-0.9.4.tar.gz
tar xfz mysql-5.1.49.tar.gz
tar xfz q4m-0.9.4.tar.gz
ln -s ../libmysqlclient.so /usr/lib/mysql/
cd q4m-0.9.4/
CPPFLAGS=-I/usr/include/mysql ./configure --with-mysql=/tmp/mysql-5.1.49/
make
make install
mysql -u root < support-files/install.sql

設定

DB 初期化

参考:2.10. インストール後の設定とテスト

mysql_install_db --user=mysql
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH GRANT OPTION"
mysqladmin -u root password '********'

debian-sys-maint ユーザーのパスワードは後述のログローテート時の mysqladmin flush-logs 時に使いますので、/etc/mysql/debian.cnf に記載したものと合わせてください。

innodb_file_per_table 用
echo fs.file-max=8000 >> /etc/sysctl.conf
システム用
cat > /etc/mysql/debian.cnf <<EOF
[client]
host     = localhost
user     = debian-sys-maint
password = XXXXXXXX
socket   = /var/run/mysqld/mysqld.sock
[mysql_upgrade]
host     = localhost
user     = debian-sys-maint
password = XXXXXXXX
socket   = /var/run/mysqld/mysqld.sock
basedir  = /usr
EOF

chmod 0600 /etc/mysql/debian.cnf
グローバル設定
cat > /etc/mysql/my.cnf <<EOF
[client]
port        = 3306
socket      = /var/run/mysqld/mysqld.sock
default-character-set = utf8

[mysqld_safe]
socket      = /var/run/mysqld/mysqld.sock
nice        = 0

[mysqld]

# basic
user        = mysql
port        = 3306
log-error   = /var/log/mysql/error.log
socket      = /var/run/mysqld/mysqld.sock
pid-file    = /var/run/mysqld/mysqld.pid
basedir     = /usr
datadir     = /var/lib/mysql
tmpdir      = /tmp

skip-external-locking
character-set-server = utf8
default_storage_engine = InnoDB
slow_query_log
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log-queries-not-using-indexes


# buffers
max_connections         = 256
key_buffer              = 64M
max_allowed_packet      = 16M
table_cache             = 512
sort_buffer_size        = 1M
read_buffer_size        = 256K
read_rnd_buffer_size    = 1M
myisam_sort_buffer_size = 64M
thread_cache_size       = 100
query_cache_size        = 0


# InnoDB
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so

innodb_file_per_table = 1
innodb_file_format = Barracuda
innodb_fast_shutdown = 0

innodb_flush_method             = O_DIRECT
innodb_buffer_pool_size         = 1G
innodb_additional_mem_pool_size = 20M
innodb_log_file_size            = 256M
innodb_log_files_in_group       = 2
innodb_log_buffer_size          = 64M
innodb_flush_log_at_trx_commit  = 1


# replication
server-id = 1
log-bin = /var/lib/mysql/binlog/mysql-bin
max_binlog_size = 256M
expire_logs_days = 10
binlog_ignore_db = queue
# sync_binlog = 1
log_bin_trust_function_creators = 1


[mysql]
prompt=\U:\d>\_
EOF
ログローテート
cat > /etc/logrotate.d/mysql <<EOF
/var/log/mysql/error.log /var/log/mysql/mysql-slow.log {
    daily
    rotate 7
    missingok
    create 640 mysql adm
    compress
    sharedscripts
    postrotate
        test -x /usr/bin/mysqladmin || exit 0
        # If this fails, check debian.conf!
        MYADMIN="/usr/bin/mysqladmin --defaults-file=/etc/mysql/debian.cnf"
        if [ -z "`$MYADMIN ping 2>/dev/null`" ]; then
          # Really no mysqld or rather a missing debian-sys-maint user?
          # If this occurs and is not a error please report a bug.
          if ps cax | grep -q mysqld; then
            exit 1
          fi
        else
          $MYADMIN flush-logs
        fi
    endscript
}
EOF
起動
sysv-rc-conf --level 2345 mysql on
service mysql start