点击蓝色“潭时录”关注我丫
每天和小潭一起快乐的学习~
你好,我是在学mysql的小潭。在上一期10-mysql高级篇-锁机制介绍推文中我们认识了数据库中的锁。今天,我们将一起学习MySQL中主从复制相关的知识。
一、基本原理
slave从机会从master主机读取binlog来进行数据同步。

复制过程主要分为以下三步:
master将改变记录到二进制日志(binary log),这个记录过程被称为二进制日志事件,binary log events.
slave将master的binary log events拷贝到它的中继日志(relay log)
slave重做中继日志中的事件,将改变应用到自己的数据库中,MySQL的复制是异步且串行化的
二、基本原则和存在的问题
每个slave只有一个master
每个slave只能有一个唯一的服务器ID
每个master可以有多个slave
延时,是MySQL的复制中需要面临的最大问题。
三、常见配置
我们此处仅以一主一从的形式为例,来具体学习其中的配置知识。
要求:MySQL版本一致且后台以服务形式运行,主从都配置在[mysqld]节点下,都是小写。
配置项:
| 主机修改my.ini/my.cnf配置文件 | |
| [必须]主服务器唯一ID | server-id=1 |
| [必须]启用二进制日志 | log-bin=自己本地的路径/mysqlbin 以windows为例: log-bin=X:/XX/MysqlXX/data/mysqlbin |
| [可选]启用错误日志 | log-err=自己本地路径/mysqlerr 以windows为例: log-err=X:/XX/MysqlXX/data/mysqlerr |
| [可选]根目录 | basedir="自己本地路径" 以windows为例: basedir="X:/XX/MysqlXX/" |
| [可选]临时目录 | tmpdir="自己本地路径" 以windows为例: tmpdir="X:/XX/MysqlXX/" |
| [可选]数据目录 | datadir="自己本地路径/Data/" 以windows为例: datadir="X:/XX/MysqlXX/Data/" |
| 主机,读写皆可 | read-only=0 |
| [可选]设置不需要复制的数据库 | binlog-ignore-db=mysql |
| [可选]设置需要复制的数据库,不配置该参数则表示全复制 | binlog-do-db=主数据库名称 |
| 从机修改my.cnf配置文件 | |
| [必须]从服务器唯一ID | server-id=2 |
| [可选]启用二进制日志 | log-bin=mysql-bin |
| 主从机关闭防火墙 | |
| windows手动关闭 | 控制面板 -> 系统和安全 -> Windows防火墙 |
linux防火墙 或开放端口(建议) | service iptables stop 或 firewall-cmd --permanent --add-port=3306/tcp |
| 以windows为例,在主机上建立账户并授权slave | |
授权从机IP的xx以指定的密码登录到主机 并刷新 | mysql> GRANT REPLICATION SLAVE ON *.* TO 'xx'@'从机数据库IP' IDENTIFIED BY '指定的密码xx'; mysql> flush privileges; |
| 查询master状态 | mysql> show master status; 记录下File和Position的值 |
执行完以上步骤后将不再操作主服务器MySQL,防止主服务器状态值变化
|
| linux从机配置账户信息 | |
配置从机相关参数 (不分库) 如果出现ERROR 1198(HY000): ...xxxx ; run STOP SLAVE first说明之前做过同步,需要先停止主从复制功能,但需要注意再次查询主机状态是否变化 | mysql> CHANGE MASTER TO MASTER_HOST='主机IP', MASTER_USRE='指定的主机名xx', MASTER_PASSWORD='指定的密码', MASTER_LOG_FILE='File名称', MASTER_LOG_POS=Position值; |
| 启动从服务器复制功能 | mysql> start slave; |
| 查询slave状态 | mysql> show slave status\G; (以键值对方式显示,以下参数同为Yes表示配置成功) Slave_IO_Running: Yes Slave_SQL_Running: Yes |
(此处若在配置从机参数后,查询slave状态仍遇到Last_IO_Error: error connecting to master 'xx@ip:3306' -retry-time:60 retries: 1的提示时,建议将master主机的mysql库的user表中user='root'对应的host值由localhost改为%,即允许所有ip访问): GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '数据库密码' WITH GRANT OPTION; 或 UPDATE user set host='%' where user='root'; |
| 测试 | |
| 主机建表建库 | mysql> create database mydbt1; -- 建库 use mydbt1; -- 用库 create table test01(id int not null, name varchar(20)); -- 建表 insert into test01 values(1, 'test'); -- 插数 select * from test01; -- 查询 |
| 从机效果检查 | mysql> show database; select * from test01; |
主机
| 从机
|
| 停止主从复制 | |
| 从机停掉即可 | stop slave; |
| 重置主从复制配置 | |
| 停止从机 | stop slave; |
| 重置主机 | reset master; |
下期预告:mysql高级篇知识总结










