mysql 主從同步實驗細解
mysql 主從同步實驗細解
一.實驗環境
實驗環境 192.168.9.108 為master
192.168.9.109 為slave
數據庫版本:version 5.1.73
安裝方式:采用的yum 安裝 源為163的源
系統版本:centos 6.5
1.查看系統版本
[[email protected] ~]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m
二.實驗準備
1.安裝mysql服務
[[email protected] opt]# ansible -i hosts tomcatserver -m yum -a "name=mysql-server state=present"
註意:這裏我之前裝過ansible ,這裏統一安裝的。
name這裏需要寫mysql-server
2.啟動mysql 服務
[[email protected] opt]# ansible -i hosts tomcatserver -m service -a ‘name=mysqld state=started‘
3.為MySQL數據庫創建密碼
mysql> set password for [email protected] = password(‘123456‘);
4.配置主數據庫,創建需要同步的數據庫
[[email protected] opt]# mysql -uroot -p123456
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
三.配置主服務器
1.配置my.cnf文件
vim /etc/my.cnf
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql #數據的存放點
socket=/var/lib/mysql/mysql.sock
user=mysql #用戶
log-bin=mysql-bin-master # 啟動二進制日誌
server-id =1 #本機數據庫ID標識
binlog-do-db=HA #可以被從服務器復制的庫。二進制需要同步的數據庫名稱。
binlog-ignore-db=mysql #不可以被從服務器復制的庫
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
[mysqld_safe]
log-error=/var/log/mysqld-bin-master.log
pid-file=/var/run/mysqld/mysqld-bin-master.pid
2.重啟數據庫
修改完數據庫要重啟
service mysqld restart
3.授權從用戶可以登陸
mysql> grant replication slave on *.* to [email protected] identified by "123456";
4.查看狀態信息
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 | 106 | HA | mysql |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
查看二進制日誌(這個是在配置文件裏面配置過的)
[[email protected] ~]# ls /var/lib/mysql/
HA ibdata1 ib_logfile0 ib_logfile1 mysql mysql-bin-master.000001 mysql-bin-master.index mysql.sock test
mysql> show binlog events \G
*************************** 1. row ***************************
Log_name: mysql-bin-master.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 106
Info: Server ver: 5.1.73-log, Binlog ver: 4
1 row in set (0.00 sec)
5.到處數據庫到從的服務器上保證同步的數據庫一致
[[email protected] ~]# mysqldump -uroot -p123456 HA > HA.sql
[[email protected] ~]# scp HA.sql [email protected]:/root/
HA.sql
四.配置從服務器
1.測試鏈接到主服務器是否成功
[[email protected] ~]# mysql -uslave -p123456 -h 192.168.9.108
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.1.73-log Source distribution
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
+--------------------+
2 rows in set (0.00 sec)
這裏看不到HA 的數據庫,只有復制權限
2.導入數據庫,和主數據庫服務器保持一致
mysql> create database HA;
mysql> mysql -uroot -p123456 HA<HA.sql
3.修改從服務器的配置文件
[[email protected] ~]# cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
server-id=2#從服務器ID號,不要和主ID相同 ,如果設置多個從服務器,每個從服務器必須有一個唯一的server-id值,必須與主服務器的以及其它從服務器的不相同。可以認為server-id值類似於IP地址:這些ID值能唯一識別復制服務器群集中的每個服務器實
master-host=192.168.9.108 #指定主服務器IP 地址
master-user=slave #指定住服務器上可以進行同步的用戶名稱
master-password=123456 # 指定密碼
master-port=3306
master-connect-retry=60 #斷點重新鏈接時間
[mysqld_safe]
log-error=/var/log/mysqld-slave.log
pid-file=/var/run/mysqld/mysqld-slave.pid
4.重啟數據庫
service mysqld restart
註意:這裏要重啟 如果直接啟動從服務會報錯如下
mysql> start slave;
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log
解決方案:
mysql> slave stop;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql> change master to master_host=‘192.168.1.63‘,master_user=‘slave‘,master_password=‘123456‘;
mysql> start slave; 啟動從
mysql> show slave status\G 查看狀態
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.9.108
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000001
Read_Master_Log_Pos: 106
Relay_Log_File: mysqld-slave-relay-bin.000002
Relay_Log_Pos: 258
Relay_Master_Log_File: mysql-bin-master.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 106
Relay_Log_Space: 420
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
1 row in set (0.00 sec)
Slave_IO_Running :一個負責與主機的io通信
Slave_SQL_Running:負責自己的slave mysql進程
五.主服務器上查看狀態
mysql> show processlist \G
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 10
Current database: HA
*************************** 1. row ***************************
Id: 6
User: root
Host: localhost
db: NULL
Command: Sleep
Time: 1480
State:
Info: NULL
*************************** 2. row ***************************
Id: 9
User: slave
Host: 192.168.9.109:33320
db: NULL
Command: Binlog Dump
Time: 51
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
*************************** 3. row ***************************
Id: 10
User: root
Host: localhost
db: HA
Command: Query
Time: 0
State: NULL
Info: show processlist
1.主數據庫插入數據進行測試
mysql> insert into T1 values(1,‘天河‘);
2.從數據庫進行查看
mysql> select * from HA.T1;
+------+--------+
| id | name |
+------+--------+
| 1 | 天河 |
+------+--------+
1 row in set (0.00 sec
六.排錯
如果遇到主從不同步,看一下主從bin-log的位置,然後再同步。
mysql> show master status;
+-------------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------------+----------+--------------+------------------+
| mysql-bin-master.000001 | 200 | HA | mysql |
+-------------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
從服務器執行MySQL命令下:
mysql> slave stop; #先停止slave服務
mysql> change master to master_log_file=‘mysqllog.000004‘ ,master_log_pos=106;
#根據上面主服務器的show master status的結果,進行從服務器的二進制數據庫記錄回歸,達到同步的效果
mysql>slave start; #啟動從服務器同步服務
mysql> show slave status\G; #用show slave status\G;看一下從服務器的同步情況
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes,那代表已經在同步
重啟從服務器,再查看狀態:
停止從服務器slave stop;
開啟從服務器slave start;
排錯思路:
1、二進制日誌沒有開啟
2、IPTABLES 沒有放開端口
3、對應的主機 IP地址寫錯了
SQL線程出錯
1、主從服務器數據庫結構不統一
出錯後,數據少,可以手動解決創建插入,再更新slave狀態。
註:如果主上誤刪除了。那麽從上也就誤刪除了。 #因此主上要定期做mysqldump備份。
七.完成
主從同步到這裏就完成了 這裏可以采用腳本來進行監控,監控 slave的兩個yes(Slave_IO及Slave_SQL進程),如發現只有一個或零個yes,就表明主從有問題了,發短信警報吧。
[[email protected] ~]# cat mysql_master.sh #!/bin/bash port=`netstat -anl|grep 3306 |sed -n ‘1p‘ |awk ‘{print $4}‘|awk -F: ‘{ print $2}‘` array=($(mysql -uroot -p123456 -e "show slave status\G"|grep "Running" |awk ‘{print $2}‘)) if [ "$port" == "3306" ] then if [ "${array[0]}" == "Yes" ] || [ "${array[1]}" == "Yes" ] then echo "slave is OK" else echo "slave is error" fi fi
本文出自 “天真無邪” 博客,請務必保留此出處http://innocence.blog.51cto.com/4313888/1963300
mysql 主從同步實驗細解