がらくたネット


MySQL関係

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かな。

不具合としては

  • phpMyAdminにログインしたときに「お使いの PHP MySQL ライブラリのバージョン 5.0.86 が MySQL サーバのバージョン 4.1.22 と異なります。これは予期しない不具合を起こす可能性があります。」と…
  • 特権操作のときにホスト名が@になっているやつをそのまま消せない。ホスト名としてlocalhostを一度書き込んでやると消せる

かな。

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

  • マスターと複数スレーブの構成が可能
  • 設定によりマルチマスタが可能(テーブル側の対応も必要)
  • IO_THREADとはマスタからのバイナリログ読み込み
  • SQL_THREADとはリレーログのイベント処理

マスタ

  • 最低限マスタ側はserver-id設定とバイナリログを有効にする
  • レプリケーション用ユーザを作成する

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を指定する

スレーブ

  • my.cnf内でごにょごにょ設定する
  • server-idは重複しないこと

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スレッドを自動起動しない
  • スレーブ設定したMySQLを起動すると、DATADIRにmaster.infoファイルがなければ作成される
  • この情報はmy.cnfから取得して作成される
  • 起動時に存在していればmy.cnfは参照されずにmaster.infoファイルが参照される
  • 異なる情報を持たせたい場合は、MySQL停止後master.infoを削除して起動する
  • またはmysqlクライアントからCHANGE MASTER TOステートメントで変更する

スレーブ追加

  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

ログの取り扱い

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

  • バイナリログはディスクスペースを消費するので削除が必要
  • レプリケーションはバイナリログを読み込んで更新する
  • リレーログはスレーブがマスタからバイナリログを読んで更新するために利用する
  • スローログと一般クエリログはflush-logsを行っても閉じて開くだけ。なのでflush前にOS上から名前を変更しておく必要あり
  • エラーログは-oldをサフィックスとして付ける。
max-relay-log-size = サイズ リレーログをローテートするサイズ
max-binlog-size = サイズバイナリログをローテートするサイズ
mysqladmin flush-logs 既存バイナリログを閉じて新しく開く
mysqldump –flush-logs 既存バイナリログを閉じて新しく開く
  • PURGE MASTER LOGSコマンドはレプリケーション中でもOK。削除予定のバイナリログを読み込んでいるスレーブがあればエラーで停止する。ただし、スレーブが休止中であれば読み込みセッションが開いていないため、削除される。削除されると休止中スレーブが復帰しても複製はできない

|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を実行してバイナリログを更新しておくのがよいとされる

ログローテート

  • RPMをインストールすると/etc/logrotate.d/mysqlが生成される
  • 若干の変更が必要
  • バイナリログのローテーションは実施される(mysqladmin –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 ローテート設定ファイル