mysql伺服器的主從同步執行個體
環境:
server1 192.168.1.200
server2 192.168.1.110
環境部署:
1,首先保證伺服器在同一個網段,能夠互相連通
2,確定防火牆,selinux關閉
[root@server1 ~]# iptables -F //清空防火牆清單
[root@server1 ~]# service iptables save //儲存防火牆清單
[root@server1 ~]# service iptables stop //關閉防火牆
iptables: Flushing firewall rules: [ OK ]
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Unloading modules: c [ OK ]
[root@server1 ~]# chkconfig iptables off //設定防火牆自動關閉
[root@server1 ~]# getenforce //檢視selinux的狀态(enforcing為開啟,permissive為允許,disabled為關閉)
Enforcing //若為開啟狀态,則需用setenforce 0 關閉
[root@server1 ~]# setenforce 0 //關閉selinux
[root@server1 ~]# vim /etc/sysconfig/selinux //編輯selinux配置檔案,使其下次開機時為強制關閉狀态
[root@server1 ~]# grep -vE "^#|^$" /etc/sysconfig/selinux
SELINUX=disabled
SELINUXTYPE=targeted
[root@server1 ~]#
3,確定能夠連通server2和server3
[root@server1 ~]# ping 192.168.1.110 -c 2
PING 192.168.1.110 (192.168.1.110) 56(84) bytes of data.
64 bytes from 192.168.1.110: icmp_seq=1 ttl=64 time=0.708 ms
64 bytes from 192.168.1.110: icmp_seq=2 ttl=64 time=0.394 ms
--- 192.168.1.110 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 0.394/0.551/0.708/0.157 ms
[root@server1 ~]# ping 192.168.1.120 -c 2 //可以看到,能夠連通server2和server3
PING 192.168.1.120 (192.168.1.120) 56(84) bytes of data.
64 bytes from 192.168.1.120: icmp_seq=1 ttl=64 time=2.66 ms
64 bytes from 192.168.1.120: icmp_seq=2 ttl=64 time=0.379 ms
--- 192.168.1.120 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 0.379/1.521/2.663/1.142 ms
注:server2和server3上也做同樣操作
第一步:安裝mysql資料庫相關軟體包,在所有伺服器上
[root@server1 ~]# cd /data/
[root@server1 data]# tar xvf MySQL-5.6.15-1.el6.x86_64.rpm-bundle.tar
MySQL-shared-5.6.15-1.el6.x86_64.rpm
MySQL-devel-5.6.15-1.el6.x86_64.rpm
MySQL-embedded-5.6.15-1.el6.x86_64.rpm
MySQL-test-5.6.15-1.el6.x86_64.rpm
MySQL-server-5.6.15-1.el6.x86_64.rpm
MySQL-shared-compat-5.6.15-1.el6.x86_64.rpm
MySQL-client-5.6.15-1.el6.x86_64.rpm
[root@server1 data]# mkdir mysql
[root@server1 data]# mv MySQL-*.rpm ./mysql/
[root@server1 data]# cd mysql/
[root@server1 mysql]# rpm -Uvh MySQL-* //安裝解壓出來的所有MySQL開頭的軟體包
注:server2,server3上執行同樣步驟
第二步:在server1上做授權
授權允許在192.168.1.110伺服器上使用者名userslave可以備份該資料庫:
grant replication slave on *.* to userslave@"192.168.1.110"identified by "123";
[root@server1 ~]# service mysql start
[root@server1 ~]# cat .mysql_secret //mysql生成的随機密碼存放在~/.mysql_secret檔案内
# The random password set for the root user at Thu Mar 20 19:31:40 2014 (local time): LiYvwtWk
[root@server1 ~]# mysql -pLiYvwtWk //使用初始密碼登陸
mysql> set password for "root"@"localhost"=password("tarena"); //修改密碼為tarena
mysql> grant replication slave on *.* to userslave@"192.168.1.110" identified by "123"; //授權使用者
mysql> quit
Bye
第三步:在server2上通過授權使用者userslave登入測試
[root@server2 ~]# ifconfig | head -2
eth0 Link encap:Ethernet HWaddr 00:0C:29:CF:51:E3
inet addr:192.168.1.110 Bcast:192.168.1.255 Mask:255.255.255.0
[root@server2 ~]# mysql -h 192.168.1.200 -u userslave -p123
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.6.15 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, 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>
第四步:開啟server1上mysql伺服器的binlog日志并分别指定server1和server2上的server_id值
在server1的mysql配置檔案裡開啟log-bin ;
在server1和server2上分别指定server_id值;
重新開機mysql服務使其生效;
生效時可以看到mysql目錄下多出兩個檔案:server1-bin.000001和server1-bin.index
server1上的設定
[root@server1 ~]# grep -vE "^#|^$" /etc/my.cnf //原始資料,沒有開啟binlog,也沒有設定server_id值
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[root@server1 ~]# vim /etc/my.cnf
[root@server1 ~]# grep -vE "^#|^$" /etc/my.cnf
log-bin //添加字段bin-log啟動
server_id=200 //添加server_id字段,其值在伺服器中應唯一,是以最好指定為ip位址的網絡位
[root@server1 ~]# ll /var/lib/mysql/server1*
-rw-rw----. 1 mysql mysql 6 Mar 20 20:13 /var/lib/mysql/server1.example.com.pid
[root@server1 ~]# service mysql restart
Shutting down MySQL.. [ OK ]
Starting MySQL. [ OK ]
[root@server1 ~]# ll /var/lib/mysql/server1* //多出兩個以server1-bin開頭的檔案
-rw-rw----. 1 mysql mysql 120 Mar 20 20:14 /var/lib/mysql/server1-bin.000001
-rw-rw----. 1 mysql mysql 21 Mar 20 20:14 /var/lib/mysql/server1-bin.index
-rw-rw----. 1 mysql mysql 6 Mar 20 20:14 /var/lib/mysql/server1.example.com.pid
server2上的配置
[root@server2 ~]# vim /etc/my.cnf
[root@server2 ~]# head -3 /etc/my.cnf
server_id=110 //指定server_id為110
[root@server2 ~]# service mysql restart
Shutting down MySQL.... [ OK ]
Starting MySQL.. [ OK ]
[root@server2 ~]#
第五步:server2登入本機的資料庫服務進行配置,使其成為server1的從伺服器
執行:start slave啟動slave程序
1,檢視主伺服器server1的偏移量
[root@server1 ~]# mysql -p tarena //登入主伺服器檢視偏移量
mysql> show master status; //查詢主伺服器的偏移量
+--------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
| server1-bin.000001 | 120 | | | |
1 row in set (0.00 sec)
mysql> quit
2,在server2伺服器進行從伺服器的配置
[root@server2 ~]# mysql -ptarena //登入本機伺服器進行設定
mysql> change master to
-> master_host="192.168.1.200", //指定主伺服器ip位址
-> master_user="userslave", //指定授權登入使用者名
-> master_password="123", //指定授權登入使用者密碼
-> master_log_file="server1-bin.000001", //指定server1的日志檔案
-> master_log_pos=120; //指定binlog日志的偏移量(pos)
Query OK, 0 rows affected, 2 warnings (0.07 sec)
[root@server2 ~]# ll
total 110636
-rw-rw---- 1 mysql mysql 56 Mar 20 14:18 auto.cnf
-rw-rw---- 1 mysql mysql 12582912 Mar 20 20:47 ibdata1
-rw-rw---- 1 mysql mysql 50331648 Mar 20 20:48 ib_logfile0
-rw-rw---- 1 mysql mysql 50331648 Mar 20 14:18 ib_logfile1
-rw-rw---- 1 mysql mysql 93 Mar 20 21:00 master.info //連接配接主伺服器server1的資訊
drwx--x--x 2 mysql mysql 4096 Mar 20 14:18 mysql
srwxrwxrwx 1 mysql mysql 0 Mar 20 20:47 mysql.sock
drwx------ 2 mysql mysql 4096 Mar 20 14:18 performance_schema
-rw-rw---- 1 mysql mysql 59 Mar 20 21:00 relay-log.info //中繼日志資訊
-rw-r--r-- 1 root root 111 Mar 20 14:18 RPM_UPGRADE_HISTORY
-rw-r--r-- 1 mysql mysql 111 Mar 20 14:18 RPM_UPGRADE_MARKER-LAST
-rw-rw---- 1 mysql mysql 6 Mar 20 20:47 server2.example.com.pid
-rw-rw---- 1 mysql mysql 120 Mar 20 21:00 server2-relay-bin.000001 //中繼binlog日志
-rw-rw---- 1 mysql mysql 27 Mar 20 21:00 server2-relay-bin.index //存放已有的中繼日志名
drwx------ 2 mysql mysql 4096 Mar 20 20:00 test
注:綠色顯示的四個檔案為start slave之後新添加的檔案
第六步:測試
在server1上登入mysql建立一個庫teadb
在teadb下建立一個表a
在server2登入mysql資料庫驗證是否同步
1,在server1上建立并檢視
[root@server1 ~]# mysql -ptarena
mysql> create database teadb;
mysql> create table teadb.a(id int(3));
mysql> insert into teadb.a value(100),(100),(100);
mysql> select * from teadb.a;
+------+
| id |
| 100 |
3 rows in set (0.00 sec)
2,在server2上查詢teadb.a的資訊
[root@server2 mysql]# mysql -ptarena
mysql> select * from teadb.a; //登入後直接查詢,可以看到直接同步過來了
[root@server2 mysql]#
擴充:
1,在從伺服器上start slave 之後,可以在登入mysql服務之後使用show slave status\G來檢視Slave_IO_Running和Slave_SQL_Running兩個程序的狀态,都為Yes為成功!
2,IO和SQL程序的作用
IO程序的作用:
連接配接主資料庫伺服器;
從主的binlog日志裡拷貝sql語句放到本機的中繼binlog日志檔案裡。
SQL程序的作用:
執行本機中繼binlog日志檔案裡的sql語句,把資料寫進本機的資料庫裡。
注:由于SQL程序是同步的server1上的binlog日志檔案,是以如果server1沒有開啟binlog日志,server2将無法同步資料的寫入。
3,與從資料庫伺服器相關的4個配置檔案
master.info :主伺服器(server1)的資訊,包含主機server1伺服器ip位址,授權用userslave以及密碼。IO程序根據該檔案的資訊區連接配接資料庫伺服器server1
relay-log.info :中繼日志資訊
server2-relay-bin.000001 :中繼binlog日志
server2-relay-bin.index :存放已有的中繼日志檔案名
4,若IO或SQL程序啟動不成功,可修改
使用change tomaster_xxx來修改IO程序的讀取資訊檔案master.info
注:在指定之前需停止slave:stop slave,修改之後,可以使用start slave開啟
若SQL程序無法啟動,則需檢視日志檔案,在沒有同步的時間都做了哪些修改,手動修改
注:配置不成功的幾個常見錯誤
1,防火牆或selinux沒有關閉
2,server1伺服器沒有開啟binlog日志
3,server1或server2沒有在配置檔案/etc/my.cnf檔案中添加server_id的值
4,server2的mysql資料庫中使用change to設定的值不于server1資料庫對應
本文轉自 murongqingqqq 51CTO部落格,原文連結:http://blog.51cto.com/murongqingqqq/1381922