首页 > 代码库 > 2-16 mysql主从复制
2-16 mysql主从复制
2-16 mysql主从复制
1. 部署MYSQL主从同步 <M-S>
环境:mysql版本一致,均为5.7.18
master xuegod4 ip 192.168.10.34 数据库密码 yourpasswd
slave xuegod5 ip 192.168.10.35 数据库密码 yourpasswd
1.1 配置主数据库xuegod4
1.1.1 创建需要同步的数据库:
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
service mysqld stop
1.1.2 配置my.cnf
vim /etc/my.cnf
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
1.1.3 重启mysql
service mysqld restart
1.1.4 授权
01. mysql> grant replication slave on *.* to slave@10.10.10.64 identified by "123456";
注:这里如果报错说密码太简单,可以修改密码策略
mysql> set global validate_password_policy=0
授权完后刷新权限:
mysql> flush privileges;
1.1.5 查看状态信息
mysql> show master status;
1.1.6 查看二进制日志
查看mysql数据目录,yum方式安装数据目录为/var/lib/mysql
[root@xuegod4 ~]# ls /var/lib/mysql
mysql> show binlog events\G
复制前要保证同步的数据库一致
[root@xuegod4 ~]# mysqldump -uroot -pyourpasswd HA >HA.sql #可以导出数据库
将导出的数据库传给从服务器,方法:
[root@xuegod4 ~]# scp HA.sql 192.168.10.35:/root/
1.2 配置从数据库服务器xuegod5
1.2.1 两台数据库服务器mysql版本要一致
mysql> show variables like ‘%version%‘;
1.2.2 测试连接到主服务器是否成功
[root@xuegod5 ~]# mysql -uslave -pyourpasswd -h 192.168.10.34
看不到HA数据库,是因为只有复制的权限,没有读的权限。
1.2.3 导入数据库,和主数据库服务器保持一致
mysql> create database HA;
[root@xuegod5 ~]# mysql -uroot -pyourpasswd HA<HA.sql
1.2.4 修改从服务器配置文件
从服务器没必要开启bin-log日志
[root@xuegod5 ~]# service mysqld stop
[root@xuegod5 ~]# vim /etc/my.cnf
master-host=192.168.10.34 #指定主服务器IP地址
master-user=slave #指定定在主服务器上可以进行同步的用户名
master-password=yourpasswd #密码
mysql版本低于5.7版本才需要配置以上三句。5.7版本只需要配置:
server-id=2 #从服务器ID号,不要和主ID相同 ,如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。
可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
1.2.5 配置从数据库服务器
[root@xuegod5 ~]# service mysqld restart #重启mysql服务
mysql>stop slave; #停止slave
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave; #启动slave
mysql> show slave status\G #查看状态
Slave_IO_Running :一个负责与主机的io通信
Slave_SQL_Running:负责自己的slave mysql进程
再到主服务器上查看状态:
mysql> show processlist \G
1.3 插入数据测试同步
在主数据库服务器插入数据:
mysql> insert into T1 value(6,‘yehailun‘);
Query OK, 1 row affected (0.05 sec)
在从数据库服务器上查询
mysql> select * from T1;
+------+----------+
| id | name |
+------+----------+
| 6 | yehailun |
+------+----------+
1 row in set (0.00 sec)
1.4 排错
如果遇到主从不同步,看一下主从bin-log的位置,然后再同步。
在主服务器上看二进制日志事件列表
mysql> show binlog events \G
从服务器执行MySQL命令下:
mysql> stop slave;
Query OK, 0 rows affected (0.03 sec)
mysql> change master to master_log_file=‘mysql-bin-master.000001‘,master_log_pos=1117;
Query OK, 0 rows affected (0.04 sec)
#根据上面主服务器的show master status的结果,进行从服务器的二进制数据库记录回归,达到同步的效果
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果都是yes就代表在同步
重启从服务器,再查看状态:
停止从服务器slave stop;
开启从服务器slave start;
排错思路:
1、二进制日志没有开启
2、IPTABLES 没有放开端口
3、对应的主机 IP地址写错了
SQL线程出错
1、主从服务器数据库结构不统一
出错后,数据少,可以手动解决创建插入,再更新slave状态。
注:如果主上误删除了。那么从上也就误删除了。 #因此主上要定期做mysqldump备份。
2. 部署MYSQL主主双向主从复制 M-M(恢复快照再实验)
通过mysql主主:进行mysql 双向同步数据库HA的配置
mysql主:服务端:xuegod4 IP:192.168.10.34
mysql主:服务端:xuegod5 IP:192.168.10.35
先清空一下二进制日志,mysql> reset master
在上面主从的基础上进行配置
2.1 创建需要同步的数据库
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
2.2 配置xuegod4
它有两种身份:
身份1: xuegod5的主,身份2: xuegod5的从。
2.2.1 修改配置文件
[root@xuegod4 ~]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin-master
binlog-do-db=HA
binlog-ignore-db=mysql #避免同步mysql用户相关配置
2.2.2 重启mysql服务
[root@xuegod4 ~]# service mysqld restart
查状态
mysql> show master status;
2.2.3 授权给xuegod5做从
修改密码策略
mysql> set global validate_password_policy=0;
mysql> grant replication slave on *.* to slave@‘192.168.10.35‘ identified by ‘yourpasswd‘;
如果不符合密码要求报错修改如下(5.7版本)
mysql> set global validate_password_policy=0; #定义复杂度
mysql> set global validate_password_length=1; #定义长度 默认是8
刷新权限
mysql> flush privileges;
2.3 配置xuegod5
2.3.1 修改配置文件
mysql 5.1的配置
master-host=192.168.1.64 #指定主服务器IP地址
master-user=slave64 #指定定在主服务器上可以进行同步的用户名
master-password=123456 #密码
#master-port=3306 可以不写
replicate-do-db=HA #要复制的数据库
master-connect-retry=60 #断点重新连接时间
mysql 5.7配置
[root@xuegod5 ~]# vim /etc/my.cnf
server-id=2
log-bin=master-bin-slave
binlog-do-db=HA
binlog-ignore-db=mysql
2.3.2 重启mysql服务
[root@xuegod5 ~]# service mysqld restart
查看状态;
mysql> show master status;
2.3.3 测试一下从帐号登陆是否正常
[root@xuegod5 ~]# mysql -uslave -pyourpasswd -h 192.168.10.34
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.18-log MySQL Community Server (GPL)
Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql>
2.3.4 授权给xuegod4做从
mysql> grant replication slave on *.* to slave@‘192.168.10.34‘ identified by ‘yourpasswd‘;
如果不符合密码要求报错修改如下(5.7版本)
mysql> set global validate_password_policy=0; #定义复杂度
mysql> set global validate_password_length=1; #定义长度 默认是8
刷新权限
mysql> flush privileges;
2.4 指定xuegod5的master
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave;
mysql> show slave status\G
2.5 指定xuegod4的master
mysql> change master to master192.168.10.35‘,master_user=‘slave‘,master_password=‘yourpasswd‘;
mysql> start slave;
2.6 xuegod4上查看slave的状态
mysql> show slave status\G
2.7 xuegod5上查看slave的状态
mysql> show slave status\G
2.8 插入数据测试
2.8.1 在xuegod4上插入数据,在xuegod5上查看
mysql> use HA
Database changed
mysql> insert into T1 values(1,‘zhangsan‘);
Query OK, 1 row affected (0.02 sec)
2.8.2 在xuegod5上插入数据,在xuegod4上查看
mysql> insert into T1 value(2,‘lisi‘);
Query OK, 1 row affected (0.06 sec)
注意:这种M-M架构没有什么好处,他往往给我们产生一种实现了负载均衡的错觉
3 部署M-S-S模型
环境:
xuegod4 master mysql5.7.18 192.168.10.34
xuegod5 slave中继 mysql5. 7.18 192.168.10.35
xuegod6 slave mysql5. 7.18 192.168.10.36
3.1 创建需要同步的数据库
mysql> create database HA;
mysql> use HA;
mysql> create table T1(id int,name varchar(20));
3.2 部署master xuegod4
3.2.1 授权
修改密码策略:
mysql> set global validate_password_policy=0;
在主服务上授权用户:
mysql> grant replication slave on *.* to ‘repl‘@192.168.10.35 identified by ‘yourpasswd‘;
刷新权限:
mysql> flush privileges;
3.2.2 修改配置
[root@xuegod4 ~]# vim /etc/my.cnf
server-id = 1
binlog-do-db = HA
log-bin=mysql-bin-master
binlog-ignore-db=mysql
sync-binlog=1
binlog-format=row
重启服务:
[root@xuegod4 ~]# service mysqld restart
3.2.3 导出主服务器HA完整备份, 拷贝到 中继 和slave
[root@xuegod4 ~]# mysqldump -uroot -pyourpasswd HA -B>HA.sql #使用-B导入数据库的时候不用新建库
[root@xuegod4 ~]# scp HA.sql 192.168.10.35:/root
[root@xuegod4 ~]# scp HA.sql 192.168.10.36:/root
3.3 部署slave中继xuegod5
3.3.1 导入数据库
mysql> create database HA;
[root@xuegod5 ~]# mysql -uroot -pyourpasswd HA<HA.sql
3.3.2 修改配置
[root@xuegod5 ~]# vim /etc/my.cnf
server-id=2
binlog-do-db=HA
log-bin=mysql-bin-slave1
binlog-ignore-db=mysql
binlog-format=row
log-slave-updates=1 #把它从relay-log当中读取出来的二进制日志并且这本机上执行的操作也记录这自己的二进制日志里面,这样才能使第三台slave通过中继slave读取到相应数据变化
重启服务:
[root@xuegod5 ~]# service mysqld restart
3.3.3 授权
mysql> change master to master_host=‘192.168.10.34‘,master_user=‘repl‘,master_password=‘yourpasswd‘;
mysql> start slave;
查一下状态:
再授权一个用户给slave(xuegod6)
mysql> set global validate_password_policy=0; #修改密码策略
mysql> grant replication slave on *.* to ‘repl‘@192.168.10.36 identified by ‘yourpasswd‘;
刷新权限
mysql> flush privileges;
3.3.4 导出数据库
[root@xuegod5 ~]# mysqldump -uroot -pyourpasswd -B HA>HA2.sql
发送到xuegod6上
3.4 部署slave xuegod6
3.4.1 导入数据
[root@xuegod6 ~]# mysql -uroot -pyourpasswd <HA2.sql
3.4.2 修改配置
[root@xuegod6 ~]# vim /etc/my.cnf
server-id=3
log-bin=mysql-bin-slave2
binlog-format=row
重启服务:
[root@xuegod6 ~]# service mysqld restart
3.4.3指定slave中继作为主
mysql> change master to master_host=‘192.168.10.35‘,master_user=‘repl‘,master_password=‘yourpasswd‘;
mysql> start slave;
3.5 从MASTER上插入数据测试
mysql> create table mermber(id int(4) unsigned not null auto_increment,name varchar(20),primary key(id));
mysql> insert into mermber values(1,‘天屠‘),(2,‘孤叶‘);
2-16 mysql主从复制