目次

MySQL関係

MySQL関係の色々

MySQL 5.6

Sientific Linux 6.6にMySQL 5.6をインストールしてみる

MySQLはここからダウンロードする

yumリポジトリがあるけど、パッケージ名が少し異なるので ここでは、tarをダウンロードしてそこからインストールする

Redhat分のやつで、RPM Bundleとなっているtarを落とす

Downloadボタンを押して次へ進むとOracle Webアカウントでログインしてね♪とでるが 画面下の「No thanks, just start my download.」をクリックすれば ログインしなくてもダウンロードできる

ポイントは、すでにOSに入っているやつらを削除すること
で、MySQLとMySQL-develパッケージはそのまま削除できる
MySQL-libsが依存関係で削除できないはず

先にMySQL-sharedとMySQL-shared-compatをインストールする
その後、MySQL-libsを削除
そして、残りのMySQL関連パッケージをインストールすればOK

インストール後、rootのパスワードを設定すること
インストール時に/root/.mysql_secretに記載の文字列でパスワードが設定されているので ログインして設定すること

MySQL 4.1系

CentOS5系にMySQL4.1系をインストールするシーンがあった。どうするのかの備忘録。phpMyAdminもインストールする。

CentOS5系のMySQLは5.0系となっている。yumは利用できない。mysql.comから4.1系をダウンロードする。mysql.comには2009/10/14現在4.1.22-0がダウンロード可能となっていた。RHEL4用のRPMを落とす。大丈夫だろう。(汗 ライブラリはShared compatibility librariesを選択しておく。

必要なRPMをダウンロード
MySQL-client-standard-4.1.22-0.rhel4.i386.rpm
MySQL-devel-standard-4.1.22-0.rhel4.i386.rpm
MySQL-server-standard-4.1.22-0.rhel4.i386.rpm
MySQL-shared-compat-4.1.22-0.rhel4.i386.rpm

phpMyAdminを動かすにはPHPとPHP-MYSQLが必要となる。CentOS5のPHP-MYSQLはmysqlパッケージを要求するのだが実のところはlibmysqlclient.so.15を要求しているに過ぎない。

# yum install php-mysql
...(snip)
--> Processing Dependency: libmysqlclient.so.15(libmysqlclient_15) for package: php-mysql

なので、libmysqlclient.so.15を持ったライブラリを事前にインストールする。MySQL4.1系には存在せず、MySQL5.0系から存在しているのでMySQL5.0系のShared compatibility librariesを用意してインストールする

MySQL-shared-compat-5.0.86-1.rhel5.i386.rpm
# rpm --test -ihv MySQL-shared-compat-5.0.86-1.rhel5.i386.rpm
# rpm -ihv MySQL-shared-compat-5.0.86-1.rhel5.i386.rpm

実際にRPMファイルの中身を確認すれば早い。

# rpm -qlp MySQL-shared-compat-5.0.86-1.rhel5.i386.rpm
/usr/lib/libmysqlclient.so
/usr/lib/libmysqlclient.so.10
/usr/lib/libmysqlclient.so.10.0.0
/usr/lib/libmysqlclient.so.12
/usr/lib/libmysqlclient.so.12.0.0
/usr/lib/libmysqlclient.so.14
/usr/lib/libmysqlclient.so.14.0.0
/usr/lib/libmysqlclient.so.15
/usr/lib/libmysqlclient.so.15.0.0
/usr/lib/libmysqlclient_r.so
/usr/lib/libmysqlclient_r.so.10
/usr/lib/libmysqlclient_r.so.10.0.0
/usr/lib/libmysqlclient_r.so.12
/usr/lib/libmysqlclient_r.so.12.0.0
/usr/lib/libmysqlclient_r.so.14
/usr/lib/libmysqlclient_r.so.14.0.0
/usr/lib/libmysqlclient_r.so.15
/usr/lib/libmysqlclient_r.so.15.0.0

# rpm -qlp MySQL-shared-compat-4.1.22-0.rhel4.i386.rpm
/usr/lib/libmysqlclient.so
/usr/lib/libmysqlclient.so.10
/usr/lib/libmysqlclient.so.10.0.0
/usr/lib/libmysqlclient.so.12
/usr/lib/libmysqlclient.so.12.0.0
/usr/lib/libmysqlclient.so.14
/usr/lib/libmysqlclient.so.14.0.0
/usr/lib/libmysqlclient_r.so
/usr/lib/libmysqlclient_r.so.10
/usr/lib/libmysqlclient_r.so.10.0.0
/usr/lib/libmysqlclient_r.so.12
/usr/lib/libmysqlclient_r.so.12.0.0
/usr/lib/libmysqlclient_r.so.14
/usr/lib/libmysqlclient_r.so.14.0.0

mysql-serverにはperl-DBIが必須

# yum install perl-DBI

晴れて、MySQL4.1系のインストール

# rpm -ihv MySQL-server-standard-4.1.22-0.rhel4.i386.rpm
# rpm -ihv MySQL-devel-standard-4.1.22-0.rhel4.i386.rpm
# rpm -ihv MySQL-client-standard-4.1.22-0.rhel4.i386.rpm

あとは、phpとphp-mysqlとapacheとphpMyAdminをインストールすればOKかな。

不具合としては

かな。

php-mysqlをRPMではなく、ソースからインストールする方法を探してみた。あった。

php-mysqlでインストールされるiniファイルをバックアップ
# cp /etc/php.d/mysql.ini ./
# cp /etc/php.d/mysqli.ini ./
# cp /etc/php.d/pdo_mysql.ini ./

php-mysqlを削除
# rpm -e php-mysql

mysqlのライブラリが入っている場合は削除
# rpm -e MySQL-shared-compat-5.0.86-1

mysqlの4.1系ライブラリをインストール
# rpm -ihv MySQL-shared-compat-4.1.22-0.rhel4.i386.rpm

php 5.1.6のソースディレクトリ内でmysqlに移動
# cd ext/mysql

configureファイルを作成
# phpize

コンパイル
# ./configure --with-mysql=/usr/lib
# make

インストール
# make install
Installing shared extensions:     /usr/lib/php/modules/

これで、mysql.soがインストールされる

バックアップしておいたmysql.iniをコピー
# cp mysql.ini /etc/php.d/

apacheの再起動
phpinfoを見てみる!

レプリケーション

ここで想定しているのはRPMでインストールしたMySQL

マスタ

server-id = 1
log-bin
 
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'スレーブIP' IDENTIFIED BY '********';

log-binは複数の記述方法がある

log-bin バイナリログを使用する ファイル名はホスト名-binとなる
log-bin = [base_name] バイナリログを使用する。ファイル名は[base_name]-binとなる。ディレクトリはデータディレクトリ
log-bin = /var/lib/mysql/hogehoge バイナリログを使用する。ファイル名はhogehoge-binとなる。ディレクトリは/var/lib/mysql/

可能な限りbase_nameを指定する

スレーブ

server-id = 2
read-only
report-host = [FQDN]
relay-log = [base_name]
relay-log-index = [base_name]
relay-log-info-file = [file_name]
master-host = [マスタホスト名 or IP]
master-user = [レプリケーション用ユーザ名]
master-password = [レプリケーション用ユーザのパスワード]
skip-slave-start

read-onlyスレーブスレッドかSUPER権限を持つユーザ以外からはアップデートを受け付けない、クライアントからのアップデートを受け付けない!
report-hostマスターでスレーブホスト表示が可能になる
relay-log関係リレーログのファイル名を指定
master-関係マスターサーバ情報を指定
skip-slave-startSQL起動時にSLAVEスレッドを自動起動しない

スレーブ追加

  1. 【マスタ】DBのdumpを取得
    mysqldump --databases --master-data --opt -u root -p データベース名 > /tmp/データベース名.sql
     
    -master-data CHANGE MASTER TO行が挿入される
    --database  CREATE DATABASE行が挿入される
  2. 【スレーブ】dumpファイルを転送する
    scp ユーザ名@サーバ名:/tmp/データベース名.sql /tmp
  3. 【スレーブ】MySQLを起動。この時スレーブスレッドは開始しない。my.cnfのskip-slave-start。
  4. 【スレーブ】dumpファイルからDB復元
    mysql -u root -p < /tmp/データベース名.sql
  5. 【スレーブ】dumpファイルのCHANGE MASTER TO行を控える(やらなくてもOK)
  6. 【スレーブ】CHANGE MASTER TO行の実行(やらなくてもOK)
    mysql -u root -p
    mysql> CHANGE MASTER TO MASTER_LOG_FILE='ファイル名', MASTER_LOG_POS=ポジション番号;
      - 【スレーブ】スレーブスレッドを起動<code bash>
    mysql> SLAVE START;
  7. 【スレーブ】スレーブステータスの確認
    mysql> SHOW SLAVE STATUS\G;
  8. これで完了のはず

SHOW SLAVE STATUS スレーブ上で実行し、スレーブスレッド状態を確認する

\Gを付けておくと読みやすい形式で表示してくれる(大文字である必要あり)

Last_Error 最後に記録されたエラー情報
Seconds_Behind_Master 最後の更新からの経過秒
Slave_IO_State IO_THREADの状態
Slave_IO_Running IO_THREADの稼動状況、Yesで稼働中
Slave_SQL_Runnin SQL_THREADの稼動状況、Yesで稼動中

SHOW PROCESSLIST マスタ/スレーブ上で実行し、プロセス状態が見れる

\Gを付けておくと読みやすい形式で表示してくれる(大文字である必要あり)

【マスタ】
*************************** 18. row ***************************
     Id: 9899
   User: rep
   Host: ホスト名:41051
     db: NULL
Command: Binlog Dump
   Time: 23985
  State: Has sent all binlog to slave; waiting for binlog to be updated
   Info: NULL
 
【スレーブ】
*************************** 1. row ***************************
     Id: 2
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 63848
  State: Waiting for master to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 3
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 0
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL

ログの取り扱い

レプリケーション時のログ取り扱いには注意が必要

max-relay-log-size = サイズ リレーログをローテートするサイズ
max-binlog-size = サイズバイナリログをローテートするサイズ
mysqladmin flush-logs 既存バイナリログを閉じて新しく開く
mysqldump –flush-logs 既存バイナリログを閉じて新しく開く

|PURGE MASTER LOGS TO 'mysql-bin.00010'; |mysql-bin.00010までのログを削除 |

PURGE MASTER LOGS BEFORE '2009-02-02 00:00:00'; 指定時間までのログを削除

では安全に削除するためには?

  1. 【各スレーブ】SHOW SLAVE STATUS\G;で現在のバイナリログを確認
  2. 【マスタ】SHOW BINARY LOGSで現在のバイナリログリストを確認
  3. 【マスタ】全バイナリログをバックアップする。これは通常のコピーでかまわない
  4. 【マスタ】ターゲットログを含まないバイナリログの削除

容易にするためには、毎日flush-logsを実行してバイナリログを更新しておくのがよいとされる

ログローテート

  1. mysqladminをrootで起動しているため、MySQLのroot@localhostユーザにパスワードが設定されている場合はパスワードを~root/.my.cnfに設定、chmod 600しておく必要がある
    # vi ~root/.my.cnf
    [mysqladmin]
    password = <password>
    user= root
    # chmod 600 ~root/.my.cnf
  2. ログファイル名が/var/lib/mysql/mysql.logとなっているので適宜変更する
  3. ローテートテストをする
    # logrotate -dv ローテート設定ファイル