1、简述
个人理解,mysql的数据库主从同步,就是指以一台安装了Mysql的服务器作为主服务器,以另一台安装了Mysql的服务器作为从服务器,这样,当主服务器的数据发生变动时,从服务器的数据相应地变动,保持及时更新,且与主服务器一致。
2、主从同步好处
(1)在企业应用中,如果只有一台服务器,那么由于断电或断网等特殊因素造成服务器无法工作,那么相关业务将被迫停止。这时,如果公司部署了这台服务器的从服务器,那么在紧急情况下,可以将操作服务器切换到从服务器,从而保证业务流程正常进行。
(2)在应用程序大量使用select的情况下,可以在程序中需要执行查询的操作放在从服务器上,这样可以极大地减轻主服务器的工作负担,从而提高查询速度。
(3)使用从服务器执行备份不会影响到主服务器的数据更新。
3、操作条件配置
主服务器:(1)系统:windows server 2008 Enterprise
(2)数据库:mysql 5.5.20
从服务器(自己的电脑):(1)windows 7
(2)mysql 5.6.21
注释:对于mysql的版本,尽量保持最新,且主从服务器的版本要尽量保持一致。如果条件达不到,也请尽量使主服务器的版本低于从服务器的版本。
4、同步原理
主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。(来至参考手册)
简单地说,就是主服务器数据更新了,那么日志文件也会有变化,那么记录下变化的一个点,并将日志信息传给从服务器,那么从服务器就按照这个点之后的操作日志对本机的数据库进行操作。
5、具体操作(一般操作我在cmd下进行,可以使用图形界面工具navicat操作)--如何开启mysql服务,登录mysql就自己百度吧,在navicat下很简单
(1)在主服务器上建立需同步的数据库
create database synchronous;
(2)在该数据库下建立一张测试表
create table user(
id int(5) not null primary key auto_increment,
age int(5) not null,
name varchar(20) not null
);
(3)将该数据库synchronous备份到从服务器的上(在navicat下直接拖过去),或直接在从服务器上建立相同的数据库和表--这个步骤不演示。
(4) 由于同步是基于日志的,所以要确保主服务器二进制日志已开启。
在服务器mysql执行查询:show variables like '%log_bin%';查询结果如下
log_bin = off,这说明二进制日志并为开启。
在主服务器上mysql安装目录下有个配置文件my.ini,在[mysqld]下更改log-bin=mysql-bin,如果没有log-bin,则添加并重启数据库。现在执行show variables like '%log_bin%';
(5)既然要同步,那么服务器间怎么识别呢?在主服务器和从服务器上,均必须使用server-id选项为每个服务器建立唯一的复制ID,这个值在1到232–1之间。它的配置 在配置文件my.ini中,我们可以把它写在log-bin下,如图:
我们就把主服务器的server_id设置成1吧。从服务器的server-id设置成2(从服务器的设置在从服务器数据库的my.ini中)。(这个地方my.ini在 C:\ProgramData\MySQL\MySQL Server 5.6中,ProgramData文件夹可能是隐藏的,直接输入地址栏就能找到了--我当时是这样的)
至于后面需要同步什么数据,需要配置如下内容(可直接写在server-id后面):-----这一步是在从服务器的my.ini中
replicate-do-db = synchronoustest #这是要同步的数据库
replicate-do-table= synchronoustest .tablename #这是要同步的表,根据实际情况配置
(6)然后在主服务器数据库上创建一个用于同步数据的用户:
create user 'synchronoususer'@'%' identified by 'synchronoususer'; --这句话用来创建一个对所有从服务器有效的用户
给这个用户赋予一个同步数据的权限,并执行flush privileges;
grant replication slave on *.* to 'synchronoususer'@'%';
flush privileges
确定是否赋予成功可通过select repl_slave_priv from mysql.user where user='synchronoususer';查看
(7)刚才说道同步的点的问题,那么怎么去找这个点呢?在主服务器上执行show master status;
这里的position就是这个点(偏移量),file是日志名称。
(8)接下来在从服务器上执行如下查询语句去寻找主服务器并配置:
CHANGE MASTER TO
MASTER_HOST='主服务器名字,可以写ip地址',
MASTER_USER='synchronoususer',
MASTER_PASSWORD='synchronoususer',
MASTER_LOG_FILE='mysql-bin.000003', --第七步查询出的同步文件
MASTER_LOG_POS=3698674; --这是第七步查询出的同步点
(9)在从服务器上执行start slave就可以了。
以上步骤如果出现错误,可以在错误日志中去看看什么情况。
(10)现在我们在从服务器上执行如下语句:show slave status;
可以看到slave_io_state的值为Waiting for master to send event,从服务器已经在等待接受数据了。
replicate-do-db=synchronoustest ,这个就是我们刚才在配置文件中设置的值
6、好了,配置完成后我们来做个测试吧。
(1)在主服务器上执行插入语句
(2)然后去从服务器上查看user表
到此,说明配置成功,NICE。
7、数据的同步是mysql使用线程来监控的。
(1)从服务器执行start slave-->从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句.
(2)主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以识别为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线 程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。
(3)第3个线程是SQL线程,是从服务器创建用于读取中继日志并执行日志中包含的更新。
(4)每个从服务器有3个线程。有多个从服务器的主服务器为每个当前连接的从服务器创建一个线程;每个从服务器有自己的I/O和SQL线程。
备注:上面的内容有不正确的地方,菜鸡勿喷,请指教。