目录
此文章仅提供本人记录使用,全程按照本人实际自己挖坑、踩坑、跳坑、躺平步骤演示
最近时间开始学习主从库搭建,但本人技术实在受限,又苦于无良师。看似在别人眼里很简单的事情,愣是把该遇到的、不该遇到的错误全犯了一遍。此文章仅为了自己温故,如若幸运,更希望有大佬指点一二,不胜感激。当然,能帮助到别人哪怕有个二三启示再好不过。
提示:以下是本篇文章正文内容,下面案例可供参考
一、为什么要做主从数据库?
个人简单式理解:
1.非常不错的容灾机制。
2.降低磁盘I/O访问的频率。
3.读写分离,更优秀的并发性能。
4.负载均衡。
5.充分发挥各种引擎优点。
二、操作步骤
1.创建两个虚拟机
本人使用的Centos7镜像,闲话少说,本人对着VMware虚拟机就是下一步下一步,此处本人乱点一通,就不在此做赘述。如果有需要步骤的朋友可以留言,本人可单独做一篇文章予以讲解虚拟机创建。
这里创建了两个虚拟机:
master: 用于主库操作 ip为:192.168.40.131
slave:用于从库操作 ip为:192.168.40.132
2.安装MySQL
1.下载MySQL安装包
wget https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
此时ls查看目录已下载好mysql57-community-release-el7-11.noarch.rpm
2.安装MySQL源
yum -y localinstall mysql57-community-release-el7-11.noarch.rpm
这里会有时抛出一个小问题:
执行rm -r -f /var/run/yum.pid 后重新执行即可
3.安装MySQL
yum -y install mysql-community-server
安装失败:mysql-community-client-5.7.39-1.el7.x86_64.rpm 的公钥尚未安装
4.跳过秘钥检查
vim /etc/yum.repos.d/mysql-community.repo
找到MySQL 5.7修改gpgcheck=1改为gpgcheck=0后再次执行安装MySQL命令,安装成功!
5.启动MySQL,设置为开机自启
systemctl start mysqld
systemctl enable mysqld
systemctl daemon-reload
6.查看MySQL生成临时root初始密码
vim /var/log/mysqld.log
有时候特殊符号不能识别,此时解决方法:
vim /etc/my.cnf
#加入skip-grant-table 跳过MySQL密码验证
systemctl restart mysqld #重启MySQL后登录
mysql -uroot -p #输入密码时直接回车
#设置新密码
update mysql.user set authentication_string=password('123456') where user = 'root';
exit;
#退出后,去掉在MySQL配置文件中的skip-grant-table,保存后重启MySQL
7.使用ALTER USER语句重置密码,并设置远程访问
注意:需要先使用ALTER USER 修改密码。后才能使用MYSQL。
mysql> alter user 'root'@'localhost' identified by '123456';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
密码不符合当前的策略要求,执行
#降低设置密码的验证强度等级
set global validate_password_policy=LOW;
#设置6位密码
set global validate_password_length=6;
再次执行
alter user 'root'@'localhost' identified by '123456';
#设置远程登录
grant all privileges on *.* to 'root'@'%' identified by '123456' with grant option;
8.在虚拟机中开启防火墙
千万别忘记,重载防火墙,另其生效
此时,可以使用Navicat进行连接
此时,master主库MySQL安装完成,同理需要把slave从库的MySQL安装完成,再此不进行赘
3.修改配置
vim /etc/my.cnf
# <--- 主库 ---->
# 节点ID,确保唯一
server-id = 1
#开启mysql的binlog日志功能
log-bin = mysql-bin
#控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次事物提交都会刷到日志文件中,性能最差,最安全
sync_binlog = 1
#binlog日志格式,mysql默认采用statement,建议使用mixed
binlog_format = mixed
#binlog过期清理时间
expire_logs_days = 7
#binlog每个日志文件大小
max_binlog_size = 100m
#binlog缓存大小
binlog_cache_size = 4m
#最大binlog缓存大
max_binlog_cache_size= 512m
#不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制这句话,写多行
binlog-ignore-db=mysql
# 自增值的偏移量
auto-increment-offset = 1
# 自增值的自增量
auto-increment-increment = 1
#跳过从库错误
slave-skip-errors = all
# <------ 从库 ------>
server-id = 2
log-bin=mysql-bin
relay-log = mysql-relay-bin
#忽略规则
replicate-wild-ignore-table=mysql.%
replicate-wild-ignore-table=information_schema.%
分别配置后进行重启另其生效 systemctl restart mysqld
4.MySQL配置主从
Master数据库:
1.创建用户,并予以授权
create user stone_user identified by '123456';
#如果执行有密码验证规则执行
set global validate_password_policy=LOW;
set global validate_password_length=6;
#赋予新用户权限
grant replication slave on *.* to 'stone_user'@'192.168.40.131' identified by '123456';
#刷新
flush privileges;
2.查看状态
show master status;
#执行结果
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 859 | | mysql | |
+------------------+----------+--------------+------------------+-------------------+
in set (0.00 sec)
个人理解:mysql-bin.000001中记录mysql执行变化,并记录在此日志文件中,当859代表执行偏移量,从库以此进行监听偏移量是否有变动,当发生变化时进行更新。
Slave数据库:
1.创建关联
CHANGE MASTER TO
MASTER_HOST = '192.168.40.131', #主库ip
MASTER_USER = 'stone_user', #主库用户
MASTER_PASSWORD = '123456', #主库密码
MASTER_PORT = 3306, #端口号
MASTER_LOG_FILE='mysql-bin.000001', #主库日志文件
MASTER_LOG_POS=859; #主库日志文件偏移量
2.启动从库slave
#启动
start slave;
#关闭
stop slave;
3.查看状态
show slave status\G
好,此时新的风暴已经出现,MySQL主从同步失败:Slave_IO_Running:Connecting
出现这个问题原因大致分为:
1.网络不咋地 (我家WiFi挺猛的)
2.防火墙木开启 (Navicat测试连接没毛病)
3.mysql主从配置文件有毛病 (配置文件基本没配置额外项)
4.配置连接语法有毛病 (详细检查了木毛病)
5.主机未开放账户连接权限 (看来是他了!!!)
查看新建用户stone_user权限(主库Master):
select host,user,grant_priv,super_priv from mysql.user
#添加权限
update mysql.user set grant_priv = 'Y',super_priv='Y' where user = 'stone_user';
#查看复制账户是否拥有REPLICATION CLIENT、REPLICATION SLAVE、SUPER、RELOAD权限
grant REPLICATION CLIENT ON *.* TO stone_user;
grant REPLICATION SLAVE ON *.* TO stone_user;
grant SUPER ON *.* TO stone_user;
grant reload on *.* to stone_user;
#刷新
flush privileges;
重启MySQL,一定要重启
此时,再次查看从库,执行
show slave status\G
终于在我的努力下,离成功越来越远了......
在Master数据库中:
show master status; #重新查看
因为不断弄bug进行重演过程中,每次重启mysql会新生成一个mysql-bin文件导致与从库不匹配。
在Slave数据库中:
stop slave;
CHANGE MASTER TO
MASTER_HOST = '192.168.40.131',
MASTER_USER = 'stone_user',
MASTER_PASSWORD = '123456',
MASTER_PORT = 3306,
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=154,
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000;
start slave;
成功!!!现在,我们在master数据库中新建数据库,加入数据进行测试:
主库:
从库:
完活!!!
结语
有一个大佬和我说过:心态也是成神之路的必修课,努力是做给自己看的 不是做给别人看的
为此,我将不留余地的向前奔跑,也希望有兴趣的朋友能一起相互学习,共同努力。第一次发文如有不足,请多多包含多多指教。