為了做實驗友善,我們在同一台機器上配置兩個MySQL服務(開兩個端口)
1、安裝、配置MySQL
事先已經安裝好mysql;
1
2
3
<code>[root@localhost ~]</code><code># cd /usr/local/</code>
<code>[root@localhost </code><code>local</code><code>]</code><code># cp -r mysql/ mysql_2</code>
<code>[root@localhost </code><code>local</code><code>]</code><code># cd mysql_2/</code>
初始化mysql2,如果出現兩個 “OK” 并且生成/data/mysql2目錄說明正确;
<code>[root@localhost mysql_2]</code><code># ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql2</code>
拷貝配置檔案
<code>[root@localhost mysql_2]</code><code># cp /etc/my.cnf ./my.cnf</code>
修改配置檔案相關參數,更改port 以及 socket ,并增加datadir=/data/mysql2
4
5
<code>[root@localhost mysql_2]</code><code># vi my.cnf </code>
<code>[mysqld]</code>
<code>port = 3307</code>
<code>socket = </code><code>/tmp/mysql2</code><code>.sock</code>
<code>datadir=</code><code>/data/mysql2</code>
啟動:
<code>[root@localhost mysql_2]</code><code># /usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &</code>
如果想開機啟動,需加入到/etc/rc.local 裡;
<code># echo "/usr/local/mysql_2/bin/mysqld_safe --defaults-file=/usr/local/mysql_2/my.cnf --user=mysql &" >> /etc/rc.d/rc.local</code>
netstat檢視已經有2個mysqld服務:
<code>[root@localhost mysql2]</code><code># netstat -nlp |grep mysqld</code>
<code>tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1203</code><code>/mysqld</code>
<code>tcp 0 0 0.0.0.0:3307 0.0.0.0:* LISTEN 1744</code><code>/mysqld</code>
<code>unix 2 [ ACC ] STREAM LISTENING 8804 1203</code><code>/mysqld</code> <code>/tmp/mysql</code><code>.sock</code>
<code>unix 2 [ ACC ] STREAM LISTENING 14159 1744</code><code>/mysqld</code> <code>/tmp/mysql2</code><code>.sock</code>
2、 配置主從準備工作
設定mysql_2 為主(master)端口3307,mysql為從(slave)端口為3306
使用sock檔案登入主mysql
<code>[root@localhost mysql2]</code><code># /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock</code>
-S 後面指定mysql的socket檔案路徑,這也是登陸mysql的一種方法,因為在一台伺服器上跑了兩個mysql端口,是以,隻能用 -S 這樣的方法來區分。
在主上建立測試庫db1
<code>mysql> create database db1;</code>
<code>mysql> quit</code>
導出主的mysql庫資料然後導入給db1
<code>[root@localhost mysql2]</code><code># /usr/local/mysql_2/bin/mysqldump -uroot -S /tmp/mysql2.sock mysql > 123.sql</code>
<code>[root@localhost mysql2]</code><code># /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock db1 < 123.sql</code>
3、配置主(master)
vim /usr/local/mysql_2/my.cnf
在[mysqld]部分檢視是否有以下内容,如果沒有則添加:
server-id=1
log-bin=mysql-bin
兩個可選參數(2選1):
binlog-do-db=db1,db2 #需要同步的庫
binlog-ignore-db=db1,db2 #忽略不同步的庫
binlog-do-db=需要複制的資料庫名,多個資料庫名,使用逗号分隔。binlog-ignore-db=不需要複制的資料庫庫名,多個資料庫名,使用逗号分隔。
修改配置檔案後,重新開機mysql_2
<code>[root@localhost mysql2]</code><code># pid=`ps aux |grep mysql2.sock |grep -v grep |awk '{print $2}'`[root@localhost mysql2]# kill $pid</code>
設定root密碼:
<code>[root@localhost mysql2]</code><code># /usr/local/mysql_2/bin/mysqladmin -uroot -S /tmp/mysql2.sock password '123456'</code>
<code>[root@localhost mysql2]</code><code># /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock -p123456</code>
mysql> grant replication slave on *.* to 'repl'@'127.0.0.1' identified by '123123';
//這裡的repl是為slave端設定的通路master端mysql資料的使用者,密碼為123123,這裡的127.0.0.1為slave的ip(本次試驗配置的master和slave都在本機)。
mysql> flush privileges; //重新整理庫,記憶體的資料寫入磁盤;
mysql> flush tables with read lock;
//鎖定資料庫,此時不允許更改任何資料
6
<code>mysql> show master status;</code>
<code>+------------------+----------+--------------+------------------+</code>
<code>| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |</code>
<code>| mysql-bin.000004 | 378 | | |</code>
4、 設定從(slave)
vim /etc/my.cnf #修改或增加
server-id = 2 #這個數值不能和主一樣
可選參數:replicate-do-db=db1,db2
replicate-ignore-db=db1,db2 #意義同主的那兩個可選參數
重新開機從的mysql服務:service mysqld restart
拷貝主的db1庫資料到從:
先導出db1.sql檔案,然後在從資料庫中同樣建立資料庫db1,導入主的db1.sql檔案到從;
<code>[root@localhost ~]</code><code># /usr/local/mysql_2/bin/mysqldump -uroot -S /tmp/mysql2.sock -p123456 db1 > db1.sql</code>
<code>[root@localhost ~]</code><code># /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock -e "create database db1"</code>
<code>[root@localhost ~]</code><code># /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock db1 < db1.sql</code>
登陸從的mysql
<code>[root@localhost ~]</code><code># /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock </code>
<code>mysql> slave stop;</code>
<code>mysql> change master to master_host=</code><code>'127.0.0.1'</code><code>,master_port=3307,master_user=</code><code>'repl'</code><code>,master_password=</code><code>'123123'</code><code>,master_log_file=</code><code>'mysql-bin.000004'</code><code>,master_log_pos=378;</code>
//master_log_file='mysql-bin.000004',master_log_pos=378為主show master status顯示的前2列内容;
<code>mysql> slave start;</code>
主上,解鎖表:
<code>[root@localhost ~]</code><code># /usr/local/mysql_2/bin/mysql -uroot -S /tmp/mysql2.sock -p123456 -e "unlock tables"</code>
登入從
<code>[root@localhost ~]</code><code># /usr/local/mysql/bin/mysql -uroot -S /tmp/mysql.sock</code>
檢視從的狀态 show slave status\G;
确認以下兩項參數都為yes:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<code>mysql> show slave status\G;</code>
<code>*************************** 1. row ***************************</code>
<code> </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master to send event</code>
<code> </code><code>Master_Host: 127.0.0.1</code>
<code> </code><code>Master_User: repl</code>
<code> </code><code>Master_Port: 3307</code>
<code> </code><code>Connect_Retry: 60</code>
<code> </code><code>Master_Log_File: mysql-bin.000004</code>
<code> </code><code>Read_Master_Log_Pos: 378</code>
<code> </code><code>Relay_Log_File: localhost-relay-bin.000002</code>
<code> </code><code>Relay_Log_Pos: 251</code>
<code> </code><code>Relay_Master_Log_File: mysql-bin.000004</code>
<code> </code><code>Slave_IO_Running: Yes</code>
<code> </code><code>Slave_SQL_Running: Yes</code>
<code> </code><code>Replicate_Do_DB:</code>
<code> </code><code>Replicate_Ignore_DB:</code>
<code> </code><code>Replicate_Do_Table:</code>
<code> </code><code>Replicate_Ignore_Table:</code>
<code> </code><code>Replicate_Wild_Do_Table:</code>
<code> </code><code>Replicate_Wild_Ignore_Table:</code>
<code> </code><code>Last_Errno: 0</code>
<code> </code><code>Last_Error:</code>
<code> </code><code>Skip_Counter: 0</code>
<code> </code><code>Exec_Master_Log_Pos: 378</code>
<code> </code><code>Relay_Log_Space: 410</code>
<code> </code><code>Until_Condition: None</code>
<code> </code><code>Until_Log_File:</code>
<code> </code><code>Until_Log_Pos: 0</code>
<code> </code><code>Master_SSL_Allowed: No</code>
<code> </code><code>Master_SSL_CA_File:</code>
<code> </code><code>Master_SSL_CA_Path:</code>
<code> </code><code>Master_SSL_Cert:</code>
<code> </code><code>Master_SSL_Cipher:</code>
<code> </code><code>Master_SSL_Key:</code>
<code> </code><code>Seconds_Behind_Master: 0</code>
<code>Master_SSL_Verify_Server_Cert: No</code>
<code> </code><code>Last_IO_Errno: 0</code>
<code> </code><code>Last_IO_Error:</code>
<code> </code><code>Last_SQL_Errno: 0</code>
<code> </code><code>Last_SQL_Error:</code>
5、 測試主從
主上清空db1庫的db表 :
登入主
<code>[root@localhost ~]</code><code># mysql -uroot -S /tmp/mysql2.sock -p123456</code>
<code>mysql> use db1;</code>
<code>mysql> </code><code>select</code> <code>count(*) from db;</code>
<code>+----------+</code>
<code>| count(*) |</code>
<code>| 2 |</code>
清空db表;
<code>mysql> truncate table db;</code>
<code>mysql> </code><code>select</code> <code>count(*) from db; </code>
<code>| 0 |</code>
進入slave,檢視db1庫db表,和主的資料一樣,表示同步OK;
<code>[root@localhost ~]</code><code># mysql -uroot -S /tmp/mysql.sock </code>
登入主,删除表db;
<code>mysql> drop table db;</code>
登入從,檢視db表不存在;
<code>mysql> </code><code>select</code> <code>* from db;</code>
<code>ERROR 1146 (42S02): Table </code><code>'db1.db'</code> <code>doesn't exist</code>
建議: MySQL主從機制比較脆弱,謹慎操作。如果重新開機master,務必要先把slave停掉,也就是說需要在slave上去執行 slave stop 指令,然後再去重新開機master的mysql服務,否則很有可能就會中斷了。當然重新開機完後,還需要把slave給開啟 slave start。
本文轉自 模範生 51CTO部落格,原文連結:http://blog.51cto.com/mofansheng/1655877,如需轉載請自行聯系原作者