mysql主从复制

 

mysql主从复制介绍

mysql的主从复制是一个异步的复制过程(但一般情况下感觉是实时同步的),数据库数据从一个mysql数据库(我们称之为master)复制到另一个mysql数据库(我们称之为slave)。在master与slave之间实现整个主从复制的过程是由三个线程参与完成的。其中有两个线程(SQL线程和IO线程)在slave端,另外一个线程(IO线程)在master端。(来自mysql帮助文档)

 

下面简单描述下mysql replication的复制过程:

①slave服务器上执行start slave,开启主从复制开关。

②此时,slave服务的IO线程会通过msater上授权的复制用户权限请求连接master服务器,并请求从指定binlog日志文件的指定位置(日志文件名和位置就是在配置主从复***务时执行chage master命令时指定的)之后发送binlog日志内容。

③master服务器接收到来自slave服务器的IO线程的请求后,master服务器上复制复制的IO线程根据slave服务器的IO线程请求的信息读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的IO线程。返回的信息中除了binlog日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。

④当slave服务器的IO线程获取来自master服务器上IO线程发送的日志内容及日志文件和位置点后,将binlog日志内容依次写入到slave端自身的relay log(即中继日志)文件(mysql-relay-bin.xxxxxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉master服务器需要从新binlog日志的哪个文件哪个位置开始请求新的binlog日志内容。

⑤slave服务器端的SQL线程会实时检测本地relay log中新增加的日志内容,然后及时的把log文件中的内容解析成在master端曾经执行的SQL语句的内容,并在自身slave服务器上按语句的顺序执行应用这些SQL语句,应用完毕后清理应用过的日志。

⑥经过了上面的过程,就可以确保在master端和slave端执行了同样的SQL语句。当辅助状态正常的情况下,master端和slave端的数据时完全一样的。(来自老男孩培训整理)

 

mysql主从复制简单原理图:

 

 

mysql主从部署(一主一从):

环境

主机名

IP地址

系统版本

mysql-master

192.168.1.11

CentOS release 6.4 (Final) 2.6.32-358.el6.x86_64

mysql-slave

192.168.1.12

CentOS release 6.4 (Final) 2.6.32-358.el6.x86_64

安装mysql

yum install cmake -y 

yum install ncurses-devel -y

useradd mysql -s /sbin/nologin -M

##############

cd /application/tools

#下载mysql参考地址http://mirrors.sohu.com/mysql/MySQL-5.5/

tar zxf mysql-5.5.32.tar.gz 
cd mysql-5.5.32
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \
-DMYSQL_DATADIR=/application/mysql-5.5.32/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \
-DDEFAULT_CHARSET=gbk \
-DDEFAULT_COLLATION=gbk_chinese_ci \
-DENABLED_LOCAL_INFILE=ON \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITHOUT_PARTITION_STORAGE_ENGINE=1
make

make install

######创建软链接########

ln -s /application/mysql-5.5.32/ /application/mysql

#####拷贝配置文件及启动文件#########

/bin/cp /application/tools/mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf

cp /application/tools/mysql-5.5.32/support-files/mysql.server /etc/init.d/mysqld 

chmod 700 /etc/init.d/mysqld 

#####初始化#######

chown -R mysql.mysql /application/mysql/data/

/application/mysql/scripts/mysql_install_db  --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql

#####环境变量######

echo ‘export PATH=/application/mysql/bin/:$PATH‘ >>/etc/profile

tail -1 /etc/profile

source /etc/profile

which mysql


配置mysql-master

①修改my.cnf配置文件,开启bin-log功能,修改server-id(这里的ID在主从或多从之间是唯一的)

vi /etc/my.cnf

[mysqld]

server-id       = 1

log-bin=mysql-bin

###################

/etc/init.d/mysqld restart

②登录mysql,添加同步用户并检查

mysql> grant replication slave on *.* to ‘rep‘@‘192.168.1.%‘ identified by ‘123456‘;

mysql> show grants for ‘rep‘@‘192.168.1.%‘;

③锁表全备,备份完后解表

mysql> flush table with read lock;

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000002 |      396 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql> system mysqldump -uroot -p‘123456‘ -A -B --events |gzip >/tmp/master.sql.gz

mysql> show master status;

+------------------+----------+--------------+------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

mysql-bin.000002 |      396 |              |                  |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

mysql> unlock table;

④将全备的数据拷贝到slave上。

[lee@mysql-master tmp]$ scp -P52113 master.sql.gz  192.168.1.12:~

Warning: Permanently added ‘[192.168.1.12]:52113‘ (RSA) to the list of known hosts.

[email protected]‘s password: 

master.sql.gz                                                                           100%  141KB 141.0KB/s   00:00    


配置mysql-slave

①修改/etc/my.cnf配置文件的server-id

vi /etc/my.cnf

[mysqld]

server-id       = 2

②将全备的数据导入到slave中

[root@mysql-slave lee]# gzip -d master.sql.gz 

[root@mysql-slave lee]# mysql -uroot -p‘123456‘ </home/lee/master.sql 

③登录mysql,配置同步参数

mysql> CHANGE MASTER TO  

    -> MASTER_HOST=‘192.168.1.11‘,

    -> MASTER_PORT=3306, 

    -> MASTER_USER=‘rep‘, 

    -> MASTER_PASSWORD=‘123456‘,

    -> MASTER_LOG_FILE=‘mysql-bin.000002‘, 

    -> MASTER_LOG_POS=396; 

Query OK, 0 rows affected (0.09 sec)

注解:

CHANGE MASTER TO  

MASTER_HOST=‘192.168.1.11‘, <==这里是主库的ip

MASTER_PORT=3306, <==这里是主库的端口,从库端口可以和主库不同。

MASTER_USER=‘rep‘, <==这里是主库上建立的用于复制的用户rep

MASTER_PASSWORD=‘123456‘, <==这里是rep的密码。

MASTER_LOG_FILE=‘mysql-bin.000002‘, <==这里是show master status时看到的查看到的二进制日志文件名称,注意不能多空格。

MASTER_LOG_POS=396; <==这里是show master status时看到的查看到的二进制日志偏移量,注意不能多空格。

④开启主从同步开关,并查看状态

mysql> start slave;

mysql> show slave status\G

mysql> system mysql -uroot -p‘123456‘ -e "show slave status\G" |egrep "Slave_IO_Running:|Slave_SQL_Running:|Seconds_Behind_Master:"

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Seconds_Behind_Master: 0

两个yes和一个0,证明了配置已经成功了。


测试:

查看masterslave有哪些数据库

master:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.00 sec)

 

mysql> system hostname

mysql-master

mysql> 

slave:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| mysql              |

| performance_schema |

| test               |

+--------------------+

4 rows in set (0.00 sec)

 

mysql> system hostname

mysql-slave

 

master端创建helloworld数据库,看slave端是否同步

master:

mysql> create database helloworld;

Query OK, 1 row affected (0.00 sec)

 

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

| helloworld         |

| mysql              |

| performance_schema |

| test               |

+--------------------+

5 rows in set (0.00 sec)

mysql> system hostname

mysql-master

 

slave:

mysql> show databases;

+--------------------+

| Database           |

+--------------------+

| information_schema |

helloworld         |

| mysql              |

| performance_schema |

| test               |

+--------------------+

5 rows in set (0.00 sec)

 

mysql> system hostname

mysql-slave

 

OK,同步成功~~~~~~~

 


主从复制部署回顾:

1.准备两台数据库环境,或者单台多实例环境,能否正常启动和登录。

2.配置my.cnf文件,主库配置log-bin和server-id参数,从库配置server-id,不能和主库及其他从库一样,一般不开启log-bin功能。注意:配置参数后要重启生效。

3.登录主库增加用于从库连接主库同步的账号,例如:rep,并授权replication slave同步的权限。

4.登录主库,整库锁表flush table with read lock;然后show master status查看binlog的日志文件名和位置状态。

5.新开窗口,备份或导出原有的数据库数据,并拷贝到从库所在的服务器目录。(如果数据量很大,并且允许停机,可以停机打包,而不用mysqldump)

6.解锁主库,unlock tables;

7.把主库导出的原有数据恢复到从库。

8.根据主库的show master status查看binlog的位置状态,在从库执行change master to....语句。

9.从库开启同步开关,start slave。

10.从库show slave status\G,检查同步状态,并在主库进行更新测试。

 

本文出自 “Chocolee” 博客,请务必保留此出处http://chocolee.blog.51cto.com/8158455/1415173

mysql主从复制,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。