MySQL主从复制,就是利用MySQL本身的复制特性实现

达到互联网常用的数据库配置,如:1主+1从;1主+N从等架构

一、复制解决的根本问题

让一台服务器的数据与其他服务器保持同步。

二、支持两种复制方式

基于行的复制(5.1版本引入)

基于语句的复制(也称为逻辑复制)

两种方式都是通过主库上记录二进制日志,在备库重放日志的方式来实现异步的数据复制。

三、复制解决的问题

1、数据分布

2、负载均衡

3、备份

4、高可用和故障切换

5、MySQL升级测试

四、复制如何工作

复制通常有三个步骤:

1、在主库上把数据更改记录记录到二进制日志中(这些记录被称为二进制日志事件)

2、备库将主库上的日志复制到自己的中继日志(relay log)中

3、备库读取中继日志中的事件,将其重放到备库数据之上

五、配置复制

下面列出针对新安装的主库和备库,可以从以下几步进行配置:

1、在每台服务器创建复制账号

2、配置主库和备库

3、通知备库连接到主库并从主库复制数据

1、创建复制账号

注:主库和备库都执行该操作。

GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO username@'192.168.0.%' IDENTIFIED BY 'password';
2、配置主库和备库

在主库的 my.cnf[mysqld] 增加或修改以下配置:

log-bin=mysql-bin
binlog_format=mixed
server_id = 1
expire_logs_days = 10

执行 SHOW VARIABLES LIKE 'log_bin'; , 可以查看二进制日志是否打开。

执行 SHOW MASTER STATUS;, 可以看到二进制日志的文件名和位置(这2个值,在备库启动复制时有用到)

在备库的 my.cnf[mysqld] 增加或修改以下配置:

log-bin=mysql-bin
binlog_format=mixed
server_id = 2
expire_logs_days = 10

注: 主库和备库的server_id是唯一标识。

3、启动复制

在备库执行以下语句,告诉备库如何连接到主库并重放其二进制日志。

CHANGE MASTER TO MASTER_HOST = 'server_ip or address',
MASTER_USER = 'username',
MASTER_PASSWORD = 'password',
MASTER_LOG_FILE = 'mysql-bin.000001',
MASTER_LOG_POS = 0;

语句中的 MASTER_LOG_FILEMASTER_LOG_POS 和第二步中,设置好的主库状态一致。(当然也可以设置MASTER_LOG_POS=0, 从头开始)

执行SHOW SLAVE STATUS;, 查看复制是否正确执行,这里的 Last_ErrnoLast_Error 会显示发生的错误。

执行START SLAVE; , 开始复制。如果没有显示错误,我们再用SHOW SLAVE STATUS;进行检查

此时,Slave_IO_RunningSlave_SQL_Running 都已经启动。

以上,就是实现MySQL复制的一些简单操作。

六、期间可能会遇到问题

1、主库添加log-bin-index 参数后,从库报以下错误:

Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'
Got fatal error 1236 from master when reading data from binary log: 'could not find next log'

解决方式:在备库执行以下语句。

stop slave;

reset slave;

start slave;

2、错误提示主从使用了相同的server UUID

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.

导致原因:

auto.cnf 中的 server-uuid 相同

该场景发生是因为我使用的是虚拟机直接克隆整机,所以会导致整个问题。

解决方式:

停止mysql服务,删除 auto.cnf 文件后,重启mysql服务

服务器执行

systemctl stop mysqld.service

mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak

systemctl start mysqld.service

其他参考解决

【MySQL】Got fatal error 1236原因和解决方法