2-16 mysql主從復制
2-16 mysql主從復制
1. 部署MYSQL主從同步 <M-S>
環境:mysql版本一致,均為5.7.18
master xuegod4 ip 192.168.10.34 數據庫密碼 yourpasswd
slave xuegod5 ip 192.168.10.35 數據庫密碼 yourpasswd
1.1 配置主數據庫xuegod4
1.1.1 創建需要同步的數據庫:
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
service mysqld stop
1.1.2 配置my.cnf
vim /etc/my.cnf
log-bin=mysql-bin-master #啟用二進制日誌
server-id=1 #本機數據庫ID 標示
binlog-do-db=HA #可以被從服務器復制的庫。二進制需要同步的數據庫名
binlog-ignore-db=mysql #不可以被從服務器復制的庫
1.1.3 重啟mysql
service mysqld restart
1.1.4 授權
01. mysql> grant replication slave on *.* to [email protected]
註:這裏如果報錯說密碼太簡單,可以修改密碼策略
mysql> set global validate_password_policy=0
授權完後刷新權限:
mysql> flush privileges;
1.1.5 查看狀態信息
mysql> show master status;
1.1.6 查看二進制日誌
查看mysql數據目錄,yum方式安裝數據目錄為/var/lib/mysql
[[email protected] ~]# ls /var/lib/mysql
mysql> show binlog events\G
復制前要保證同步的數據庫一致
[[email protected] ~]# mysqldump -uroot -pyourpasswd HA >HA.sql #可以導出數據庫
將導出的數據庫傳給從服務器,方法:
[[email protected] ~]# scp HA.sql 192.168.10.35:/root/
1.2 配置從數據庫服務器xuegod5
1.2.1 兩臺數據庫服務器mysql版本要一致
mysql> show variables like ‘%version%‘;
1.2.2 測試連接到主服務器是否成功
[[email protected] ~]# mysql -uslave -pyourpasswd -h 192.168.10.34
看不到HA數據庫,是因為只有復制的權限,沒有讀的權限。
1.2.3 導入數據庫,和主數據庫服務器保持一致
mysql> create database HA;
[[email protected] ~]# mysql -uroot -pyourpasswd HA<HA.sql
1.2.4 修改從服務器配置文件
從服務器沒必要開啟bin-log日誌
[[email protected] ~]# service mysqld stop
[[email protected] ~]# vim /etc/my.cnf
master-host=192.168.10.34 #指定主服務器IP地址
master-user=slave #指定定在主服務器上可以進行同步的用戶名
master-password=yourpasswd #密碼
mysql版本低於5.7版本才需要配置以上三句。5.7版本只需要配置:
server-id=2 #從服務器ID號,不要和主ID相同 ,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。
可以認為server-id值類似於IP地址:這些ID值能唯一識別復制服務器群集中的每個服務器實例。
1.2.5 配置從數據庫服務器
[[email protected] ~]# service mysqld restart #重啟mysql服務
mysql>stop slave; #停止slave
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave; #啟動slave
mysql> show slave status\G #查看狀態
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
再到主服務器上查看狀態:
mysql> show processlist \G
1.3 插入數據測試同步
在主數據庫服務器插入數據:
mysql> insert into T1 value(6,‘yehailun‘);
Query OK, 1 row affected (0.05 sec)
在從數據庫服務器上查詢
mysql> select * from T1;
+------+----------+
| id | name |
+------+----------+
| 6 | yehailun |
+------+----------+
1 row in set (0.00 sec)
1.4 排錯
如果遇到主從不同步,看一下主從bin-log的位置,然後再同步。
在主服務器上看二進制日誌事件列表
mysql> show binlog events \G
從服務器執行MySQL命令下:
mysql> stop slave;
Query OK, 0 rows affected (0.03 sec)
mysql> change master to master_log_file=‘mysql-bin-master.000001‘,master_log_pos=1117;
Query OK, 0 rows affected (0.04 sec)
#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄回歸,達到同步的效果
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes就代表在同步
重啟從服務器,再查看狀態:
停止從服務器slave stop;
開啟從服務器slave start;
排錯思路:
1、二進制日誌沒有開啟
2、IPTABLES 沒有放開端口
3、對應的主機 IP地址寫錯了
SQL線程出錯
1、主從服務器數據庫結構不統一
出錯後,數據少,可以手動解決創建插入,再更新slave狀態。
註:如果主上誤刪除了。那麽從上也就誤刪除了。 #因此主上要定期做mysqldump備份。
2. 部署MYSQL主主雙向主從復制 M-M(恢復快照再實驗)
通過mysql主主:進行mysql 雙向同步數據庫HA的配置
mysql主:服務端:xuegod4 IP:192.168.10.34
mysql主:服務端:xuegod5 IP:192.168.10.35
先清空一下二進制日誌,mysql> reset master
在上面主從的基礎上進行配置
2.1 創建需要同步的數據庫
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
2.2 配置xuegod4
它有兩種身份:
身份1: xuegod5的主,身份2: xuegod5的從。
2.2.1 修改配置文件
[[email protected] ~]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin-master
binlog-do-db=HA
binlog-ignore-db=mysql #避免同步mysql用戶相關配置
2.2.2 重啟mysql服務
[[email protected] ~]# service mysqld restart
查狀態
mysql> show master status;
2.2.3 授權給xuegod5做從
修改密碼策略
mysql> set global validate_password_policy=0;
mysql> grant replication slave on *.* to [email protected] identified by ‘yourpasswd‘;
如果不符合密碼要求報錯修改如下(5.7版本)
mysql> set global validate_password_policy=0; #定義復雜度
mysql> set global validate_password_length=1; #定義長度 默認是8
刷新權限
mysql> flush privileges;
2.3 配置xuegod5
2.3.1 修改配置文件
mysql 5.1的配置
master-host=192.168.1.64 #指定主服務器IP地址
master-user=slave64 #指定定在主服務器上可以進行同步的用戶名
master-password=123456 #密碼
#master-port=3306 可以不寫
replicate-do-db=HA #要復制的數據庫
master-connect-retry=60 #斷點重新連接時間
mysql 5.7配置
[[email protected] ~]# vim /etc/my.cnf
server-id=2
log-bin=master-bin-slave
binlog-do-db=HA
binlog-ignore-db=mysql
2.3.2 重啟mysql服務
[[email protected] ~]# service mysqld restart
查看狀態;
mysql> show master status;
2.3.3 測試一下從帳號登陸是否正常
[[email protected] ~]# mysql -uslave -pyourpasswd -h 192.168.10.34
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql>
2.3.4 授權給xuegod4做從
mysql> grant replication slave on *.* to [email protected] identified by ‘yourpasswd‘;
如果不符合密碼要求報錯修改如下(5.7版本)
mysql> set global validate_password_policy=0; #定義復雜度
mysql> set global validate_password_length=1; #定義長度 默認是8
刷新權限
mysql> flush privileges;
2.4 指定xuegod5的master
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave;
mysql> show slave status\G
2.5 指定xuegod4的master
mysql> change master to master192.168.10.35‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave;
2.6 xuegod4上查看slave的狀態
mysql> show slave status\G
2.7 xuegod5上查看slave的狀態
mysql> show slave status\G
2.8 插入數據測試
2.8.1 在xuegod4上插入數據,在xuegod5上查看
mysql> use HA
Database changed
mysql> insert into T1 values(1,‘zhangsan‘);
Query OK, 1 row affected (0.02 sec)
2.8.2 在xuegod5上插入數據,在xuegod4上查看
mysql> insert into T1 value(2,‘lisi‘);
Query OK, 1 row affected (0.06 sec)
註意:這種M-M架構沒有什麽好處,他往往給我們產生一種實現了負載均衡的錯覺
3 部署M-S-S模型
環境:
xuegod4 master mysql5.7.18 192.168.10.34
xuegod5 slave中繼 mysql5. 7.18 192.168.10.35
xuegod6 slave mysql5. 7.18 192.168.10.36
3.1 創建需要同步的數據庫
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
3.2 部署master xuegod4
3.2.1 授權
修改密碼策略:
mysql> set global validate_password_policy=0;
在主服務上授權用戶:
mysql> grant replication slave on *.* to [email protected] identified by ‘yourpasswd‘;
刷新權限:
mysql> flush privileges;
3.2.2 修改配置
[[email protected] ~]# vim /etc/my.cnf
server-id = 1
binlog-do-db = HA
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1
binlog-format=row
重啟服務:
[[email protected] ~]# service mysqld restart
3.2.3 導出主服務器HA完整備份, 拷貝到 中繼 和slave
[[email protected] ~]# mysqldump -uroot -pyourpasswd HA -B>HA.sql #使用-B導入數據庫的時候不用新建庫
[[email protected] ~]# scp HA.sql 192.168.10.35:/root
[[email protected] ~]# scp HA.sql 192.168.10.36:/root
3.3 部署slave中繼xuegod5
3.3.1 導入數據庫
mysql> create database HA;
[[email protected] ~]# mysql -uroot -pyourpasswd HA<HA.sql
3.3.2 修改配置
[[email protected] ~]# vim /etc/my.cnf
server-id=2
binlog-do-db=HA
log-bin=mysql-bin-slave1
binlog-ignore-db=mysql
binlog-format=row
log-slave-updates=1 #把它從relay-log當中讀取出來的二進制日誌並且這本機上執行的操作也記錄這自己的二進制日誌裏面,這樣才能使第三臺slave通過中繼slave讀取到相應數據變化
重啟服務:
[[email protected] ~]# service mysqld restart
3.3.3 授權
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘repl‘,master_password=‘yourpasswd‘;
mysql> start slave;
查一下狀態:
再授權一個用戶給slave(xuegod6)
mysql> set global validate_password_policy=0; #修改密碼策略
mysql> grant replication slave on *.* to [email protected] identified by ‘yourpasswd‘;
刷新權限
mysql> flush privileges;
3.3.4 導出數據庫
[[email protected] ~]# mysqldump -uroot -pyourpasswd -B HA>HA2.sql
發送到xuegod6上
3.4 部署slave xuegod6
3.4.1 導入數據
[[email protected] ~]# mysql -uroot -pyourpasswd <HA2.sql
3.4.2 修改配置
[[email protected] ~]# vim /etc/my.cnf
server-id=3
log-bin=mysql-bin-slave2
binlog-format=row
重啟服務:
[[email protected] ~]# service mysqld restart
3.4.3指定slave中繼作為主
mysql> change master to master_host=‘192.168.10.35‘,master_user=‘repl‘,master_password=‘yourpasswd‘;
mysql> start slave;
3.5 從MASTER上插入數據測試
mysql> create table mermber(id int(4) unsigned not null auto_increment,name varchar(20),primary key(id));
mysql> insert into mermber values(1,‘天屠‘),(2,‘孤葉‘);
2-16 mysql主從復制