Replication是MySQL提供的數據庫同步複製功能,增強了MySQL數據庫的穩定性,對我們實現數據庫的容災、備份帶來了極大好處。優點是配置簡單並且MySQL自身的replicate消耗整體資源不到1%。
1.安裝MySQL
1)在linux鏡像中自帶mysql安裝包,找到:
mysql-server-5.1.61-4.el6.x86_64
mysql-libs-5.1.61-4.el6.x86_64
mysql-5.1.61-4.el6.x86_64
mysql-devel-5.1.61-4.el6.x86_64
2)以root用戶安裝MySQL:
[root@vmx80 11]# yuminstall mysql
[root@vmx80 11]# rpm-qa|grepmysql
mysql-server-5.1.61-4.el6.x86_64
mysql-libs-5.1.61-4.el6.x86_64
mysql-5.1.61-4.el6.x86_64
mysql-devel-5.1.61-4.el6.x86_64
[root@vmx80 11]#chkconfig–level 2345 mysqld on
3)mysql的默認目錄:
數據庫目錄:/var/lib/mysql
配置文件目錄:/usr/share/mysql
2.配置master
原理:
1、創建用於複製的數據庫用戶;
2、配置my.cnf;
3、通過dump方式把所需要備份數據庫表導出來傳到slave端。
步驟:
1)在指定庫中創建一張測試表測試同步複製:
[root@vmx80 mysql]#mysql -u root -p
mysql> use test
mysql> create tablecs8(id int);mysql> show tables;
mysql> insert intocs8 values(5);
2) 創建用於數據庫同步用戶replicate
mysql> grant allprivileges on *.* to 'replicate'@'10.1.1.2' identified by 'replicate';
使設置生效:
mysql> flushprivileges;
3) 停止Mysql服務
[root@vmx80 mysql]#service mysqld stop
4) 更改配置文件/etc/my.cnf
[root@vmx80 mysql]# vi/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
server-id=80
log-bin=mysql-bin
# 1master特有參數
binlog-do-db=test #如果是要同步多個數據庫可以在添加一條binlog-do-db=hive1
binlog_format=ROW
binlog-ignore-db=mysql
expire_logs_days=10 #binlog只保留最近10天的,超過10天爲過期自動被刪除
# 2下面是切換後作爲slave端需要設置的參數,且需註釋掉1中參數
relay_log=mysql-relay-bin
replicate-do-db=test
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#####標紅註釋
l Log-bin:啓動二進制日誌文件
l Binlog-do-db:二進制需要同步的數據庫名
l binlog-ignore-db=mysql:不同步的數據庫名
l Server-id:本機數據庫ID
l Binlog_format:一共有三種複製方式:ROW\STATEMENT\MIXED,默認是STATEMENT
5)通過dump方式導出備份庫表數據
[root@vmx80 mysql]# cd/var/lib/mysql
[root@vmx80 mysql]# mysqldump-uroot -p test >test.sql
[root@vmx80 mysql]# scp [email protected]:/var/lib/mysql/
6、 啓動mysql
[root@vmx80 mysql]#service mysqld start
3.配置slave
原理:
1)創建用於複製的數據庫用戶;
2)創建需要同步的數據庫;
3)配置my.cnf;
4)把master傳過來的dump導入數據庫;
步驟:
1) 創建用於複製的數據庫用戶:
[root@vmx81]# mysql-uroot -p
mysql> grant allprivileges on *.* to 'replicate'@'10.1.1.1' identified by 'replicate';
讓權限生效:
mysql> flushprivileges;
2) 創建需要同步的數據庫:
mysql> createdatabase test;--如果slave端沒有這個數據庫
3) 配置my.cnf:
[root@vmx81 /]# vi/etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
server-id=81
log-bin=mysql-bin
# 1 slave特有參數
relay_log=mysql-relay-bin
replicate-do-db=test #如果同步多個數據庫可以添加一條replicate-do-db=hive1
# 2 下面是切換後作爲master端需要設置的參數,且需註釋掉1中參數
binlog_format=ROW
binlog-do-db=test
binlog-ignore-db=mysql
expire_logs_days=10 #binlog只保留最近10天的,超過10天爲過期自動被刪除
####註釋:
l server-id爲數據庫ID,不要和同一個master-slave架構中的其他server-id重複
l log-bin啓用二進制文件
l relay_log啓用從庫二進制文件
l replicate-do-db同步的數據庫名`
4) 重啓mysql服務以應用配置文件更改項:
[root@vmx81 /]# service mysqldrestart
5) 導入master備份庫的dump文件:
[root@vmx81 /]#mysql -uroot -p test < test.sql
4.開啓同步複製:
1)在master端:
mysql> change masterto master_host='10.1.1.2',master_user='replicate', master_password='replicate', master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=106;
2) 在slave端:
mysql> change masterto master_host='10.1.1.1',master_user='replicate', master_password='replicate', master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=106;
其中各項參數含義如下:
l master_host master主機IP地址
l master-user數據同步的用戶
l master-password數據同步的用戶密碼
l master-port同步使用端口
l master_log_file開始同步時讀取的初始master二進制文件,通過master端執行show master status查看得到
l master_log_pos開始同步時讀取的初始master二進制文件Position, 通過master端執行show master status查看得到
5.同步測試
目標:
1) 檢查master狀態;
2) 檢查slave狀態;
3) 同步之前master端數據表已恢復到slave端;
4) 同步開啓後master端與slave端數據雙向同步複製;
步驟:
1) 檢查master端狀態:
mysql> show masterstatus; #檢查作爲master的狀態
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000012| 406 | test | |
mysql> show slavestatus \G #檢查作爲slave的狀態
***************************1. row ***************************
Read_Master_Log_Pos: 106
Relay_Log_File:mysql-relay-bin.000026
Relay_Log_Pos: 251
Relay_Master_Log_File:mysql-bin.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
2) 檢查slave端狀態:
mysql> show masterstatus; #檢查作爲master的狀態
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB |Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000012| 106 | test | |
mysql> show slavestatus \G; #檢查作爲master的狀態
***************************1. row ***************************
Read_Master_Log_Pos: 406
Relay_Log_File:mysql-relay-bin.000035
Relay_Log_Pos: 551
Relay_Master_Log_File: mysql-bin.000012
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3) 檢查同步之前的數據:
mysql> select * fromcs8;
| id |
+------+
| 5 |
4)測試雙向同步複製:
a) Master端向slave端同步數據:
Master端:
mysql> create tablecs9(id int);
mysql> insert intocs9 values(9);
slave端:
mysql> select * fromcs9;
| id |
+------+
| 9 |
b) slave端向master端同步數據:
Slave端:
mysql> create tablecscs(id int);
mysql> insert intocscs values(33);
master端:
mysql> select * fromcscs;
+------+
| id |
+------+
| 33 |
+------+