共计 2759 个字符,预计需要花费 7 分钟才能阅读完成。
一:测试环境介绍
主从复制测试环境是 Ubuntu+MySQL 主 5.7,master 服务器 ip 是 192.168.71.135,slave 服务器 ip 是 192.168.71.137,Ubuntu 环境是从一台已配置好环境的服务器克隆的。
二:mysql 主从配置
1:) master 配置
a 在 mysql 目录下(/etc/mysql),mysql.cnf 文件中添加 server-id 和 Log-bin. 主从服务器的 server-id 不能相同
log-bin=mysql-bin
server-id=100
设置好后,使用 show master status; 查询一下状态
设置从服务器连接的账号,密码等
配置连接用户
GRANT REPLICATION SLAVE ON *.* to ‘mysql 账号 ’@’%’ identified by ‘ 密码 ’; 这里是测试,没有指定从服务器的 ip. 如需指定 ip, 执行下面一个指令
GRANT REPLICATION SLAVE ON *.* to ‘mysql 账号 ’@’192.168.71.137’ identified by ‘ 密码 ’;
配置好后记录重启 mysql.
2:)配置从数据库
2.1 Slave的配置与 master 类似 (配置文件名称:mysql.cnf,在 /etc/mysql 目录,你的环境可能不是该目录),你配置完成后仍然需要重启slave 的MySQL。配置参数如下:
log_bin= mysql-bin
server_id= 110
relay_log=mysql-relay-bin
log_slave_updates=1
read_only=1
server_id是必须的,而且唯一。slave没有必要开启二进制日志,但是在一些情况下,必须设置,例如,如果 slave 为其它 slave 的master,必须设置 bin_log。在这里,我们开启了二进制日志,而且显示的命名( 默认名称为 hostname,但是,如果hostname 改变则会出现问题 )。
relay_log 配置中继日志,log_slave_updates表示 slave 将复制事件写进自己的二进制日志 ( 后面会看到它的用处 )。
有些人开启了 slave 的二进制日志,却没有设置 log_slave_updates,然后查看slave 的数据是否改变,这是一种错误的配置。所以,尽量使用 read_only,它防止改变数据( 除了特殊的线程 )。但是,read_only 并是很实用,特别是那些需要在 slave 上创建表的应用。
2.2 配置完成后重新启动mysql
/etc/init.d/mysql restart
2.3 执行同步SQL 语句
mysql> change master to
master_host=’192.168.71.135’,
master_user=’syncuser’,
master_password=’123456’,
master_log_file=’mysql-bin.000001’, — 该值来源于主库,执行 show master status 后的 File 字段
master_log_pos=443;— 该值来源于主库,执行 show master status 后的 position 字段
2.4 查询从库状态
start slave;
show slave status\G
三:主库 SQL 测试
主库创建数据库:
Create database copytest;
创建表:
Create table tu (uid bigint primary key);
添加一条数据
Insert into tu (1);
现在我们来看从数据库:
从图中可以看到,主库的数据,已经复制到了从库。
五:总结问题
1:执行同步语句,出错
mysql> change master to
master_host=’192.168.71.135’,
master_user=’syncuser’,
master_password=’123456’,
master_log_file=’mysql-bin.000001’,
master_log_pos=443;
出现如下错误:
Slave is not configured or failed to initialize properly. You must at least set –server-id to enable either a master or a slave. Additional error messages can be found in the MySQL error log.
解决办法:
删除 slave 的 mysql 库的表
drop table slave_master_info;
drop table slave_relay_log_info;
drop table slave_worker_info;
drop table innodb_index_stats;
drop table innodb_table_stats;
重新启动 slave 数据库:/etc/init.d/mysql restart;
2: 配置好的,slave 执行 show slave status\G 语句后,slave_io_running: no 显示 no
slave_io_running: yes 才能正常复制,为 no 时无法复制,可以看到有一个错误,
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
意思是 master 和 slave 的 uuid 重复了,用 show variables like ‘%server_uuid%’ 查询出 uuid,明显两台机子的 uuid 一样,所以出现了上面的错误.
因为主从的 utunbu 环境是克隆的,所以出现了这个问题,我们进入 mysql 的 data 目录,修改 auto.cnf 文件,通过 show variables like ‘%datadir%’ 查询出 data 目录。
MySQL 主从复制部署 http://www.linuxidc.com/Linux/2017-09/146728.htm
MySQL 主从复制技术的简单实现 http://www.linuxidc.com/Linux/2017-11/148534.htm
Ubuntu 16.04 下实现 MySQL 主从复制 http://www.linuxidc.com/Linux/2017-08/146624.htm
MySQL 主从复制及遇到问题的解决 http://www.linuxidc.com/Linux/2017-10/147557.htm
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-12/149303.htm