MySQL 5.5 で mysqld_multi とMaster-Slave 構成を試す
環境
実行手順
MySQL インストール
$ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
yum リポジトリの定義ファイルを開き、5.5をインストールするように以下の通り編集。
$ sudo vi /etc/yum.repos.d/mysql-community.repo @@ -16,7 +16,7 @@ [mysql55-community] name=MySQL 5.5 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.5-community/el/6/$basearch/ -enabled=0 +enabled=1 gpgcheck=1 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql @@ -24,7 +24,7 @@ [mysql56-community] name=MySQL 5.6 Community Server baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/6/$basearch/ -enabled=1 +enabled=0 gpgcheck=1 gpgkey=file:/etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
$ sudo yum -y install mysql mysql-devel mysql-server mysql-utilities
mysql 5.5 がインストールされたことを確認。
$ mysql --version mysql Ver 14.14 Distrib 5.5.45, for Linux (x86_64) using readline 5.1
mysqld_multi を適用
ユーザ作成
$ sudo adduser user1
それぞれのディレクトリに対して初期化処理を行います。
$ sudo mysql_install_db --datadir=/data/user1m $ sudo mysql_install_db --datadir=/data/user1s
$ sudo vi /etc/my.cnf
@@ -25,7 +25,32 @@ # Recommended in standard MySQL setup #sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES +user = mysql ### `datadir`で設定したユーザを指定します。 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid + +[mysqld_multi] +mysqld = /usr/bin/mysqld_safe +mysqladmin = /usr/bin/mysqladmin +user = admin +password = hoge + +[mysqld1] +port = 50001 +datadir = /data/user1 +pid-file = /data/user1m/mysql.pid +socket = /data/user1m/mysql.sock +user = user1 +general_log = ON +general-log-file = /var/log/mysqld/user1.log + +[mysqld2] +port = 50002 +datadir = /data/user1s +pid-file = /data/user1s/mysql.pid +socket = /data/user1s/mysql.sock +user = user1 +general_log = ON +general-log-file = /var/log/mysqld/user2.log
ディレクトリ作成
$ sudo mkdir -p /data/user1m $ sudo chown -R mysql:mysql /data/user1m $ sudo mkdir -p /data/user1s $ sudo chown -R mysql:mysql /data/user1s
一台ずつ起動
$ sudo mysqld_multi start 1 $ sudo mysqld_multi start 2
ちなみにmysql_multi start
と後述のmysql_multi stop
の引数は、
以下の通り指定することもできます。
<なし>: 全台
1,3: 1と3
1-3: 1〜3
起動を確認します。
$ sudo mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running
停止してみます。
$ sudo mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running
停止できていないことが確認できるかと思います。
$ sudo mysqld_multi report Reporting MySQL servers MySQL server from group: mysqld1 is running MySQL server from group: mysqld2 is running
ログを確認してみるとわかりますが、
my.cnf
ファイルのmysqld_multi
セクションで設定したユーザに対して権限が与えられていないことによるものです。
$ sudo tail /var/lib/mysql/mysqld_multi.log ... /usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'admin'@'localhost' (using password: YES)' /usr/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'admin'@'localhost' (using password: YES)'
mysql を停止できるように権限を付与しましょう。
$ sudo mysql --socket=/data/user1m/mysql.sock -u root
mysql> SELECT user,host FROM mysql.user; +------+-----------------+ | user | host | +------+-----------------+ | root | 127.0.0.1 | | root | ::1 | | | ip-172-31-1-225 | | root | ip-172-31-1-225 | | | localhost | | root | localhost | +------+-----------------+ 6 rows in set (0.00 sec) mysql> TRUNCATE TABLE mysql.user; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL ON *.* TO 'admin'@'127.0.0.1' IDENTIFIED BY 'hoge' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'hoge' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> GRANT ALL ON *.* TO 'admin'@'localhost.localdomain' IDENTIFIED BY 'hoge' WITH GRANT OPTION; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; mysql> SELECT user,host FROM mysql.user; +-------+-----------------------+ | user | host | +-------+-----------------------+ | admin | 127.0.0.1 | | admin | localhost | | admin | localhost.localdomain | +-------+-----------------------+ 3 rows in set (0.00 sec)
同様に2のほうでも作業を行います。
これで mysql を停止できるようになりました。
$ sudo mysqld_multi stop
$ sudo mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysqld1 is not running
MySQL server from group: mysqld2 is not running
レプリケーション用のユーザ作成
# mysql -uadmin -phoge --socket=/data/user1/mysql.sock -e "GRANT REPLICATION SLAVE ON *.* TO 'repusr'@'%';"
mysqldumpによるデータコピー
READ LOCK
mysql> FLUSH TABLES WITH READ LOCK;
MASTER POSITION の確認
# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock -e "SHOW MASTER STATUSG" *************************** 1. row *************************** File: mysql-bin.000002 Position: 749 Binlog_Do_DB: Binlog_Ignore_DB:
ダンプ作成
# mysqldump -uadmin -phoge --socket=/data/user1m/mysql.sock --all-databases > dump1.sql -- Warning: Skipping the data of table mysql.event. Specify the --events option explicitly.
LOCK を解除
# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock -e "UNLOCK TABLE ;"
ダンプをインポート
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock < dump1.sql
Slave側でマスタの設定
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock << EOF CHANGE MASTER TO MASTER_HOST = '127.0.0.1', MASTER_USER = 'repusr', MASTER_PORT = 50001, MASTER_LOG_FILE = 'mysql-bin.000002', MASTER_LOG_POS = 749; EOF
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock -e "START SLAVE;"
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock -e "SHOW SLAVE STATUSG" *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 127.0.0.1 Master_User: repusr Master_Port: 50001 Connect_Retry: 60 Master_Log_File: mysql-bin.000001 Read_Master_Log_Pos: 107 Relay_Log_File: mysql-relay.000002 Relay_Log_Pos: 253 Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 107 Relay_Log_Space: 405 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1
マスター側のデータを確認します。
# mysql -uadmin -phoge --socket=/data/user1m/mysql.sock test -e "SELECT * from table1;" +------+-------+ | col1 | col2 | +------+-------+ | 1 | one | | 2 | two | | 3 | three | +------+-------+
スレーブ側に反映しているか確認します。
# mysql -uadmin -phoge --socket=/data/user1s/mysql.sock test -e "SELECT * from table1;" +------+-------+ | col1 | col2 | +------+-------+ | 1 | one | | 2 | two | | 3 | three | +------+-------+