MySQL 5.5資料庫的主從複制
今天參照網上的資料進行mysql資料庫的主從複制研究,本來網上的資料已經很詳細,但是我在實踐中還是遇到了很多問題,下面就根據網上的資料以及我遇到的問題進行一個總結。
系統環境:Ubuntu12.04
軟體版本:mysql-server-5.5
主機IP:192.168.0.200
從機IP:192.168.0.201
操作:
1、主機操作:
1)、編輯mysql配置檔案my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
注:網上還有一些其他的配置,但是為了偷懶隻配置了這兩個重要的,當然這兩個也是必須的。
2)、用root登陸mysql執行下面的代碼
//建立一個使用者dean密碼123456,并賦予replication slave權限:
mysql>grant replication slave on *.* to 'dean'@'192.189.0.201' identified by '123456'; www.2cto.com
//讓權限立即生效
mysql>flush privileges;
//查詢二進制檔案的檔案名和狀态(後面要用)
mysql>show master status \G
File:mysql-bin.000006
Position:107
Binlog_Do_DB:
Binlog_Ignore_DB:
2、從機操作:
1)、編輯myslq配置檔案my.cnf:
[mysqld]
server-id=2 //隻要和主機不同即可
2)、登陸mysql,輸入以下指令:
a)、 mysql>change master to master_host='192.168.0.200',master_user='dean', \
master_password='123456',master_log_file='mysql-bin.000006',
master_log_pos=107;
b)、mysql>start slave;
c)、 mysql>show slave status \G
如果出現:Slave_IO_Running:Yes
Slave_SQL_Running:Yes
那麼說明沒有問題了,就可以在主機上面建庫建表寫測試資料,然後在從機上查詢看有沒有資料。一般是沒有問題了。
但是如果是出現:
Slave_IO_Running:Connecting
Slave_SQL_Running:Yes
那麼就表示主從服務有問題了,我也就是遇到這個問題下面是我的解決方案:
1)、在從機上直接遠端登陸主機mysql伺服器:
#mysql -udean -h 192.168.0.200 -p123456
如果被拒絕那麼就需要檢查主機的使用者dean的權限、防火牆等設定是否正确。(我的被拒絕了)
2)、檢查權限。
用root登入mysql 并選擇mysql庫
mysql>use mysql;
查詢使用者的通路 www.2cto.com
mysql>select host,user from user;
從查詢資料看沒有問題,有dean使用者 接受192.168.0.201的通路
3)、防火牆設定
将端口為3306 的通路設為允許
#sudo ufw allow 3306
将ip為192.168.0 .201的通路設為允許
#sudo ufw allow 192.168.0.201
檢視狀态
# sudo ufw status
設定完後還是從機還是不能直接遠端通路主機
4)、檢視端口監聽
#netstat -anpy|grep 3306
發現目前的端口3306隻在127.0.0.1監聽,找到問題所在。修改mysql配置檔案my.cnf将裡面的bind-address=127.0.0.1注釋調,重新察看端口監聽發現監聽是0.0.0.0:3306,好了測試一下果真可以進行遠端通路。
重新進行主機從機的操作,但是發現在從機中不能進行第2步a操作,執行下面指令
mysql>stop slave;//關閉slave
mysql>reset slave;//重置slave
繼續執行a操作并往下繼續操作。
最終完成了Mysql 資料庫的主從複制。
另:根據網上資料顯示,如果主機在搭建主從複制前已經有資料需要先在主機上加鎖:
mysql>flush tables with read lock;
然後打包資料目錄并拷貝到從機上,然後解鎖。(解鎖文法見如下說明)
今天在解決資料庫同步異常的時候用到了flush tables with read lock 這個指令,于是順便就學習了下鎖表的相關知識。
1.FLUSH TABLES WITH READ LOCK
這個指令是全局讀鎖定,執行了指令之後所有庫所有表都被鎖定隻讀。一般都是用在資料庫聯機備份,這個時候資料庫的寫操作将被阻塞,讀操作順利進行。
解鎖的語句也是unlock tables。
2.LOCK TABLES tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}
這個指令是表級别的鎖定,可以定制鎖定某一個表。例如: lock tables test read; 不影響其他表的寫操作。
解鎖語句也是unlock tables。
這兩個語句在執行的時候都需要注意個特點,就是 隐式送出的語句。在退出mysql終端的時候都會隐式的執行unlock tables。也就是如果要讓表鎖定生效就必須一直保持對話。
P.S. MYSQL的read lock和wirte lock
read-lock: 允許其他并發的讀請求,但阻塞寫請求,即可以同時讀,但不允許任何寫。也叫共享鎖
write-lock: 不允許其他并發的讀和寫請求,是排他的(exclusive)。也叫獨占鎖
作者 DeanJoson
posted on 2013-12-06 15:35 回憶之城 閱讀(66) 評論(0) 編輯 收藏 引用 所屬分類: 資料庫