## mac配置mysql單機多實例主從
假設(shè)mac上已經(jīng)安裝好一個可以運行的mysql,運行情況如下
***
?? ~ ps -ef |grep mysql
501 98726 98386? 0 11:57下午 ttys003? ? 0:06.33 /usr/local/Cellar/mysql/5.7.17/bin/mysqld --basedir=/usr/local/Cellar/mysql/5.7.17 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/Cellar/mysql/5.7.17/lib/plugin --log-error=/usr/local/var/mysql/bogon.err --pid-file=/usr/local/var/mysql/bogon.pid --socket=/private/tmp/mysql.sock --port=3306
***
可以看到mysql的datadir,啟動的程序/usr/local/Cellar/mysql/5.7.17/bin/mysqld,pid信息等。
mac的my.cnf路徑在/private/etc/my.cnf。
### 實現(xiàn)步驟如下
- 創(chuàng)建一個slave目錄(我的slave在/usr/local/opt/mysql_slave)
- mkdir -p /usr/local/opt/mysql_slave
- 在/private/etc/my.cnf中修改配置(主從共用一個my.cnf),加入slave的路徑信息。配置片段如下
***
[mysqld2]
server-id=3307
replicate-do-db=test1? ? ? ? ? ? #指定需要同步的數(shù)據(jù)庫名(此例DB_NAME=class)
replicate-ignore-db=vipkid,testvk,disconf,azkaban? ? ? ? #不需要同步的數(shù)據(jù)庫名
port=3307? ? ? #從數(shù)據(jù)庫端口號,也可以改為其他的,只要不占用系統(tǒng)中端口號就行
socket=/usr/local/opt/mysql_slave/mysqld_slave.sock? ? ? ? ? #指明從數(shù)據(jù)庫sock路徑
pid-file=/usr/local/opt/mysql_slave/mysql.pid? ? ? ? ? #從數(shù)據(jù)庫pid路徑
datadir=/usr/local/opt/mysql_slave/var? ? ? ? #從數(shù)據(jù)庫目錄路徑
relay_log=mysql-relay-bin? ? ? ? ? #中繼日志(通過I/O線程從主庫中復(fù)制的日志)
log_slave_updates=1? ? ? ? ? ? #允許備庫將其重放時間也記錄在自身的日志文件中
read_only=1? ? ? ? #阻止任何沒有特權(quán)權(quán)限的線程修改數(shù)據(jù)
***
其中只有server-id為必須字段
- 初始化一個新的mysql實例(datadir中生成初始化的文件)
- 版本mysql 5.7.17,初始化時會加載my.cnf的[mysqld]段的配置
***
?? ~ sudo mysqld --initialize --basedir=/usr/local/Cellar/ mysql/5.7.17 --datadir=/usr/local/opt/mysql_slave/var
***
初始化后會在控制臺打出一堆log,其中包含生成的臨時密碼,如下
***
[Note] A temporary password is generated for root@localhost: jt=FV,ytu8.,
***
用戶名:root,密碼為jt=FV,ytu8.,登錄mysql修改臨時密碼
***
?? ~ mysql -uroot -pjt=FV,ytu8., -S /usr/local/opt/mysql_slave/mysqld_slave.sock
mysql>set password = '123456';
***
此時登錄slave的用戶名為root,密碼為123456。
- my.cnf的[mysqld]段的配置如下
***
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
port=3306
socket=/private/tmp/mysql.sock
pid-file=/usr/local/var/mysql/bogon.pid
datadir=/usr/local/var/mysql
user=yy
server_id=1011? ? ? ? ? #唯一的服務(wù)器ID
log-bin=mysql-bin? ? ? #二進(jìn)制日志文件
log-bin-index=mysql-bin.index
character_set_server=utf8
***
其中server_id和log-bin是必須字段
- 啟動(注意看log)
***
mysql.server start? ? ? #啟動master的3306端口的mysql,也就是[mysqld]中的mysql
sudo mysqld_multi start 2? ? ? ? #啟動slave的mysql,[mysqld2]對應(yīng)2
***
啟動中遇到的各種問題都通過log查看,log路徑在my.cnf指定,my.cnf其他段的內(nèi)容如下:
***
[mysqld_safe]
log-error=/usr/local/var/mysql/bogon.err
pid-file=/usr/local/var/mysql/bogon.pid
[mysqld_multi]
mysqld=/usr/local/opt/mysql/bin/mysqld_safe
mysqladmin=/usr/local/opt/mysql/bin/mysqladmin
user=yy
***
- 登錄主從數(shù)據(jù)庫
***
#主數(shù)據(jù)庫:
?? ~ mysql -uroot -p -S /private/tmp/mysql.sock
#確認(rèn)主庫是否創(chuàng)建了二進(jìn)制文件,也就是my.cnf中的log_bin是否配置
mysql>show master status\G
#主庫創(chuàng)建復(fù)制賬號,這是一個特權(quán)賬號,只能從二進(jìn)制日志中獲取數(shù)據(jù)
mysql>grant replication slave, replication client on *.* to slave@'127.0.0.1' identified by 'slavepassword';
mysql>flush privileges;
#從數(shù)據(jù)庫:
?? ~ mysql -uroot -p -S /usr/local/opt/mysql_slave/mysql.sock
#從庫狀態(tài)Slave_IO_State、Slave_IO_Runing和Slave_SQL_Runing顯示從庫復(fù)制是夠運行
mysql>show slave status\G
#從庫連接主庫動作, master_log_pos設(shè)置為0,即從開始位置讀起
mysql>change master to master_host='192.168.10.107', master_port=3306, master_user='slave', master_password='password', master_log_file='mysql-bin.000018', master_log_pos=0;
#運行命令開始復(fù)制
mysql>start slave;
#其他命令
#查看server_id
mysql>show variables like 'server_id';
#查看線程
mysql>show processlist\G
***
###遇到的問題
- 處理一則MySQL Slave環(huán)境出現(xiàn)ERROR 1201 (HY000): Could not initialize master info structure的案例。
http://blog.itpub.net/7607759/viewspace-719707/
- RESET SLAVE;
- 刪除主從目錄下的master.info elay-log.info。然后嘗試重新執(zhí)行change master。
- 沒有讀取權(quán)限
- chown -R mysql.mysql /data/mysql