您的位置:首页 > 数据库 > MySQL

Mysql主从复制配置

2017-06-04 17:16 330 查看
原文地址,转载请注明出处:http://blog.csdn.net/qq_34021712/article/details/72859681 
 ©王赛超

主从复制原理



mysql主(称master)从(称slave)复制的原理:

1、 master将数据改变记录到二进制日志(binary log)中,也即是配置文件log-bin指定的文件(这些记录叫做二进制日志事件,binary log events)

2、 slave将master的binary log events拷贝到它的中继日志(relay log)

3、 slave重做中继日志中的事件,将改变反映它自己的数据(数据重演)

主从配置需要注意的地方

1、 主DB server和从DB server数据库的版本一致

2、 主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]

3、 主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一(必须不能重复)

windows单机多实例

把安装好的mysql复制二份,我们分别修改端口为3380 和3381  默认是3306

进入3381/logs目录下,将所有的文件删除

进入3381/data目录,将所有的日志文件删除(注意:不是所有文件)

打开my.ini文件,将所有的3306替换为3381,文件路径替换为复制后的路径

进入3381 mysql的bin目录下,执行以下命令执行安装
.\mysqld.exe install MySQL-3380 --defaults-file="D:\Program Files\mysql\3381\data\my.ini"

3380也执行相同操作

主从复制的配置

3380为master   3381为slave

Master配置

①修改Master服务器的数据库配置文件(data\my.ini,linux环境配置文件应该在/etc/my.cnf),在 [mysqld] 标签的最下面,添加如下代码:
#需要备份的数据库,如果是多个数据库,分行写

binlog-do-db=test
#不需要备份的数据库  

binlog-ignore-db=mysql  
#开启二进制日志

log-bin=mysql-bin
#服务器id

server-id=80

②保存退出,重启MySQL主服务器。
binlog-do-db用于指定需要同步的数据库,binlog-ignore-db指定不需要同步的数据库,如果这两个参数都不设置,则从服务器会复制主服务器的所有数据库。

③一般不用root账号作同步账号,为此,我们需要在主服务器上创建一个新的用户(如 test01,密码为123456)。
这里我们用命令行的方式创建,方法如下:

打开cmd,切换至 D:\Program Files\mysql\3380\bin,用 root 账户连接MySQL主服务器: 

mysql -uroot -p -P3380

创建新用户: 
create user 'test01'@'127.0.0.1' identified by '123456';

(@后面的ip地址为允许连接的客户端的ip地址。如果改为 '%',就表示客户端没有ip地址的限制)

如:create user 'test01'@'%' identified by '123456';

④然后,给新用户配置主从复制的权限:
grant replication slave on *.* to 'test01'@'127.0.0.1' identified by '123456';

(@后面的ip地址为允许连接的客户端的ip地址,如果改为 '%',就表示客户端没有ip地址的限制,因为是从服务器连接到主服务器,所以我们写从机的ip)

如:grant replication slave on *.* to 'test01'@'%' identified by '123456';

⑤同步数据
如果主服务器的数据库(test)中,已经有数据,我们需要先手动把主服务器中的数据复制到从服务器。方法如下:

在本案例中,我们只备份一个数据库(test),test中有一个表user,表中也已经有了数据。为了防止我们复制数据的时候,数据库test中的数据发生更新,我们需要先锁定数据库,命令如下:

flush tables with read lock;

这个命令是全局读锁定,它会给主服务器中的所有数据库都加上读锁,这里顺便说一下读锁和写锁的区别:

read lock(读锁):也叫共享锁,允许所有的读操作,但阻塞写操作,即所有连接只可以读数据,但不允许写数据。

write lock(写锁):也叫排它锁、独占锁,只允许当前连接的读和写,不允许其他并发的读操作和写操作。

锁定主服务器的数据库后,我们在从服务器中,也创建一个数据库test,并将所有的表(包括表结构和表数据)都导入。

然后,我们执行下面的命令,解锁:

unlock tables;  

⑥登录主服务器的mysql,查询master的状态,记住file和Position的值,下面需要用到

mysql>show master status; 



Slave配置

①修改从服务器的数据库配置文件(data\my.ini,linux环境配置文件应该在/etc/my.cnf),在 [mysqld] 标签的最下面,添加如下代码:)

#端口
port = 3381
#服务器id
server_id =81
#开启二进制日志(从服务器不是必须要开启二进制日志)
log-bin=mysql-bin 

②保存退出,重启MySQL服务。

③连接MySQL从服务器,配置主从:

mysql -uroot -p -P3381

配置复制的参数:
change master to master_host='127.0.0.1',master_user='test01',master_password='123456',master_port=3380,master_log_file='mysql-bin.000001',master_log_pos=498;

参数详解:
master_host: 主服务器的IP
master_user: 主服务器上新创建的用户名
master_password: 用户的密码
master_port: 主服务器的端口,如果未曾修改,默认即可。
master_log_file: 主服务器二进制日志文件的名称,填写查看主服务器的master状态时显示的File的值
master_log_pos: 日志的位置,填写查看主服务器的master状态时显示的Position的值

④启动从服务器的slave复制功能:
start slave;

start slave;启动时报错
ERROR 1872 <HY000>: Slave failed to initialize relay log info structure from the repository
解决办法,在执行start slave;命令之前  先执行 reset slave;

⑤查看同步状态
SHOW SLAVE STATUS;



如果Slave_IO_Running  Slave_SQL_Running都为yes表示成功。

测试

在test数据库新建一张user表,并创建一条记录



一主一从搭建成功。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: