mysql 主从复制

一、简述Mysql复制

  Mysql复制是通过将mysql的某一台主机的数据复制到其他主机(slaves)上,并且在slaves上重新执行一遍来实现。主服务器每次数据操作都会将更新记录到二进制日志文件,并维护文件的一个索引跟踪日志循环,slaves服务器通过获取主服务器的二进制日志来更新同步数据。当一个从服务器连接主服务器时,它通知主服务器从服务器的日志中读取的最后一次成功更新的为止。

注意:当进行主从复制时,所有对表的更新必须在主服务器上进行,否则会造成冲突

1.1 mysql支持的复制类型

  1)基于语句的复制:在主服务器上执行SQL语句,在从服务器上执行同样的SQL语句(默认采用的),如果没法精确复制,就会自动选择基于行的复制

     2)基于行的复制:把改变的内容复制过去,而不是把命令在从服务器执行一遍,从mysql5.0开始支持

     3)混合类型,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,采用基于行的复制

1.2 复制如何工作

     1)master服务器将数据更新记录到二进制日志文件中(主服务器上必须开启log-bin)

     2)slave将master的二进制日志拷贝到它的中继日志(relay log)

     3)slave通过SQL线程从relay log中读取二进制日志,重新执行一遍,以改变自己的数据

下图描述复制的过程:

1)master服务器上开启二进制日志,每个事务更新数据完成之前,master都会把数据变化记录到二进制日志文件中(串行写入)

2)slave上配置change master to,将master的binary日志拷贝到它自己的中继日志(I/O线程)

3)SQL线程从中继日志中读取事件,并重放其中的事件更新slave的数据,使得和master的数据一样

二、mysql主从复制的配置

操作系统:Linux 2.6.32-573.el6.x86_64 

数据库版本:10.1.18-MariaDB 

数据目录:/mydata/data

备份目录:/server/backup

主服务器(master): 192.168.119.128

从服务器(slave): 192.168.119.129

(在主从服务器上安装mariadb省略)

A:在主服务器上配置如下

1、在master上创建一个备份账户,每个slave使用标准的mysql用户名和密码连接master,进行复制操作的用户会授予replication slave权限。

命令:

mariaDB [jiaoyu]> grant replication slave,reload on *.* to 'backup'@'192.168.119.%' identified by '1234'

2、master上开启log-bin

配置my.cnf(启用log-bin,配置server-id)

3、备份master服务器上的数据(/server/backup)

[root@db backup]# mysqldump -uroot -pLsf@8816 -A -x > /server/backup/mysql_`date +%F`.sql
[root@db backup]# cd /server/backup/
[root@db backup]# ll
total 948
drwxr-x---. 4 root root 4096 Oct 13 11:03 2016-10-13_10-47-03
-rw-r--r--. 1 root root 0 Oct 13 11:16 aa.sql
-rw-r--r--. 1 root root 481986 Oct 13 13:54 mysql_2016-10-13.sql

4、通过SCP把主服务器上的数据拷贝到从服务器上,在从服务器上执行一遍,以便在主从同步之前,数据是一致的

5、记录master服务器上master_log_file和master_log_pos

MariaDB [jiaoyu]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 643 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

B、在从服务器上配置如下(slave)

1、配置change master(master.info)

mariaDB [jiaoyu]>change master to master_host='192.168.119.128',master_port=3306,master_user='backup',master_password='1234',master_file_log='mysql-bin.000009',master_file_pos=643;

2、配置my.cnf开启

log_bin           = mysql-bin

server_id         = 2
relay_log         = mysql-relay-bin
log_slave_updates = 1
read_only         = 1
(server-id必须唯一,relay_log中继日志,log_slave_updates表示slave将复制事件写进自己的二进制日志(后面会看到它的用处))
3、把从主服务器拷贝过来的备份数据,还原数据库
4、开启start slave

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.119.129
Master_User: req
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 643
Relay_Log_File: test-relay-bin.000012
Relay_Log_Pos: 537
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

....

Seconds_Behind_Master: 0

你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接

*************************** 2. row ***************************
Id: 11
User: req
Host: 192.168.119.128:44967
db: NULL
Command: Binlog Dump
Time: 240
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
Progress: 0.000
2 rows in set (0.00 sec)

 C 演示数据同步

在master上操作:


MariaDB [jiaoyu]> insert into student(Sname,Sage,gender,CID)values('hai',34,'m',5);
Query OK, 1 row affected (0.02 sec)

MariaDB [jiaoyu]> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000009 | 865 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

在slave上查看

MariaDB [jiaoyu]> select * from student;
+-----+-------------+------+--------+-----+
| SID | Sname | Sage | gender | CID |
+-----+-------------+------+--------+-----+
| 1 | xionghaihua | 22 | m | 1 |
| 2 | zhaomei | 22 | f | 2 |
| 3 | liming | 30 | m | 3 |
| 4 | wenli | 32 | NULL | 2 |
| 5 | hai | 34 | m | 5 |
+-----+-------------+------+--------+-----+
5 rows in set (0.00 sec)

[root@test data]# vim master.info

33
mysql-bin.000009
865

本文出自http://www.cnblogs.com/louis2008/p/mysql1.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章