前言
網上關于MySQL的主從配置教程相當多,但也不乏很多的坑。這裡隻留作筆記使用。
測試環境
-
2台或以上Linux伺服器
為了篇幅,這裡隻用2台。
master主伺服器位址:192.168.1.2
slave從伺服器位址:192.168.1.3
- OS Debian 8.7
- MySQL Community Server 5.6.35
環境搭建
如果沒有安裝MySQL服務,可通過官方提供的APT進行安裝:https://dev.mysql.com/downloads/repo/apt/
點選下方的download,下載下傳一個deb包的源,然後安裝這個deb包,之後更新源,安裝mysql-server即可。
具體操作如下:
- 切換到root使用者,如果沒有該權限的話,使用
指令也可以,嫌麻煩直接切到root了sudo
- 下載下傳、安裝APT源
# wget https://dev.mysql.com/get/mysql-apt-config_0.8.1-1_all.deb
# dpkg -i mysql-apt-config_0.8.1-1_all.deb
- 更新APT源,安裝MySQL服務
在兩台伺服器上都做如上步驟,確定安裝的MySQL 版本一緻即可。
master主伺服器配置
編輯mysql配置檔案
# vim /etc/mysql/my.cnf
在
[mysqld]
下面修改
bind-address
的值為192.168.1.2,預設值是127.0.0.1。
繼續在
[mysqld]
下方添加
character-set-server = utf8 #設定預設資料庫編碼為utf8,防止亂碼問題。
server-id = # 設定伺服器辨別,非常重要必須唯一。
log_bin = /var/log/mysql/binlog/mysql-bin.log # 開啟binlog,主從複制就是基于這個的必須開啟。
# binlog_do_db = # 隻同步複制指定的資料庫,不寫預設複制所有資料庫
# binlog_ignore_db= # 忽略同步指定的資料庫
最後儲存退出,重新開機服務。
添加同步使用者
- 使用mysql root使用者登進master資料庫:
- 建立給slave伺服器用來備份的使用者
mysql> grant select,insert,update,delete on *.* to child@"%" identified by "lu123";
- 授權給slave伺服器
mysql> grant replication slave on *.* to 'child'@'192.168.1.3' identified by 'lu123';
如果是2台或多台slave,這裡就還要根據slave伺服器IP多授權幾次,如:
mysql> grant replication slave on *.* to 'child'@'192.168.1.4' identified by 'lu123';
- 允許遠端主機登陸
mysql> GRANT ALL PRIVILEGES ON *.* TO 'child'@'%' IDENTIFIED BY 'lu123' WITH GRANT OPTION;
- 重新整理權限
mysql> flush privileges;
- 退出,重新開機MySQL服務
mysql> exit
# systemctl restart mysql.service
- 再次登入master資料庫,檢視bin檔案和position,後面配置slave需要
# mysql -uroot -p
mysql> show master status;

記住File和Position字段的值。
配置slave伺服器
網上很多教程都是在my.cnf上面添加mast-user、mast-post之類的,這些在mysql 5.6之前可以,但是後面就不行了。
首先還是先編輯配置檔案
# vim /etc/mysql/my.cnf
在
[mysqld]
下面修改
bind-address
的值為192.168.1.3,預設值是127.0.0.1。
繼續在
[mysqld]
下方添加
character-set-server = utf8 #設定預設資料庫編碼為utf8,防止亂碼問題。
server-id = # 設定伺服器辨別,非常重要必須唯一。
#log_bin = /var/log/mysql/binlog/mysql-bin.log # 開啟binlog,主從複制就是基于這個的,如果僅擁有slave服務的話,可以不用開啟這個。如果是這個slave還要作為其他slave的master伺服器的話就需要開啟了
log-slave-updates # 可以讓slave扮演其它slave的master
slave-skip-errors=all
slave-net-timeout=
最後儲存退出,重新開機服務。
指定master
在slave伺服器上,通過mysql用戶端登入伺服器,依次執行以下指令:
$ mysql -uroot -p
mysql> stop slave;
mysql> change master to master_host='192.168.1.2',master_user='child',master_password='lu123',master_log_file='mysql-bin.000232', master_log_pos=;
mysql> start slave;
注意:master_log_file和master_log_pos就是我們上面在master伺服器通過下面指令所檢視到的值:
mysql> show master status;
最後看一下狀态,是否有出現錯誤:
mysql> show slave status \G;
出現這個表示正常:
驗證
好了,基本上配置都完成了。我們最後再測試驗證一下。
- 首先在master主伺服器上建立一個資料庫和表,并且插入測試資料,看下slave伺服器是否有同步過來。
mysql> CREATE DATABASE demo;
mysql> USE demo;
mysql> CREATE TABLE student(id INT PRIMARY KEY AUTO_INCREMENT, name varchar());
mysql> INSERT INTO student(name) VALUES ('小明'), ('小盧');
- 然後在slave伺服器上登入mysql,并執行以下指令:
mysql> SHOW DATABASES;
mysql> USE demo;
mysql> SHOW TABLES;
mysql> SELECT * FROM student;
執行以上指令,可以檢視到在master服務上建立的内容都已經同步到slave上面了。
但是最後需要注意,如果是在slave伺服器上的增删查改,其master主伺服器是不會同步的。
如果需要兩邊都同步,那就要做Master-Master結構了,這又是另外一篇啦。
總結
我覺得,一般的小型公司這樣的結構就已經差不多足夠了,如果是中大型的話,就需要更複雜的架構了。後面需要學習的地方還很多啊,共勉。