您好,登錄后才能下訂單哦!
復(fù)制有以下三個步驟:
(a)主服務(wù)器把數(shù)據(jù)更改記錄到二進(jìn)制日志中。(這叫做二進(jìn)制日志事件(binary log events)。)
(b)從服務(wù)器把主服務(wù)器的二進(jìn)制日志事件拷貝到自己的中繼日志(relay log)中。
(c)從服務(wù)器重放中繼日志中的事件,把更改用到自己的數(shù)據(jù)上。
第一步:在主服務(wù)器上記錄二進(jìn)制日志。在每個更新數(shù)據(jù)的事務(wù)完成之前,主服務(wù)器都會把數(shù)據(jù)更改記錄到二進(jìn)制日志中。即使事務(wù)在執(zhí)行期間是交錯的,mysql也會串行地把事務(wù)寫入到二進(jìn)制日志中。在把事件寫入到二進(jìn)制日志之后,主服務(wù)器告訴存儲引擎提交事務(wù)。
第二步:從服務(wù)器把主服務(wù)器的二進(jìn)制日志拷貝到自己硬盤上,進(jìn)入所謂的“中繼日志(relay log)中。
它首先啟動一個工作線程,叫I/O線程。這個I/O線程開啟一個普通的客戶端連接,然后啟動一個特殊的二進(jìn)制日志轉(zhuǎn)儲進(jìn)程。這個轉(zhuǎn)儲進(jìn)程從主服務(wù)器的二進(jìn)制日志中讀取事件。它不會對事件進(jìn)行輪詢。如果它跟上了主服務(wù)器,就會進(jìn)入休眠狀態(tài),并等待有新事件發(fā)生時主服務(wù)器發(fā)出的信號。I/O線程把事件寫入從服務(wù)器的中繼日志中。
第三步:SQL從線程處理了該過程的最后一部分。該線程讀取了中繼日志,并且重放其中的事件,然后更新從服務(wù)器的數(shù)據(jù)。由于這個線程能跟上I/O線程,所以,中繼日志一般都是在操作系統(tǒng)的緩存中,因此中繼日志的開銷很低。同時SQL線程執(zhí)行的事件也可以被寫入從服務(wù)器自己的二進(jìn)制日志中。
主服務(wù)器 | 192.168.0.103 | mysqlserver |
從服務(wù)器 | 192.168.0.104 | mysqlslave |
l 2服務(wù)器mysql版本一致,初始化表,并在后臺啟動mysql
l 前提:關(guān)閉防火墻和selinux
l 可以實現(xiàn)基于實例級,數(shù)據(jù)庫級,表級別的復(fù)制, 本實驗的是實例級主從復(fù)制
l 復(fù)制優(yōu)勢:無需共享存儲,通過網(wǎng)絡(luò)傳輸變化的數(shù)據(jù)到從庫
#vi /etc/my.cnf //增加以下參數(shù)
[mysqld]
log-bin=mysql-bin //[必須]啟用二進(jìn)制日志
server-id=103 //[必須]服務(wù)器唯一ID,默認(rèn)是1,一般取IP最后一段
#vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin //[不是必須]啟用二進(jìn)制日志
server-id=104 //[必須]服務(wù)器唯一ID,默認(rèn)是1,一般取IP最后一段
/etc/init.d/mysql restart
create user 'rep1'@'192.168.0.%' identified by 'rep1234';
GRANT REPLICATION SLAVE ON *.* TO 'rep1'@'192.168.0.%';
//一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全
該用戶信息不會復(fù)制到從庫上
>show master status;
注:執(zhí)行完此步驟后不要再對主服務(wù)器表進(jìn)行修改,防止主服務(wù)器狀態(tài)值變化
>change master to master_host='192.168.0.103',master_port=3306,master_user='rep1',master_password='rep1234',master_log_file='mysql-bin.000001',master_log_pos=350; //注意不要斷開,350數(shù)字前后無單引號。
Mysql>start slave; //啟動從服務(wù)器復(fù)制功能
mysql> show slave status\G
注:Slave_IO及Slave_SQL進(jìn)程必須正常運行,即YES狀態(tài),否則都是錯誤的狀態(tài)(如:其中一個NO均屬錯誤)。
Master端查看:
主服務(wù)器Mysql,建立數(shù)據(jù)庫,并在這個庫中建表插入一條數(shù)據(jù):
mysql> create database hi_db;
Query OK, 1 row affected (0.00 sec)
mysql> use hi_db;
Database changed
mysql> create table hi_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into hi_tb values(001,'bobu');
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
從服務(wù)器Mysql查詢:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db | //I'M here,大家看到了吧
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)
mysql> use hi_db
Database changed
mysql> select * from hi_tb; //查看主服務(wù)器上新增的具體數(shù)據(jù)
+------+------+
| id | name |
+------+------+
| 1 | bobu |
+------+------+
1 row in set (0.00 sec)
1) 從庫 停止 IO_THREAD 線程
mysql> stop slave IO_THREAD;
2) 激活從庫
root@localhost:francs>stop slave;
root@localhost:francs>reset master;
root@localhost:francs>reset slave;
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)
3) 重啟從庫
[root@mysqlslave ~]# /etc/init.d/mysqld restart
mysql> show slave status\G
Empty set (0.00 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 360
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
4) 從庫創(chuàng)建復(fù)制用戶
create user 'rep2'@'192.168.0.%' identified by 'rep1234';
GRANT REPLICATION SLAVE ON *.* TO 'rep2'@'192.168.0.%';
//一般不用root帳號,“%”表示所有客戶端都可能連,只要帳號,密碼正確,此處可用具體客戶端IP代替,如192.168.145.226,加強安全
5) 原主庫103上操作
將原來主庫變?yōu)閺膸?/font>
CHANGE MASTER TO
MASTER_HOST='192.168.0.104',
MASTER_PORT=3306,
MASTER_USER='rep2',
MASTER_PASSWORD='rep1234',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=360;
mysql> start slave;
mysql> show slave status\G
6) 復(fù)制數(shù)據(jù)測試
在104原從庫現(xiàn)主庫上插入數(shù)據(jù)
在103原主庫現(xiàn)從庫上查詢
目的:將之前的手動切換再回切
103回切回主
104回切回從
1) 103停止從庫IO線程
mysql> stop slave IO_THREAD;
mysql> show slave status\G
2) 激活103從庫
root@localhost:francs>stop slave;
root@localhost:francs>reset master;
root@localhost:francs>reset slave;
mysql> show binary logs;
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000001 | 106 |
+------------------+-----------+
1 row in set (0.00 sec)
3) 重啟103從庫和查詢
[root@mysqlserver ~]# /etc/init.d/mysqld restart
mysql> show slave status\G
Empty set (0.00 sec)
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000002
Position: 106
Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)
4) 104上操作
將原來主庫變?yōu)閺膸?/font>
CHANGE MASTER TO
MASTER_HOST='192.168.0.103',
MASTER_PORT=3306,
MASTER_USER='rep1',
MASTER_PASSWORD='rep1234',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=106;
mysql> start slave;
mysql> show slave status\G
5) 測試
在103上更新記錄
mysql> insert into hi_tb values ('5','eee');
Query OK, 1 row affected (0.00 sec)
104上查詢
1) 模擬主宕機(jī)
103宕機(jī)
104查看
2) 103恢復(fù)
復(fù)制恢復(fù)
3) 104宕機(jī)
103主庫不受影響
4) 104恢復(fù)
啟動104庫,復(fù)制恢復(fù)
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。