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-start | SQL起動時にSLAVEスレッドを自動起動しない |
- スレーブ設定したMySQLを起動すると、DATADIRにmaster.infoファイルがなければ作成される
- この情報はmy.cnfから取得して作成される
- 起動時に存在していればmy.cnfは参照されずにmaster.infoファイルが参照される
- 異なる情報を持たせたい場合は、MySQL停止後master.infoを削除して起動する
- またはmysqlクライアントからCHANGE MASTER TOステートメントで変更する
スレーブ追加
- 【マスタ】DBのdumpを取得
mysqldump --databases --master-data --opt -u root -p データベース名 > /tmp/データベース名.sql -master-data CHANGE MASTER TO行が挿入される --database CREATE DATABASE行が挿入される
- 【スレーブ】dumpファイルを転送する
scp ユーザ名@サーバ名:/tmp/データベース名.sql /tmp
- 【スレーブ】MySQLを起動。この時スレーブスレッドは開始しない。my.cnfのskip-slave-start。
- 【スレーブ】dumpファイルからDB復元
mysql -u root -p < /tmp/データベース名.sql
- 【スレーブ】dumpファイルのCHANGE MASTER TO行を控える(やらなくてもOK)
- 【スレーブ】CHANGE MASTER TO行の実行(やらなくてもOK)
mysql -u root -p mysql> CHANGE MASTER TO MASTER_LOG_FILE='ファイル名', MASTER_LOG_POS=ポジション番号; - 【スレーブ】スレーブスレッドを起動<code bash> mysql> SLAVE START;
- 【スレーブ】スレーブステータスの確認
mysql> SHOW SLAVE STATUS\G;
- これで完了のはず
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'; | 指定時間までのログを削除 |
では安全に削除するためには?
- 【各スレーブ】SHOW SLAVE STATUS\G;で現在のバイナリログを確認
- 【マスタ】SHOW BINARY LOGSで現在のバイナリログリストを確認
- 【マスタ】全バイナリログをバックアップする。これは通常のコピーでかまわない
- 【マスタ】ターゲットログを含まないバイナリログの削除
容易にするためには、毎日flush-logsを実行してバイナリログを更新しておくのがよいとされる
ログローテート
- RPMをインストールすると/etc/logrotate.d/mysqlが生成される
- 若干の変更が必要
- バイナリログのローテーションは実施される(mysqladmin –flush-logs)が削除は行われない
- レプリケーションしている場合はどうすればよいのだ?…
- mysqladminをrootで起動しているため、MySQLのroot@localhostユーザにパスワードが設定されている場合はパスワードを~root/.my.cnfに設定、chmod 600しておく必要がある
# vi ~root/.my.cnf [mysqladmin] password = <password> user= root # chmod 600 ~root/.my.cnf
- ログファイル名が/var/lib/mysql/mysql.logとなっているので適宜変更する
- ローテートテストをする
# logrotate -dv ローテート設定ファイル