# 主从复制 主从复制,将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。 Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。 每一个从服务器会记录关于二进制日志的信息:文件名和已经处理过的语句,这样意味着不同的从服务器可以分别执行同一个二进制日志的不同部分,并且从服务器可以随时连接或者中断和服务器的连接。 主服务器和每一个从服务器都必须配置一个唯一的ID号(在my.cnf文件的[mysqld]模块下有一个server-id配置项),另外,每一个从服务器还需要通过CHANGE MASTER TO语句来配置它要连接的主服务器的ip地址,日志文件名称和该日志里面的位置(这些信息存储在主服务器的数据库里) ![](https://oss.wangyd.com/article/8eff17942896ef2d9d9fb3532814802e.jpg) # 作用 - 主数据库出现问题,可以切换到从数据库 - 可以进行数据库层面的读写分离 - 可以在从数据库上进行日常备份 # 要求 - 主从数据库版本版本一致 - 在主服务器上,必须开启二进制日志机制和配置一个独立的ID - 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号 - 在开始复制进程前,在主服务器上记录二进制文件的位置信息 - 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件) - 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置 # 配置 ### 流程 ##### 主服务器: - 开启二进制日志 - 配置唯一的server-id - 获得master二进制日志文件名及位置 - 创建一个用于slave和master通信的用户账号 ##### 从服务器: - 配置唯一的server-id - 使用master分配的用户账号读取master二进制日志 - 启用slave服务 ### 场景描述 - 主数据库服务器 版本:MySQL5.6 安装目录:/usr/local/mysql ip: 192.168.188.200 - 从数据库服务器 版本:MySQL5.6 安装目录:/usr/local/mysql ip: 192.168.188.201 ### 配置主服务器 master #### 1.修改配置文件 `vi /etc/my.cnf` [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=200 //[必须]服务器唯一ID,默认是1,这里取ip最后一段 如果已配置,则修改后重启。如果没有配置,则先关闭 mysql 服务器,添加之后再重启服务器 #### 2.创建用户并授权 每一个从服务器都需要用到一个账户名和密码来连接主服务器,可以为每一个从服务器都创建一个账户,也可以让全部服务器使用同一个账户。 简单做法就是为同一个ip网段的所有从服务器创建一个只能进行主从同步的账户。 `mysql -uroot -p'password'` `GRANT REPLICATION SLAVE ON *.* to 'rep201'@'192.168.188.201' identified by 'password';` 或者是所有ip网段: `GRANT REPLICATION SLAVE ON *.* to 'rep'@'192.168.188.%' identified by 'password';` `flush privileges` #### 3.查看master状态,获取二进制日志信息 `show master status;` [![](https://oss.wangyd.com/article/e52065ef773f76e8a15e1c9f6156c297.png)] 记录下 FILE 及 Position 的值,在后面进行从服务器操作的时候需要用到 注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化 ### 配置从服务器 Slave #### 1.修改配置文件 `vi /etc/my.cnf` [mysqld] log-bin=mysql-bin //[必须]启用二进制日志 server-id=201 //[必须]服务器唯一ID,默认是1,这里取ip最后一段 如果已配置,则修改后重启。如果没有配置,则先关闭 mysql 服务器,添加之后再重启服务器 重启 MySQL #### 2.配置同步参数 `mysql -uroot -p'password'` CHANGE MASTER TO MASTER_HOST='192.168.188.200', MASTER_PORT='3306', MASTER_USER='rep201', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000011', MASTER_LOG_POS=416100 - MASTER_HOST 主服务器ip - MASTER_PORT 主服务器端口 - MASTER_USER 主服务器上配置的用来同步的用户名 - MASTER_PASSWORD 主服务器上配置的用来同步的用户密码 - MASTER_LOG_FILE 主服务器上 `show master status` 获取的 File 信息 - MASTER_LOG_POS 主服务器上 `show master status` 获取的 Position 信息 #### 3.启动 Slave 同步进程 `start slave;` ### 检查从服务器复制功能状态 `show slave status \G` ![](https://oss.wangyd.com/article/61d69374bb8ae75d7d7be22f1c27aff2.png) 当 Slave_IO_Running 与 Slave_SQL_Running 的值都必须为YES,就表示主从同步设置成功。 ### 配置其他参数 master 开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作,具体在 mysql 配置文件 my.cnf 的[mysqld]可添加修改如下选项: ##### 不同步哪些数据库 binlog-ignore-db = mysq binlog-ignore-db = test binlog-ignore-db = information_schema ##### 只同步哪些数据库,除此之外,其他不同步 binlog-do-db = game ### 若主服务器有数据 - 主数据库进行锁表操作,不让数据再进行写入动作 `mysql> FLUSH TABLES WITH READ LOCK;` - 查看主数据库状态 `mysql> show master status;` - 记录下 FILE 及 Position 的值。 将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。 - 取消主数据库锁定 `mysql> UNLOCK TABLES;` ### 错误排查 ##### 1.Slave_IO_Running: NO 原因: 1.主服务器的网络不通,或者主服务器的防火墙拒绝了外部连接3306端口 2.在配置从服务器时,输错了ip地址和密码,或者主服务器在创建用户时写错了用户名和密码 3.在配置从服务器时,输错了主服务器的二进制日志信息