MySQL Replication 概述
MySQL Replication 俗稱MySQL AB複製(主從,雙機熱備),從庫以必定的頻率去讀取主庫的二進制日誌文件,按照日誌中記錄對從庫進行一樣的操做,以達到同步效果。html
MySQL 支持的複製類型
基於語句的複製 在主服務器上執行的SQL語句,在從服務器上執行一樣的語句,MySQL默認採用基於語句的複製,效率比較高
基於行的複製 把改變的內容複製過去,而不是把命令在從服務器上執行一遍
混合類型的複製 默認採用基於語句的複製,一旦發現基於語句沒法精確複製時,就會採用行mysql
複製的工做過程
1.在每一個事務更新完數據完成以前,Master在二進制日誌(Binary log,binlog)記錄這些改變,寫入二進制日誌完成後,Master通知存儲引擎提交事務
2.Slave將Master的Binary log複製到其中中繼日誌,首先Slave開始一個工做線程-I/O線程在Master上打開一個普通的鏈接,而後開始Binlog dump process,Binlog dump process從Master的二進制日誌中讀取事件,若是已經跟上Master,它會催眠並等待Master產生新的事件,I/O線程將這些事件寫入中繼日誌。
3.SQL Slave Thread(SQL從線程)處理該過程的最後一步,SQL線程從中繼日誌讀取事件,並重放其中的事件而更新Slave的數據,使其與Master中的數據一致,只要該線程與I/O線程保持一致,中繼日誌一般會在OS的緩存中,因此中繼日誌的開銷很小。sql
1:192.168.16.238 主mastershell
192.168.16.239 從slave數據庫
[root@shell ~]# cat /etc/issue
Red Hat Enterprise Linux Server release 6.3 (Santiago)
Kernel \r on an \m緩存
1)經過yum安裝mysql安全
yum -y install mysql 安裝客戶端服務器
yum -y install mysql-server 安裝服務端oracle
yum install mysql-develpost
[root@oracle10g yum.repos.d]# rpm -qa |grep mysql
mysql-server-5.1.61-4.el6.x86_64
mysql-libs-5.1.61-4.el6.x86_64
mysql-devel-5.1.61-4.el6.x86_64
mysql-5.1.61-4.el6.x86_64
咱們能夠看到版本是5.1
service mysqld start
嘗試登錄mysql數據庫:
mysql數據庫結構展現:
2)給mysql建立一個密碼。
[root@oracle10g yum.repos.d]# mysqladmin -u root password 123456
3)service iptables stop
setenforce 0 關閉防火牆
4)創建時間同步,本次以master爲主
yum -y install ntp
vi /etc/ntpd.conf
server 127.127.1.0
fudge 127.127.1.0 stratum 8 在最下面加入本段參數,說明:127.127.1.0 本地硬件時鐘(因爲時間服務器同步須要大概5分鐘左右,若是在此期間執行ntpdate 61.129.42.44 會出現 8 Jun 20:57:14 ntpdate[22982]: no server suitable for synchronization found 的錯誤)
在slave服務端加入定時同步任務:1 1 * * * /usr/sbin/ntpdate 192.168.16.238 && /sbin/clock -systohc
5)配置master服務端
vi /etc/my.cnf
主機必須的配置項:
log-bin //自定義,好比 log-bin=mysql-bin
server_id //爲server起一個惟一的id,默認是1,推薦使用IP的最後一節。
從機必須的配置項:
server_id //爲server起一個惟一的id,默認是1,推薦使用IP的最後一節.
注意:通常,咱們也會爲從機設定log-bin,這是由於默認的log-bin文件是根據主機名命名的,一旦機器更改主機名就會出問題,再者保持主從機的配製一致也方便作主從機切換!
主機可選的配置項:(用於配置主機哪些庫會作二進制日誌用以Replicate)
binlog-do-db
binlog-ignore-db
從機可選的配置項:(用於配置從機會Replicate哪些庫和表)
replicate-do-db, replicate-ignore-db
replicate-do-table, replicate-ignore-table
replicate-wild-do-table
replicate-wild-ignore-table
重啓master服務端
service mysqld restart
建立Replication用戶,並賦權(使得用戶可使用SHOW MASTER STATUS和SHOW SLAVE STATUS命令,也就是說這個權限是用於授予帳戶監視Replication情況的權力,)
update user set hosts='192.168.16.%' where user='myslave_zdsoft';
replication slave: 用於複製型從屬服務器(從主服務器中讀取二進制日誌事件)
查看master狀態
供Slave DB鏈接時使用,記錄下File和Position的值
從庫鏈接主庫進行測試,若是鏈接成功說明主庫配置成功
(update user set host='%' where host='localhost';
FLUSH PRIVILEGES; )
mysqldump -u root -h127-p123456 --all-databases > /root/alldbbackup.sql導出數據庫
[root@shell ~]# mysql -u root -h 192.168.16.238 -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.1.61-log Source distribution
Copyright (c) 2000, 2011, 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>
將庫備份導入到從庫當中
scp ~/*.sql 192.168.16.239:~
導入備份
mysql -u root -p < /root/*.sql
在主庫建立一個test1的庫
create database test1;
在 Slave服務器受權,啓動從庫,進行主從庫數據同步
[root@shell ~]# mysql -u root -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.61 Source distribution
Copyright (c) 2000, 2011, 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> CHANGE MASTER TO
-> MASTER_HOST='192.168.16.238',
-> MASTER_USER='myslave_zdsoft',
-> MASTER_PASSWORD='654321',
-> MASTER_LOG_FILE='mysql-binlog.000019',
-> MASTER_LOG_POS=106;
Query OK, 0 rows affected (0.30 sec)
參數說明:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name', //主服務器的IP地址
-> MASTER_USER='replication_user_name', //同步數據庫的用戶
-> MASTER_PASSWORD='replication_password', //同步數據庫的密碼
-> MASTER_LOG_FILE='recorded_log_file_name', //主服務器二進制日誌的文件名(前面要求記錄的參數)
-> MASTER_LOG_POS=recorded_log_position; //日誌文件的開始位置(前面要求記錄的參數)
根據在主庫執行的show master status 填寫
start slave;
show slave status/G
如上圖所示,庫已經同步到從庫.
create table a(name varchar(12),year varchar(12)); 在test1庫裏,建立表
參數說明:
log-bin = mysql-bin #複製過程即 Slave 從 Master 端獲取該日誌再執行日誌記錄的操做
server-id = 1 #1 表明 master 服務
binlog-do-db = backup#要同步的庫 backup
binlog-ignore-db = mysql #不一樣步的庫,初始全部庫默認爲不一樣步,但爲了明確最好加上
server-id = 2 #2 表明 slave 服務
replicate-ignore-table = backup.tb2 #不一樣步 backup 庫的 tb2 表
skip-slave-start #防止複製隨着 mysql 啓動而自動啓動。即 slave 端的 mysql 服務重啓後需手動
來啓動主從複製(slave start) ,最好加上,slave 端數據庫服務重啓後手動啓動 slave 比較安全
若是 slave 服務也同時做爲另外一個 mysql 服務的 master 服務,則配置文件[mysqld] 節點內容還須要加上 log-slave-updates
1:測試log-bin 後面的參數是否能夠隨便填 ( 此參數跟slave配置的 relay-log-bin參數原理一致)
1):log-bin=mysql-master
show master status
mysql> show master status;
+---------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+--------------+------------------+
| mysql-master.000001 | 106 | | |
+---------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
咱們能夠看到file文件的名字變成了,mysql-master , log-bin參數爲bin-log文件的名的前綴
2)測試 binlog-do-db參數,
binlog-do-db=test2
加到master中
分別在master庫中建立test2 test3
create database test2;
create database test3;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| test |
| test1 |
| test2 |
+--------------------+
5 rows in set (0.00 sec)
能夠看到test2同步了,test3沒有同步
3)replicate-ignore-table = test2.b 並加入skip-slave-start參數,使之不隨mysql啓動而啓動
在slave服務器加入上述參數;
能夠看到skip-slave-start參數已經生效。
replicate-ignore-table = test2.b 參數也生效了
總結:通過本次配置,主從複製簡單來講就是slave經過配置的myslave_zdsoft(Replication)用戶,讀取master經過master配置的log-bin日誌文件,經過分析,插入到從庫中。