1、 實驗環境部署
主服務器(MySQL-01) IP: 192.168.8.241 端口3306 ,操做系統:Centos6.5 64位
從服務器(MySQL-02) IP: 192.168.8.242 端口3306,操做系統:Centos6.5 64位mysql
虛擬機配置:內存2G,硬盤28G,2塊網卡(1塊網卡也能夠),注意複製虛擬機 時候選擇生成不一樣的MAC地址,虛擬機生成以後,網卡的的名稱會變爲eth二、eth3,修改/etc/udev/rules.d/70-persistent-net.rules文件,將無效的MAC記錄屏蔽掉,將真實的MAC對應的記錄更名爲eth0、eth1。
兩臺虛擬機的網絡配置好,配置網關、配置DNS,將虛擬機網卡設置爲物理橋接模式,使之可以訪問外網,經過 ping www.baidu.com 測試是否能訪問外網。
經過yum安裝mysql數據庫server/client/develop:
yum -y install mysql-server mysql mysql-devel
2、mysql單向主從同步配置sql
I. 主服務器的操做
1. 關於主服務器的相關配置
1.1 設置server-id值並開啓binlog參數
根據mysql的同步原理:關鍵因素就是binlog日誌。
編輯/etc/my.cnf配置文件,修改和添加相關參數。
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
server-id = 1
log-bin = mysql-bin
備註:
#. 上面兩參數放在my.cnf中的[mysqld]模塊下,不然會出錯;
#. 要先在my.cnf文件中查找相關參數,並按具體要求修改,不存在時添加相關參數,切記,參數不能重複;
#binlog-do-db = test :須要備份數據,多個寫多行,不寫所有都備份
#binlog-ignore-db = mysql :不須要備份的數據庫,多個寫多行
修改完配置文件,檢查配置後的結果:
[root@localhost ~]# grep -E "server-id|log-bin" /etc/my.cnf
重啓mysql數據庫
service mysqld restart
設置數據庫根用戶root的密碼:
mysqladmin -u root password 'mysql'
設置的密碼是「mysql"
1.2 創建用於主、從數據同步的賬號 "rep"
[root@localhost ~]#mysql -u root -pmysql
mysql>select user();
mysql>grant replication slave on *.* to 'rep'@'192.168.8.%' identified by '123456';數據庫
mysql>flush privileges;vim
備註:
#replication slave:爲mysql同步的必須權限,此處不要受權all
#*.*:表示全部庫全部表,庫也是能夠指定具體的庫和表進行復制,如test.test1(test庫的test1表);
# rep@192.168.8.%: rep爲同步帳號,192.168.1.%爲受權主機,使用了%表示容許整個192.168.8.0網段以rep用戶訪問;
#identified by "123456" : 123456爲密碼,實際環境用複雜密碼
1.3 對主數據庫鎖表只讀:
注:實際環境中,操做主從複製,須要申請停機時間,鎖表會影響業務。
mysql>flush tables with read lock;
注:這個鎖表命令的時間,在不一樣引擎的狀況,會受下面參數的控制,鎖表超過設置時間不操做會自動解鎖;
默認狀況下的時長爲:
mysql>show variables like "%timeout%"; 能夠查看到默認鎖表時間最大值。
mysql> show variables like "%timeout%";
+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
..........
| interactive_timeout | 28800 |
........
| wait_timeout | 28800 |
+----------------------------+-------+
10 rows in set (0.00 sec)
完成後測試是否鎖表成功:打開另外一窗口建立一test1表,是不會執行的,證實鎖表不能更新,但可讀,不可寫,由於是read讀鎖,鎖表主要是爲了導出數據庫文件,從而取得正確的偏移量的值,保證導入從數據庫,數據一致。
1.4 查看主庫狀態
查看主庫狀態,即當前日誌文件名和二進制日誌偏移量
mysql>show master status;
命令顯示的信息要記錄在案,後面的從庫複製時是從這個位置開始的。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 619 | | mysql |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
1.5 導出主數據庫數據
[root@localhost ~]#mkdir /backup
[root@localhost ~]#mysqldump -uroot -pmysql -A -B |gzip >/backup/mysql_bak.$(date +%F)sql.gz
注:-A表示備份全部庫, -B表示增長user DB和drop等參數(導庫時會直接覆蓋全部的)。
[root@mysql-master backup]# ll
total 144
-rw-r--r-- 1 root root 144884 Feb 23 08:58 mysql_bak.2016-02-23sql.gz
爲了確保導庫期間,數據庫沒有數據插入,能夠再檢查下主庫狀態信息
[root@mysql-master backup]# mysql -uroot -pmysql -e "show master status"
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000003 | 619 | | mysql |
+------------------+----------+--------------+------------------+
注:無特殊狀況,binlog文件及位置點是保持不變的。
導庫後,解鎖主庫,恢復可寫;
mysql>unlock tables;
Query OK, 0 rows affected (0.00 sec)
特別提示,有讀者這裏犯迷糊,實際上作從庫的,不管主庫更新多少數據了,最後從庫都會從上面show master status 的位置很快遇上主庫的位置進度的。
1.6 把主庫備份的mysql數據遷移到從庫
[root@mysql-master backup]# scp /backup/mysql_bak.2016-02-23sql.gz 192.168.8.242:/backup/
II. 從服務器的操做
1. 關於從服務器的相關配置
1.1 設置server-id值並關閉binlog設置
注:數據庫的server-id在LAN內是惟一的,這裏的server-id要和主庫及其餘從庫不一樣,並註釋掉從庫的binlog參數配置;
編輯/etc/my.cnf配置文件,修改相關的參數設置
master-connect-retry=60 #若是從服務器發現主服務器斷掉,從新鏈接的時間差
[root@localhost ~]# vi /etc/my.cnf
[mysqld]
server-id = 2
#log-bin = mysql-bin
檢查配置後的結果
[root@localhost ~]#grep -E "server-id|log-bin" /etc/my.cnf
設置數據庫根用戶root的密碼:
mysqladmin -u root password 'mysql'
設置的密碼是「mysql"
重啓從數據庫
[root@localhost ~]#service mysqld restart
1.2 還原主庫導出的數據到從庫
gunzip mysql_bak.2016-02-23sql.gz
mysql -uroot -pmysql <mysql_bak.2016-02-23sql
1.3 登陸從庫配置同步參數
mysql>change master to #鏈接主數據庫
mysql>master_host="192.168.8.241", #主庫的IP地址
mysql>master_port=3306, #主庫的端口,從庫的端口能夠和主庫不一樣
mysql>master_user="rep", #主庫上創建的用於數據同步的用戶《rep》
mysql>master_password="123456", #用戶《rep》的密碼
mysql>master_log_file="mysql-bin.000003", #是mysql>show master status時看到的二進制日誌文件名稱,不能多空格。
mysql>master_log_pos=619; #是mysql>show master status時查看到的二進制日誌偏移量,不能多空格。
(change master to master_host="192.168.8.241",master_port=3306,master_user="rep",master_password="123456",master_log_file="mysql-bin.000003",master_log_pos=619; )
1.4 啓動從庫同步開關
啓動從庫同步開關,並查看同步狀態
[root@localhost backup]#mysql -uroot -pmysql -e "start slave"
[root@localhost backup]#mysql -uroot -pmysql -e "show slave status\G"
也能夠登陸從庫,在數據庫下面執行相關命令:
mysql>start slave;
mysql>show slave status\G;
判斷搭建是否成功就看以下IO和SQL兩個線程是否顯示爲「yes」狀態
Slave_to_Running:YES #負責從庫去主庫讀取binlog日誌,並寫入從庫中繼日誌中
Slave_SQL_Running:YES #負責讀取並執行中繼日誌中的binlog轉換sql語句後應用到數據庫彙總。
也能夠執行命令過濾查看以下:
[root@mysql-slave tmp]# mysql -uroot -pmysql -e "show slave status\G" | egrep "IO_Running|SQL_Running"
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1.5 測試主從同步
在主庫建立 —>數據庫以及查看
在主庫中建立庫「mytable」用於主從同步:
[root@localhost ]#mysql -uroot -pmysql -e "show databases;"
[root@localhost ]#mysql -uroot -pmysql -e "create database mytable;"
在從庫查看是否主從同步:
[root@mysql-master ~]# mysql -uroot -pmysql -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytable |
| test |
+--------------------+
[root@mysql-master ~]#
[root@mysql-slave tmp]# mysql -uroot -pmysql -e "show databases;"
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| mytable |
| test |
+--------------------+
[root@mysql-slave tmp]#
到此!單向主從數據庫同步成功完成;從數據庫能夠實現數據同步。
3、mysql雙向主從同步的配置
3.1在MySQl-01上操做,用戶受權,略過,是由於在作單向主從的時候已經對192.168.8.0/24整個網段都進行了受權。若是單向主從關係建立複製用戶「rep」的時候只制定了單獨地址192.168.8.242,那麼就須要增長對地址192.168.8.241的受權。執行下面的命令:
mysql -u root -pmysql
mysql> grant replication slave on *.* to 'rep'@'192.168.8.241' identified by '123456'; //創建權限
mysql> flush privileges;
注:由於作的是全部庫的主從,因此在MySQL-01上的操做會同步到MySQL-02上
3.2在MySQL-02上的操做
修改MySQL-02的數據庫文件,在[mysql]下修改以下內容
server_id = 2
log_bin = mysql-bin
重啓 MySQL-02的mysql數據庫:
service mysqld restart
查看MySQL-02上的日誌文件:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 106 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
3.3在MySQL-01上操做
mysql> change master to master_host='192.168.8.242',master_user='rep',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=106;
mysql> start slave;
檢查是否成功
mysql>show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
表示成功。
至此,mysql的雙向主從同步已完成
附:mysql主從同步常見異常及恢復方法服務器
1. 通常的異常只須要跳過一步便可恢復
>slave stop;
>SET GLOBAL sql_slave_skip_counter = 1;
>slave start;
2.斷電致使主從不能同步時,通主庫的最後一個bin-log日誌進行恢復
在主庫服務器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt
tail -n 100000 binxxxx.txt > tail-binxxxx.txt
vim tail-binxxxx.txt 打開tail-binxxxx.txt文件找到最後一個postion值
而後在從庫上,change host to 相應正確的值
>slave stop;
>change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;
>slave start;
>show slave status\G;
3.主鍵衝突、表已存在等錯誤代碼如1062,1032,1060等,能夠在mysql主配置文件指定
略過此類異常並繼續下條sql同步,這樣也能夠避免不少主從同步的異常中斷
[mysqld]
slave-skip-errors = 1062,1032,1060
網絡