モチベーションは、ちょっと slave のテストをする必要があったので適当にローカルで試したい、なんだけどまともに mysql の設定をした事がなかったので色々嵌る。
大体 公式 とかにかいてある事です。
my.cnf
場所
mysql --help に書いてありますが忘れる。
/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf
my.cnf
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = password
[mysqld]
[mysqld1]
server-id = 1
socket = /tmp/mysql.sock
port = 3306
pid-file = /usr/local/var/mysql/my.local.pid
datadir = /usr/local/var/mysql
user = root
[mysqld2]
server-id = 2
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/var/mysql2/my.local.pid2
datadir = /usr/local/var/mysql2
user = root
mysqld_multi --example
でサンプルが出てくる。
mysql_install_db
で インストールした。
/usr/local/var/mysql2
等に ディレクトリを作成しておく。
[WARNING] mysql_install_db is deprecated. Please consider switching to mysqld --initialize
と言われるけど password で嵌ったのでとりえあえず mysql_install_db
を使って調査してた。
basedir オプションを指定しないと駄目なようなので、
mysql_install_db --defaults-file=/etc/my.cnf --datadir=/usr/local/var/mysql2 --basedir=/usr/local/Cellar/mysql/5.7.18
とかで良いのかな。。。バージョン上がったら困るので symlink の方にすべきか。
5.7.6 以降の挙動
mysql_install_db で root の password が ~/.mysql_secret に書かれるようになった。嵌る。
slave は mysql port=3307 の方を新しく作ったのですが、めでたくパスワードが分かったのでこちらにも何とかログインできた。
GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'password';
で multi_admin ユーザーで shutdown できるようにしておく。
その前に初期 password を変更しないと怒られるので
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';
を実行する。
これで mysqld_multi start/stop
ができるようになるのだけど、--password オプションで password を渡さないと stop はできないようだ。
slave の設定
レプリケーション専用のユーザーを作る。
データの更新を防ぐ為にロックをかけておく。
CREATE USER 'repl'@'localhost' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'localhost';
FLUSH TABLES WITH READ LOCK;
dump でスレーブにデータを入れる
mysqldump --all-databases --master-data -u root -p > dbdump.db
// slave に dump データを入れる
mysql -u root -S /tmp/mysql.sock2 -p < dbdump.db
ロックを外す。
UNLOCK TABLES;
slave で マスター構成の設定をして、slave をスタートする。参考
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=611;
start slave;
これで完了。
マスターの変更がスレーブに来ている事を確認できました。