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 パッケージは用意されていませんので、alien で deb に変換してインストールします。
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 初期化
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