准备阶段:
软件----mysql-5.7.17.tar 网上或者官网找
解压之后:
mysql-community-client-5.7.17-1.el7.x86_64.rpm
mysql-community-common-5.7.17-1.el7.x86_64.rpm
mysql-community-devel-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.17-1.el7.x86_64.rpm
mysql-community-embedded-devel-5.7.17-1.el7.x86_64.rpm
mysql-community-libs-5.7.17-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.17-1.el7.x86_64.rpm
mysql-community-minimal-debuginfo-5.7.17-1.el7.x86_64.rpm
mysql-community-server-5.7.17-1.el7.x86_64.rpm
mysql-community-test-5.7.17-1.el7.x86_64.rpm
系统:centos7 2台最小安装
yum源正常
可以yum repolist检查下
原理以及概念:
1) MYSQL主从同步是异步复制的过程,整个同步需要开启3线程,master上开启bin-log日志(记录数据库增、删除、修改、更新操作);
2) Slave开启I/O线程来请求master服务器,请求指定bin-log中position点之后的内容;
3) Master端收到请求,Master端I/O线程响应请求,bin-log、position之后内容返给salve;
4) Slave将收到的内容存入relay-log中继日志中,生成master.info(记录master ip、bin-log、position、用户名密码);
5) Slave端SQL实时监测relay-log日志有更新,解析更新的sql内容,解析成sql语句,在salve库中执行;
6) 执行完毕之后,Slave端跟master端数据保持一致
bin-log的用途:
bin-log日志最大的功能记录数据库增、删、改、插入等操作,记录用户操作的SQL语句;
bin-log日志可以用数据增量备份、完整备份;
bin-log还可以主要主从复制+读写分离;
主从深入剖析:
1.Master 数据库只要发生变化,立马记录到Bin log 日志文件中
2.Slave数据库启动一个I/O 线程连接Master数据库,请求Master变化的二进制日志
3.Slave I/O获取到的二进制日志,保存到自己的中继日志文件中。
4.Slave 有一个 SQL 线程定时检查中继日志是否变化,变化那么就更新数据
总结:我们要保证Slave机的SQL和I/O线程是yes
为什么要做主从?
1.实现服务器负载均衡
2.通过复制达到数据的异步备份
3.提高数据库的可用性
4.防止出现主宕机,服务停止或出现问题
开始实验
1.主从步骤一样初级部署
msater(主) slave(从):
tar xf mysql-5.7.17.tar 解压
yum -y install mysql-community* 将mysql的包全部安装
systemctl start mysqld 开启服务
systemctl enable mysqld 开机自启
grep -i password /var/log/mysqld.log 不开启服务是不会生成日志文件的
输出:
2021-12-16T17:33:40.239450Z 1 [Note] A temporary password is generated for root@localhost: !9HIsf?(=oOD 后面这段就是初始密码
mysqladmin -uroot -p'!9HIsf?(=oOD' password zzz2021@qqqq.cn
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety. #成功
mysql -uroot -pzzz2021@qqqq.cn 进入数据库
2.配置主
主!!!!
vim /etc/my.cnf #配置文件
[mysqld]
server_id=10 #启用binlog日志文件
log_bin=master10 #日志默认存储在数据库目录下
:wq保存退出
systemctl restart mysqld #重启服务
用户授权
mysql -uroot -p密码 replication slave 让用户有复制权限
mysql> grant replication slave on *.* to repluser@"%" identified by "密码";
先exit退出,systemctl restart mysqld 重启下
进入数据库
查看日志名信息和偏移量
!!!很重要,查到的给从服务器用
show master status;
mysql> show master status\G
*************************** 1. row ***************************
File: master10.000001 #日志名
Position: 154 #偏移量
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
3.配置从
从!!!!配置从了,兄弟们 主192.168.242.10 从192.168.242.11
vim /etc/my.cnf
[mysqld]
server_id=11
:wq #保存退出
systemctl start mysqld #重启
进入数据库
指定主服务器信息
mysql> change master to
master_host="192.168.242.10",
master_user="repluser",
master_password="密码”,
master_log_file="master10.000001",
master_log_pos=154;
启动slave进程
mysql> start slave;
mysql> show slave status\G 最关键!!!!要出现2个yes
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
注意注意
systemctl stop firewalld
setenforce 0 #关闭防火墙,selinux
Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'repluser@192.168.242.10:3306' - retry-time: 60 retries: 1
!!!!!!!!!!!!出现该报错的时候,先检查防火墙和selinux关了没
再 #博主就是因为网关防火墙和selinux排了一个半小时错,各种排查....
mysql> stop slave;
mysql> 重新指定master信息
change master to master_host="ip",
master_user="用户名",
master_password="密码",
master_log_file="日志文件",
master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.242.10
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master10.000002
Read_Master_Log_Pos: 441
Relay_Log_File: mysql2-relay-bin.000002
Relay_Log_Pos: 319
Relay_Master_Log_File: master10.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
#成功
4.验证
进入数据库建库建表
主:
mysql> create database DB1;
mysql> use DB1;
mysql> create table DB1.tt(name char(2));
Query OK, 0 rows affected (0.06 sec)
从验证:
mysql> show databases;
mysql> use DB1;
mysql> show tables;
#可以查看到库和表
到这里就成功了
5.常见报错
常见1:
Last_IO_Error: Got fatal error 1236 from master
when reading data from binary log: 'Could not find first log file name in binary log index file'
在从服务器执行如下操作:
mysql> stop slave;
在主服务器查看日志名和偏移量
host51 show master status;
在从服务器 重新指定日志名和偏移量
mysql> change master to master_log_file="日志名" , master_log_pos=偏移量;
mysql> start slave;
mysql> show slave status \G
常见2:
Last_IO_Error: 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
在从服务器做如下操作:
vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=2dac4865-4770-11ec-9103-6462be92a06e 修改一个字母(字母个数不能少)
:wq
systemctl restart mysqld
常见3:
Last_IO_Error: error connecting to master 'repluser@192.168.242.10:3306' -
retry-time: 60 retries: 2
在从服务器做如下操作:
MySQl> stop slave;
mysql> change master to master_host="ip" master_user="用户名",master_password="密码" master_log_file="日志名", master_log_pos=偏移量;
MySQL> start slave;
mysql> show slave status \G
公共解决方案:
把slave角色的服务器恢复为独立的数据库服务器,重新配置为从服务器。
在从服务器执行如下操作:
systemctl stop mysqld
cd /var/lib/mysql/
rm -rf master.info
rm -rf *-relay-bin.*
rm -rf relay-log.info
systemctl start mysqld
最后,如果还是解决不了,或者我的方法解决不了