为MySQL服务器配置复制非常简单。但由于场景不同,基本的步骤还是有所差异。最基本的场景完全新的主库与从库,总的来说分为以下几步:
这里我们假定大部分配置采用默认值即可,在主库和备库都是全新安装并且拥有同样的数据(默认MySQL数据库)接下来我们展示如何一步步配置复制:假设有服务器server1(IP地址10.100.2.122)和服务器server2(IP地址10.100.2.143)。
MySQL会赋予一些特殊的权限给复制线程。在备库运行的I/O线程会建立一个到主库的TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限。备库I/O线程以该用户名连接到主库并读取其二进制日志。通过如下语句创建用户账号:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.*
TO repl@'10.100.2.%' IDENTIFIED BY 'p4ssword',;
我们在主库和备库都创建该账号。注意我们把这个账户限制在本地网络,因为这是一个特权账号(尽管该账号无法执行select或修改数据,但仍然能从二进制日志中获得一些数据)。
复制账户事实上只需要有主库上的REPLICATION SLAVE权限,并不一定需要每一端服务器都有REPLICATION CLIENT权限,那为什么我们要把这两种权限给主/备库都赋予呢?这有两个原因:
这是规范,但是本次只是一次演示与案例,没有创建该用户,直接使用了两个数据库的root权限账号
下一步需要在主库上开启一些设置,假设主库是服务器server1,需要打开二进制日志并指定一个独一无二的服务器ID(server ID),在主库的my.ini(linux系统名字叫做my.cnf)文件中增加或修改如下内容:
log-bin
server-id = 2
实际取值由你决定,这里只是为了简单起见,当然也可以设置更多需要的配置。使用默认值可能会导致和其他服务器的ID冲突,在公司常用的做法是使用服务器IP地址的末8位,但要保证它是不变且唯一的(例如,服务器都在一个子网里)。我们最好选择一些有意义的约定并遵循,但是这里就随意了。
需要注意的是,我的mysql版本为5.7,在不同的系统,不同的版本上名字会有出入,如log_bin,server_id;在保存后,不要忘了重启mysql服务使其生效哦
备库上也需要在my.ini中增加类似的配置,并且同样需要重启服务器。
log_bin
server_id = 1
read_only = 1
从技术上来说,这些选项并不总是必要的。其中一些选项我们只是显式地列出了默认值。事实上只有server_id是必需的,因为server-id默认是1,所以这里的从库我没有修改。这里我们同样也使用了log_bin,并使用了默认的名字。当然如果你愿意的话,也可以设置成别的值。
最好使用read_only配置选项,该选项会阻止任何没有特权权限的线程修改数据(所以最好不要给予用户超出需要的权限)。但read_only选项常常不是很实用,特别是对于那些需要在备库建表的应用。
我们在从库上执行该语句,host填写主库的ip地址,账户密码同理,而主库的二进制日志文件我们需要show一下复制粘贴即可;该名字其实可以配置,在上述的log-bin中可以配置前缀,不配置默认使用设备名称作为前缀。
CHANGE MASTER TO MASTER_HOST='10.100.2.122',
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='DESKTOP-V351QGI-bin.000003',
MASTER_LOG_POS=0;
执行完成后,我们可以看看Slave的状态,如果有错误的话会在结果中的LAST_ERROR中显示
SHOW SLAVE STATUS;
没有错误的话,执行START SLAVE,主从复制就开始了,主库中插入或修改的数据就会被异步执行到从库里面去;