mysql 主从复制 和基于gtid的mysql主从复制
主從復制
原理:
mysql 無需借助第三方工具,而是其自帶的同步復制功能,另外一點,mysql 的主從
復制并不是從硬盤給上文件直接同步,而是邏輯的 binlog 日志同步到本地的應用執行的過
程。 數據從一個 mysql 數據庫(master)復制到另一個 mysql 數據庫(slave),在
master 與 slave 之間實現整個主從復制的過程是由三個線程參與完成的。其中有兩個線程
(SQL 線程和 IO 線程)在 slave 端,另一個線程(I/O 線程)在 master 端。要實現 mysql
的主從復制,首先必須打開 master 端的 binlog 記錄功能,否則將無法實現。因為整個復
制過程實際上就是 slave 從 master 端獲取 binlog 日志,然后再在 slave 上以相同順序執
行獲取的 binlog 日志中的記錄的各種 SQL 操作。
原理圖:
主從復制用途:
- 實時災難備份,故障切換
- 讀寫分離,分擔master的負載
- 備份,防止業務受影響
主從復制條件:
- master開啟binlog日志
- master和slave的server-id不同
- slave主動連接master
?
主從復制存在的問題:
- master宕機后數據庫的數據可能丟失
- 主庫寫壓力時會出現復制延時的可能,導致數據不能完全備份
解決方法:
- 半同步復制-克服數據丟失
- 并行復制-克服復制延
環境:
master(主數據庫): test3(172.25.1.3)
slave?? (從數據庫): test4(172.25.1.4)
主從數據庫版本最好一致
主從數據庫內的數據需保持一致
master---slave 配置相同如下
Master(test3):
[root@test3 ~]# ls??
mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@test3 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@test3 ~]# rm -rf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar???????
[root@test3 ~]# yum install * -y
[root@test3 ~]# vim /etc/my.cnf
[root@test3 ~]# /etc/init.d/mysqld start
//打開數據庫
[root@test3 ~]# grep "temporary password" /var/log/mysqld.log
[root@test3 ~]# mysql_secure_installation
[root@test3 ~]# mysql -p??????????????? //登陸數據庫
slaver(test4)
[root@test4 ~]# ls??
mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@test4 ~]# tar xf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar
[root@test4 ~]# rm -rf mysql-5.7.17-1.el6.x86_64.rpm-bundle.tar???????
[root@test4 ~]# ls
[root@test4 ~]# yum install * -y
[root@test4 ~]# vim /etc/my.cnf
[root@test4 ~]# /etc/init.d/mysqld start??????????? //打開數據庫,可能出現報錯
Initializing MySQL database:
2018-10-18T06:10:52.204846Z 0
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
Please use --explicit_defaults_for_timestamp server option (see
documentation for more details).
2018-10-18T06:10:52.206242Z 0 [ERROR] --initialize specified but
the data directory has files in it. Aborting.
2018-10-18T06:10:52.206268Z 0 [ERROR] Aborting
[FAILED]
//報錯原因是已經有了 data 數據
解決方案:
[root@test4 ~]# vim /etc/my.cnf
[root@test4 ~]# cd /var/lib/mysql
[root@test4 mysql]# ls
ib_buffer_pool ibdata1 ib_logfile0
[root@test4 mysql]# ll????????????? //確實有數據
total 110596
-rw-r----- 1 mysql? mysql??? 215 Oct 18 13:18 ib_buffer_pool
-rw-r----- 1 mysql mysql 12582912 Oct 18 13:18 ibdata1
-rw-r----- 1 mysql mysql 50331648 Oct 18 13:18 ib_logfile0
-rw-r----- 1 mysql mysql 50331648 Oct 18 13:18 ib_logfile1
[root@test4 mysql]# cd ..
[root@test4 lib]# mv mysql mysql.back???????????? //備份數據
解釋:由于這里是練習,故便于實驗將原本數據刪除
[root@test4 mysql]# rm -rf *
[root@test4 mysql]# /etc/init.d/mysqld start
Initializing MySQL database:????????????????????????????? ? [ OK ]
Installing validate password plugin:???????????????????? [ OK ]
Starting mysqld:??????????????????????????????????????????????????? [ OK ]
[root@test4 mysql]# grep password /var/log/mysqld.log
2018-10-18T06:21:22.660701Z 1 [Note] A temporary password is
generated for root@localhost: a,NqiGtfZ7D&
[root@test4 mysql]# mysql_secure_installation
test3 給用戶名和可鏈接網段及授權密碼(創建用戶并授權)
[root@test3 ~]# mysql -p
Enter password:
mysql> grant replication slave on *.* to repl@'172.25.1.%' identified by '@Caoxingxing123';?????? //master給slave做授權,讓slave連接
Query OK, 0 rows affected, 1 warning (0.39 sec)
mysql> quit
Bye
其中,master_user 為 repl
test4(從庫)嘗試連接
[root@test4 mysql]# mysql -u repl -p -h 172.25.1.3
Enter password:??????????????????? //輸入 master 的數據庫內中設置的驗證密碼
ERROR 2003 (HY000): Can't connect to MySQL server on '172.25.1.3' (113)
//此時可能會有報錯
//報錯原因有可能是沒關防火墻。分別將防火墻關閉,再次嘗試連接。
[root@test3 ~]# /etc/init.d/iptables stop
[root@test4 ~]# /etc/init.d/iptables stop
[root@test4 ~]# mysql -u repl -p -h 172.25.1.3??????????? //連接成功。
從庫連接主庫
登陸slave數據庫 mysql 會話,執行同步 SQL 語句(需要主服務器主機名,登陸憑
據,二進制文件的名稱和位置),其中 master_log_file 和 master_log_pos 參
數不固定,其根據主庫參數寫。
master:????????? //查看master的二進制日志
slave:
[root@test4 ~]# mysql -p
mysql>change master to master_host='172.25.1.3',master_user='repl',master_password='@ Caoxingxing123',master_log_file='mysql-bin.000005',master_log_pos=738;??????????????????????????????? //slave進行change
Query OK, 0 rows affected, 2 warnings (1.25 sec)
mysql> start slave;?????????????? //啟動 slave 同步進程
Query OK, 0 rows affected (0.16 sec)mysql> show slave status\G??????????????? //查看 slave 狀態
接下來通過驗證,證明是否可以實現主從復制的功能,證明方式有兩種,分別如下:
???????? 1.在 master 數據庫的 westos 數據庫的一張數據表中插入數據,slave 的
westos 數據庫的相同數據表中查看是否有新增的相同數據,從而來驗證能否實
現主從復制功能。
???????? 2.關閉 slave,然后再修改 master 內容,看 slave 內容是否也相應修改。
驗證 1:
未插入時:
master:
salve:
現在給主數據庫創建數據庫westos,并插入數據
主 mysql:
mysql> create database westos;
mysql> use westos???????????????? //切換到 westos 數據庫
Database changed
mysql> create table userlist(
-> username varchar(10) not null,
-> password varchar(20) not null);???????????????????? //創建表userlist 及插入數據
此時slave:
可見,列表 userlist 中的數據已經由master同步到 slave,實現主從復制功能。
?
驗證 2:
slave:
mysql> stop slave;??????????? //停掉slave
master:
mysql> insert into userlist values ('lib',678);
mysql> insert into userlist values ('lily',789);
mysql> select * from userlist;????????? //查看列表的數據內容
slave:
mysql> select * from userlist;
此時,slave 并未將數據同步過來,同樣也可以說明其實現了主從復制功能。
基于 GTID 的主從復制
優點:
????? 因為不用手工設置日志偏移量, 可以很方便地進行故障轉移,如果啟用
log_slave_updates 那么從庫不會丟失主庫上的任何修改。
缺點:
???? 對執行的 SQL 有一定限制,僅支持 MySQL 5.6 之后的版本, 而且不建議使用早期 5.6 版本。
配置master和slave:
在兩邊的配置文件/etc/my.cnf 都加上:
gtid_mode=ON
enforce-gtid-consistency=true
并重啟數據庫
master:
[root@test3 ~]# vim /etc/my.cnf
[root@test3 ~]# /etc/init.d/mysqld restart
slave:
[root@test4 ~]# vim /etc/my.cnf
[root@test4 ~]# /etc/init.d/mysqld restart
[root@test4 ~]# mysql -p??????????? //關掉 slave
mysql> change master to master_host='172.25.1.3' master_user='repl', master_password='@Caoxingxing123',
MASTER_AUTO_POSITION=1;
mysql> start slave;??????????????????? //開啟 slave
mysql> show slave status\G;????????? //查看slave 的狀態,狀態正常
master:
??????????? 給 master 數據庫插入內容進行測試。
mysql> use westos
Database changed
mysql> create table gtidlist(
-> username varchar(10) not null,
-> password varchar(20) not null);
mysql> insert into gtidlist values ('gtid1',111);
mysql> insert into gtidlist values ('gtid2',222);
mysql> select * from gtidlist;
slave:
由上可見,數據可以同步過來,實現了主從復制。
總結
以上是生活随笔為你收集整理的mysql 主从复制 和基于gtid的mysql主从复制的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: proxy实现 mysql 读写分离
- 下一篇: Openstack安装部署