1. 程式人生 > >mysql 主從同步實驗細解

mysql 主從同步實驗細解

mysql master slave

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 主從同步實驗細解