1,環境準備
安裝mysql
主:192.168.1.50
從:192.168.1.51
#下載
wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
#安裝客戶端
yum -y install mysql57-community-release-el7-11.noarch.rpm
#查看安裝狀態
yum repolist enabled | grep mysql.*
#安裝mysql服務
yum install mysql-community-server
#重啓mysql服務
systemctl start mysqld.service
#查看mysql服務狀態
systemctl status mysqld.service
#查看初始密碼
grep "password" /var/log/mysqld.log
#登錄
mysql -uroot -p
#關閉複雜密碼驗證
set global validate_password_policy=LOW;
#關閉密碼長度驗證
set global validate_password_length=6;
#修改用戶密碼
ALTER USER 'root'@'localhost' IDENTIFIED BY '123456';
#超級管理員授權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
#刷新配置
FLUSH PRIVILEGES;
#開機自啓服務
systemctl enable mysqld
systemctl daemon-reload
二,mysql基於日誌點的複製
1,在主DB上創建複製賬號
create user repl@'192.168.1.%' identified by '123456';
2,授權
#允許該用戶訪問主庫和從庫,這是一個全局權限,必須對所有數據庫設置該權限
grant replication slave on *.* to repl@'192.168.1.%';
3,配置主數據庫服務器
vim /etc/my.cnf
#開啓二進制日誌,並指定存儲目錄(mysql-bin),如果未啓動二進制日誌,則重啓後才能生效
log_bin=mysql-bin
#需要指定serverid,在複製集羣中必須唯一,建議:server-id 可以用主機ip的後幾段
server-id=50
binlog_format=row
4,配置從數據庫服務器
vim /etc/my.cnf
log_bin=mysql-bin
binlog_format=row
server-id=51
relay_log=mysql-relay-bin
#log_slave_update=on
# 安全配置參數,防止從寫入
read_only=on
relay_log 啓動了主從複製,該參數就會默認啓動,但在默認情況下,參數名字是主機名字,如果因爲某種原因更改了主機名的命名策略,這時在啓動了從服務器的複製鏈路的就會報找不到原來的中繼日誌的錯誤,從而中斷主從複製的鏈路,所以要更改中繼日誌的名字,這樣就不會造成複製鏈路的中斷了
log_slave_update=on 決定是否要把sql線程存放的中繼日誌記錄到從服務器本機的二進制日誌中,如果後續要做鏈路複製,要把該從服務器作爲其他從的主服務器,該參數必須配置
5,初始化從服務器的數據
通過主數據庫的備份,完成從數據庫的初始化
備份方式有兩種:
<1>mysql官方提供的工具mysqldump
使用該工具對mysql進行備份時,會把所有的數據庫對象找出來存儲爲一個sql文件
--single-transaction :保證數據事務一致性,需要對數據庫加鎖,會造成阻塞,這樣就會影響數據庫的併發性,在使用頻繁的系統中,使用這種方法會造成大量的阻塞
--master-data參數,用來記錄二進制日誌偏移量的信息
--混合使用表的話,則要加上local-tables參數
mysqldump -u root -p --single-transaction --master-data --triggers --routines --all-databases > all.sql
將sql文件傳到從庫上
scp all.sql [email protected]:/home
從服務器導入數據
mysql -uroot -p < all.sql
<2>xtrabackup –slave-info 熱備工具。
使用innodb存儲引擎是不會阻塞服務器的操作,非innodb的表同樣會進行鎖操作,所以建議只使用innodb的表
--slave-info也可以記錄主數據庫二進制信息,以及日誌數據偏移量的信息
注意:如果主從數據庫版本一致,可以備份所有數據庫,包括系統數據庫,如果不一樣,則只備份業務數據庫即可,否則會造成未知的bug
6,啓動複製鏈路
主從服務器配置完成後,可以準備啓動我們的複製鏈路了。需要在從服務器上操作
change master to master_host='192.168.1.50',master_user='repl',master_password='123456',MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=946;
最後這句可以在導出的文件中查找。
master_host主服務器的ip地址
用於數據庫複製的用戶和密碼
MASTER_USER=’repl’,
MASTER_PASSWORD=’PWD’,
備庫要從主庫的什麼位置開始同步二進制日誌的文件名和偏移量
MASTER_LOG_FILE=’MYSQL_LOG_FILE_NAME’,
MASTER_LOG_POS=4;
從數據庫查看複製鏈路狀態(可以看到,複製鏈路已經好了,但是還沒有啓動)
show slave status \G
啓動
start slave
可以看到,io進程和sql進程已經都啓動起來了
從庫使用show processlist 查看服務線程。兩個關於複製有關的線程,一個IO線程,一個SQL線程。
mysql> show processlist;
+----+-------------+---------------------+-------+---------+------+--------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------------+---------------------+-------+---------+------+--------------------------------------------------------+------------------+
| 3 | root | 192.168.1.161:54964 | NULL | Sleep | 292 | | NULL |
| 4 | root | 192.168.1.161:54967 | demo1 | Sleep | 1158 | | NULL |
| 5 | root | localhost | NULL | Sleep | 559 | | NULL |
| 7 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 8 | system user | | NULL | Connect | 156 | Connecting to master | NULL |
| 9 | system user | | NULL | Connect | 156 | Slave has read all relay log; waiting for more updates | NULL |
+----+-------------+---------------------+-------+---------+------+--------------------------------------------------------+------------------+
6 rows in set (0.00 sec)
數庫使用show processlist 查看服務線程
主服務器啓動了binlog_dump線程,用於讀取主數據庫二進制日誌信息的
service iptables stop
7.驗證複製效果:
在主庫執行。
1.創建一個表。
2.插入兩條記錄。
在從服務器上查詢。
發現數據同步了。
優點:
1.是mysql最早支持的複製技術,BUG相對較少。
2.對SQL查詢沒有任何限制。
3.故障處理比較容易。
缺點:
故障轉移時重新獲取新主的日誌點信息比較困難。
指定偏移量錯誤的時候會可能出現問題。
三,mysql基於GTID的複製
從MYSQL5.6 開始,mysql開始支持GTID複製。
1,基於日誌點複製的缺點
從那個二進制日誌的偏移量進行增量同步,如果指定錯誤會造成遺漏或者重複,導致數據不一致。
基於GTID複製:
- 從服務器會告訴主服務器已執行的事務的GTID值。
- 主庫會告訴從哪些GTID事務沒有被執行。
同一個事務在指定的從庫執行一次。
2,什麼是GTID
GTID即全局事務ID,器保證爲每一個在主上提交的事務在複製集羣中可以生成一個唯一的ID.
GTID=source_id:transaction_id
source_id:是主庫的server UUID,在數據目錄的auto.cnf 文件中。
transaction_id: 從1開始的一個序列。
3,基於GTID複製的步驟
在主DB服務器上建立複製帳號。在主庫執行命令
create user repl@'192.168.1.%' identified by '123456';
grant all privileges on *.* to repl@'192.168.1.%' identified by '123456';
4,配置主數據庫服務器
vim /etc/my.cnf
log_bin=mysql-bin
server_id=50
gtid-mode=on
#強制事務一致性,保證事務的安全
#注意如果使用了基於事務點日誌配置下面兩種情況不能使用:
#1.create table 。。select
#2.在事務中使用create temporary table 建立臨時表,使用關聯更新事務表和非事務表。
enforce_gtid_consistency
#在從服務器記錄主服務器發過來的修改日誌(5.7之前必須有),增加了IO負載
log-slave-updates=on
5,配置從數據庫服務器
vim /etc/my.cnf
server_id=51
log_bin=mysql-bin
relay_log=mysql-relay-bin
gtid-mode=on
enforce-gtid-consistency
#建議配置
read_only=on
#保證從服務器數據安全性建議配置
#從服務器連接主服務器的信息和中繼日誌存放咱 master_info,和relay_log中。
master_info_repository=TABLE
relay_log_info_repository=TABLE
6.初始化從服務器數據
#從主庫導出數據
mysqldump --single-transaction --master-data=2 --all-databases --triggers --routines --events -uroot -p >all.sql
#可以使用 scp 命令將數據從主庫機器copy 到從庫:
scp all.sql [email protected]:/home
#從庫導入數據
mysql -uroot -p < all.sql
7.啓動基於GTID的複製
change master to master-host=’192.168.1.50’,master_user=’repl’,master_password=’123456’,master_auto_position=1
可能報錯的情況:
@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty
在命令行下執行命令:
reset master;
後重啓mysql 服務。
啓動複製
start slave;
查看狀態
show slave status \G;
8.測試同步
1.在主庫創建一張表,插入記錄。
2.在從庫查詢驗證是否正確,經驗證配置正確。