一、主从同步原理:
客户端访问主库,从库复制、同步主库的所有操作
单项复制时,建议将从库设置为只读
从库 从主机上同步数据的工作过程,如图:
1、Master,记录数据更改操作
— 启用binlog日志
— 设置binlog日志格式
— 设置server_id
2、Slave运行2个线程
— Slave_IO:复制master主机binlog日志文件里的SQL到本机的relay-log文件里
— Slave_SQL:执行本机relay-log文件里的SQL语句,重现Master的数据操作
如图:
二、构建思路:
构建主从同步,基本构建思路:
1、确保数据相同
– 从库必须要有主库上的数据。
2、配置主服务器
– 启用 binlog 日志及设置格式,设置 server_id, 授权用户
3、配置从服务器
– 设置 server_id ,指定主数据库服务器信息
4、测试配置
– 客户端连接主库,写入的数据,在连接从库的时候也确保数据一致。
三、开始搭建:
主从同步结构模式
基本应用:
— 单项复制:一主一从
1、Master服务器
– 应包括希望同步的所有库
写在主库配置文件里参数(对所有从库都有效)
binlog_do_db=库名列表 //允许同步的库
binlog_ignore_db=库名列表 //不允许同步的库
主库配置选项
2、Slave 服务器
– 离线导入由 Master 提供的备份
– 清空同名库
写在从库配置文件里参数(只针对从库本机有效)
replicate_do_db=库名列表 //指定只同步的库
replicate_ignore_db=库名列表 //指定不同步的库
从库配置选项
1)、主库:192.168.1.1
启用 binlog 日志及设置格式,设置 server_id
[root@mysql51 ~]# vim /etc/my.cnf
[mysqld]
server_id=11
log_bin=mysql11 //binlog日志文件名称
binlog_format="mixed" //日志文件格式
[root@mysql51 ~]# systemctl restart mysqld
[root@mysql51 ~]# ls /var/lib/mysql/mysql11*
授权用户
[root@mysql51 ~]# mysql -hip -uroot -ppasswd -Pport
mysql> grant replication slave on *.* to repluser@"%" identified by "passwd";
mysql> select host,user from mysql.user where user='repluser';
mysql> show master status; //查看使用的日志文件及偏移量
2)、从库:192.168.1.2
[root@mysql2 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
[root@mysql2 ~]# systemctl restart mysqld
[root@mysql2 ~]# mysql -hip -uroot -ppasswd
mysql> show master status;
mysql> change master to master_host='192.168.4.1', //主库ip地址
-> master_user='repluser', //出库授权用户名
-> master_password='passwd', //授权用户密码
-> master_log_file='mysql1.000001',//日志文件
-> master_log_pos=1;//偏移文件
mysql> start slave; //启动salve进程
mysql> show slave status\G; //查看slave状态
Slave_IO_Running: Yes //IO线程状态
Slave_SQL_Running: Yes//SQL线程状态
如果 Slave_IO_Running为NO,查看下面Last_IO_Error: Fatal error:的报错信息
[root@mysql2 mysql]# vim auto.cnf //此配置文件查看sql数据库的uuid
从服务器相关文件
测试主从同步配置:在及客户端主机连接主机1对数据库做访问
• 在 Master 上操纵数据
– 新建 newdb 库、 newtbl 表
– 任意插入几条表记录
• 在 Slave 上查看数据更改情况
– 确认新建的 newdb 库、 newtbl 表
– 列出 newtbl 表的所有记录
在主库1上添加授权用户给客户端主机连接使用
mysql> create database db1;
mysql> create table db1.a(id int);
mysql> grant select,insert,update on db1.* to admin@"%" identified by "passwd";
在客户端主机连接主库服务器1,对记录做访问
[root@client0 ~]# mysql -uroot -h192.168.1.1 -ppasswd
mysql> select @@hostname;
mysql> insert into db1.a values(111),(1231),(324);
mysql> select * from db1.a;
再从库服务器2本机也能查看到相同的数据为成功
[root@mysql2 mysql]# mysql -u root -ppasswd
mysql> select * from db1.a;
【一主两从 同步结构配置】
把数据库服务器3 也配置为1的从数据库服务器
主库主机1 已经是主数据库服务器,无需再做配置
配置从库3
与主库数据一致(把主库数据的完全备份拷贝到本机执行恢复)
[root@mysql1 ~]# mysqldump -hip -uroot -ppasswd --single-transaction --master-data=1 --databases db1 > /root/db1.sql
[root@mysql1 ~]# scp db1.sql 192.168.1.3:/root/
[root@mysql3 ~]# mysql -u root -ppasswd
mysql> create database db1;
mysql> use db1;
mysql> source /root/db1.sql;
mysql> select * from db1.a;
[root@mysql3 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
[root@mysql3 ~]# systemctl restart mysqld
检测授权用户能否连接数据库
[root@mysql3 ~]# mysql -h192.168.1.1 -urepluser -ppasswd
数据管理员指定主库数据信息
[root@mysql3 ~]# mysql -hip -uroot -ppasswd
mysql> change master to
-> master_host='192.168.1.1',
-> master_user='repluser',
-> master_password='passwd',
-> master_log_file='mysql1.000001',
-> master_log_pos=1337;
master_log_pos=1337:从51主机上执行sql命令mysql> show master status;获取
查看slave程序的状态信息
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试
客户端0连接主机1写入的数据在从库2和3主机上也能查看到数据,即成功
[root@client0 ~]# mysql -hip -uadmin -h192.168.1.1 -ppasswd
mysql> insert into db1.a values(66066);
从库1和2主机:登入数据库,执行mysql> select * from db1.a;查看是否有插入的数据
如果有,那么就可以了,搭建完成