一、简述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]# lltotal 948drwxr-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.sql4、通过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
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.119.129Master_User: reqMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000009Read_Master_Log_Pos: 643Relay_Log_File: test-relay-bin.000012Relay_Log_Pos: 537Relay_Master_Log_File: mysql-bin.000009Slave_IO_Running: YesSlave_SQL_Running: Yes....
Seconds_Behind_Master: 0
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接
*************************** 2. row ***************************
Id: 11User: reqHost: 192.168.119.128:44967db: NULLCommand: Binlog DumpTime: 240State: Master has sent all binlog to slave; waiting for binlog to be updatedInfo: NULLProgress: 0.0002 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.000009865本文出自http://www.cnblogs.com/louis2008/p/mysql1.html