現在のデータベースの状態をtarを使って圧縮保存しておきます。ここではdatadirが/var/lib/mysqlとして書いてありますので、ご自身の環境に変えてください。
#
SVR=サーバ名
#
cd /var/lib
# tar cpzf master.tar.gz mysql/ib_logfile* mysql/ibdata* $SVR-bin.*
マスター・サーバを起動しておきます。
# /etc/init.d/mysql start
これで、マスター・サーバ側は通常どおり使えます。データ更新をしても問題ありません。
スレーブ・サーバの準備
- スレーブ・サーバにMySQL4.1をインストールします。これはマスター・サーバと同じ方法でインストールするのみです。
スレーブ・サーバのキーを生成します。ここでは/etc/mysqlというディレクトリを作成し、この下にキーを保存することとします。
以下の作業をrootで行います
DIR=/etc/mysql
PRIV=$DIR/private
mkdir $DIR $PRIV $DIR/newcerts
cp /usr/share/ssl/openssl.cnf $DIR
replace ./demoCA $DIR -- $DIR/openssl.cnf
touch $DIR/index.txt
echo "01" > $DIR/serial
# CAの生成
openssl req -new -x509 -keyout $PRIV/cakey.pem \
-out $DIR/cacert.pem -config $DIR/openssl.cnf
Generating a 1024 bit RSA private key
......................++++++
...........++++++
writing new private key to '/etc/mysql/private/cakey.pem'
Enter PEM pass phrase:パスフレーズの入力
Verifying - Enter PEM pass phrase:パスフレーズの入力
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Mie
Locality Name (eg, city) []:Kuwana
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tsuttayo.sytes.net
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
# クライアント・キーの生成
openssl req -new -keyout $DIR/client-key.pem \
-out $DIR/client-req.pem -days 3600 -config $DIR/openssl.cnf
Generating a 1024 bit RSA private key
......++++++
..........++++++
writing new private key to '/etc/mysql/client-key.pem'
Enter PEM pass phrase:パスフレーズの入力
Verifying - Enter PEM pass phrase:パスフレーズの入力
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Mie
Locality Name (eg, city) []:Kuwana
Organization Name (eg, company) [Internet Widgits Pty Ltd]:tsuttayo.sytes.net
Organizational Unit Name (eg, section) []:
Common Name (eg, YOUR name) []:
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
# パスフレーズの除去
openssl rsa -in $DIR/client-key.pem -out $DIR/client-key.pem
# キーへ署名
openssl x509 -in $DIR/client-req.pem -out $DIR/client-cert.pem \
-req -signkey $DIR/client-key.pem -days 3650
Signature ok
subject=/C=JP/ST=Mie/L=Kuwana/O=tsuttayo.sytes.net
Getting Private key |
MySQLサーバをシャットダウンしておきます。
# /etc/init.d/mysql stop
念のため、master.infoを削除しておきます。
# rm -f /var/lib/mysql/master.info
my.cnfのヒナ方をコピーします。すでにmy.cnfが存在しているならこの必要はないと思います。
# cp /usr/share/mysql/my-medium.cnf /etc/my.cnf
my.cnfを編集します。
# emacs /etc/my.cnf
|
[client]
# デフォルトの文字セット
default-character-set=ujis
[mysqld]
# 以下の行があるかを確認する。なければ追加しておく。
log-bin
# 以下の行があるかを確認。なければ追加しておく。
# マスター・サーバとは値を変えます。
server-id = 100
# レプリケーションしたいデータベース名。
# 全データベースをレプリケーションするなら指定の必要はありません。
replicate-do-db=DATABASE_NAME
# MySQLクライアント・サーバ間のパケットサイズ
# この設定値はマスター、スレーブとも同じにしておく必要があります。
max_allowed_packet=16M
# デフォルトの文字セット
default-character-set=ujis
[mysqldump]
# デフォルトの文字セット
default-character-set=ujis
[mysql]
# デフォルトの文字セット
default-character-set=ujis
|
「マスター・サーバのデータを抽出(MyISAMのみの場合)」でマスター・サーバのデータを抽出した場合、スレーブ・サーバ側で解凍します。
ftpなどでマスター・サーバからデータをコピーした後、以下のようにします。
# cd /var/lib
# tar zxvf db.tar.gz
MySQLサーバを起動します。
# /etc/init.d/mysql start
以下のようにしてマスター・サーバを指定します。MASTER_LOG_FILEとMASTER_LOG_POSはマスター・サーバ側で「SHOW MASTER STATUS;」として調べた値です。
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='マスター・サーバのホスト名',
mysql> MASTER_USER='slave_user',
mysql> MASTER_PASSWORD='マスター・サーバで作成したMySQLパスワード',
mysql> MASTER_LOG_FILE=''ログ名(Fileの値)',
mysql> MASTER_LOG_POS=(Positionの値),
mysql> MASTER_SSL = 1,
mysql> MASTER_SSL_CERT = '/etc/mysql/client-cert.pem',
mysql> MASTER_SSL_KEY = '/etc/mysql/client-key.pem';
「マスター・サーバのデータを抽出(InnoDBが含まれる場合1)」でマスター・サーバのデータを保存した場合、
ftpなどでマスター・サーバからデータをコピーした後、次のようにします。
MySQLサーバを起動します。
# /etc/init.d/mysql start
# exit
$ mysql -u root -p < master.data
レプリケーション動作を開始させます。
以下のようにしてマスター・サーバを指定します。
mysql> STOP SLAVE;
mysql> CHANGE MASTER TO
mysql> MASTER_HOST='マスター・サーバのホスト名',
mysql> MASTER_USER='slave_user',
mysql> MASTER_PASSWORD='マスター・サーバで作成したMySQLパスワード',
mysql> MASTER_SSL = 1,
mysql> MASTER_SSL_CERT = '/etc/mysql/client-cert.pem',
mysql> MASTER_SSL_KEY = '/etc/mysql/client-key.pem';
なお、MySQLマニュアルではこれでいけるように書いてありますが、うちではうまくいきませんでした。
$ head -n40 master.data
このようにして、CHANGE MASTER TOの行を見てください。
この値を見て、以下のようにします。
mysql> CHANGE MASTER TO
mysql> MASTER_LOG_FILE=''ログ名(Fileの値)',
mysql> MASTER_LOG_POS=(Positionの値);
「マスター・サーバのデータを抽出(InnoDBが含まれる場合2)」でマスター・サーバのデータを保存した場合、
ftpなどでマスター・サーバからデータをコピーした後、次のようにします。
# cd /var/lib
# tar zxvf master.tar.gz
# cd /var/lib/mysql
# MASTER=マスターサーバ名
# SLAVE=スレーブサーバ名
# for sv in $MASTER-*; do
> mv $sv `echo $sv | sed s/$MASTER/$SLAVE/`
> done
スレーブの設定がちゃんとできているか、確認します。
mysql> SHOW SLAVE STATUS\G
特に「Master_Host」「Master_User」「Master_Log_File」「Read_Master_Log_Pos」がちゃんと設定されているかを確認します。
うまく設定されていないなら、「CHANGE MASTER TO」というSQL文で設定してください。
スレーブ・スレッドを開始します。
mysql> START SLAVE;
mysql> exit
参考にした資料
Official MySQL Japanese Manual