1、master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
2、slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
3、Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
4、Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
5、master和slave两节点间时间需同步
[root@localhost ~]# rpm -qa | grep mysql
#如果有就使用 rm -rf 命令删除
[root@localhost ~]# whereis mysql
mysql: /usr/lib64/mysql /usr/share/mysql
[root@localhost ~]# rm -rf /usr/lib64/mysql /usr/share/mysql #删除
[root@localhost ~]# find / -name mysql
/etc/selinux/targeted/active/modules/100/mysql
[root@localhost ~]# rm -rf /etc/selinux/targeted/active/modules/100/mysql #删除
若用户及用户组已存在,则略过这一步,没有则创建
[root@localhost ~]# id mysql
id: mysql: no such user
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -r -g mysql mysql
[root@localhost ~]# rpm -qa|grep libaio
libaio-0.3.109-13.el7.x86_64 #我这里已经安装过了,若没有输出,则需要用yum安装
yum install libaio-devel.x86_64
#
yum -y install numactl
https://dev.mysql.com/downloads/mysql/
下载完成后 用rz命令上传到 /soft/目录下
[root@localhost local]# tar -xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz #解压
[root@localhost local]# mv mysql-8.0.27-linux-glibc2.12-x86_64 mysql-8.0.27 #重命名
#修改mysql 目录下所有文件的所属用户为root 所属组为root
[root@localhost local]# chown -R root:root /soft/mysql-8.0.27/
#创建数据存储目录,用以存储数据库数据
[root@localhost local]# mkdir data
#修改数据存储目录所属用户及所属组为mysql
[root@localhost local]# chown mysql:mysql /soft/mysql-8.0.27/data
在初始化之前请先确认/etc/my.cnf 已经不存在,否则在初始化是mysql会默认读取配置文件作为初始化。
若存在该文件,则如下将其改名,留作备份
[root@localhost mysql]# ll /etc/ | grep my.cnf
-rw-r--r--. 1 root root 570 Jun 8 2017 my.cnf
drwxr-xr-x. 2 root root 31 Dec 20 17:32 my.cnf.d
[root@localhost mysql]# mv /etc/my.cnf /etc/my.cnf.bak
[root@localhost mysql]# ll /etc/ | grep my.cnf
-rw-r--r--. 1 root root 570 Jun 8 2017 my.cnf.bak
drwxr-xr-x. 2 root root 31 Dec 20 17:32 my.cnf.d
#开始初始化
[root@localhost mysql]# /soft/mysql-8.0.27/bin/mysqld --initialize --user=mysql --basedir=/soft/mysql-8.0.27 --datadir=/soft/mysql-8.0.27/data
#注意复制初始化密码 kw1n
#进入MySQL安装目录support-files文件中,创建mysql-default.cnf 文件并添加权限
[root@localhost mysql]# cd /soft/mysql-8.0.27/support-files/
[root@localhost support-files]# touch mysql-default.cnf
[root@localhost support-files]# chmod 777 mysql-default.cnf
#将其复制到/etc/下,改名为my.cnf
[root@localhost support-files]# cp -a mysql-default.cnf /etc/my.cnf
vi /etc/my.cnf
#在my.cnf中添加配置
[mysqld]
basedir = /soft/mysql-8.0.27
datadir = /soft/mysql-8.0.27/data
socket = /tmp/mysql.sock
log-error = /soft/mysql-8.0.27/data/error.log
pid-file = /soft/mysql-8.0.27/data/mysql.pid
port = 3306
max_allowed_packet=32M
#修改配置文件权限,这一句不在My.cnf中,在外面执行
chmod 644 /etc/my.cnf
#复制mysql服务文件到/etc/init.d/目录下,重命名为mysql
[root@localhost support-files]# cp -a /soft/mysql-8.0.27/support-files/mysql.server /etc/init.d/mysql
#添加可执行权限
[root@localhost support-files]# chmod +x /etc/init.d/mysql
#注册服务
chkconfig --add mysql #注册
chkconfig --list mysql #检测
#/etc/ld.so.conf要配置路径,不然报错
[root@localhost support-files]# vim /etc/ld.so.conf
#在ld.so.conf中添加 mysql 的lib文件
/soft/mysql-8.0.27/lib
#配置环境变量
[root@localhost support-files]# vim /etc/profile
#末尾添加:
export PATH=$PATH:/soft/mysql-8.0.27/bin:/soft/mysql-8.0.27/lib
#重新加载使环境变量生效
[root@localhost support-files]# source /etc/profile
#启动服务
[root@localhost support-files]# service mysql start
#使用初始化密码登录
[root@localhost support-files]# mysql -uroot -p
如果忘记初始密码:
https://zhuanlan.zhihu.com/p/458845050
#修改密码
alter user 'root'@'localhost' identified by 'l***2417';
mysql> use mysql;
mysql> update user set host = '%' where user = 'root';
mysql> flush privileges;
mysql> GRANT ALL ON *.* TO 'root'@'%';
mysql> flush privileges;
#防火墙设置
#暂时关闭防火墙
systemctl stop firewalld
#开放指定端口号
firewall-cmd --zone=public --add-port=8080/tcp --permanent
#移除已开放的端口号
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
#使防火墙设置生效
firewall-cmd --reload
我们需要一个主节点,即主数据库mysql(为次数据库提供更新日志)
#主节点配置
#在 /etc/my.cnf中新增以下代码
#开启二进制日志
log_bin=master_bin
#设置当前节点全局唯一ID
server-id=176
#重启mysql服务
service mysql start
#查看从二进制日志的文件和位置开始进行复制(主数据库)
mysql> show master status;
# 查询结果,这个file和position等会需要用
mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master_bin.000010 | 2397 | | | |
+-------------------+----------+--------------+------------------+-------------------+
创建有复制权限的用户账号
create user repluser@'10.70.20.%' identified by 'l***2417';
mysql> grant replication slave on *.* to repluser@'10.70.20.%';
#从节点配置
#为当前节点设置一个全局惟的ID号
server_id=177
#开启二进制日志
log-bin=slave_log
#设置从数据库只读(对root用户无效)
read_only=ON
#relay log的文件路径
relay_log=relay-log
#默认值hostname-relay-bin.index
relay_log_index=relay-log.index
# master_host是主数据库的IP地址,master_user是前面创建的角色名,master_password主数据库密码,master_log_file就是上面主数据库查到的file,MASTER_LOG_POS就是上面的position,get_master_public_key是在主数据库配置文件里面设置的id
mysql> change master to master_host='10.70.20.176',master_user='repluser',master_password='l***2417',master_log_file='master_bin.000010',MASTER_LOG_POS=2397,get_master_public_key=176;
mysql> START SLAVE;
mysql> SHOW SLAVE STATUS\G;
此时红框框柱的两项都是yes说明已经完成!如果不是建议先停止同步 stop slave,然后检查change master to...... 这一句是否正确。
主数据库新建一个数据库,此时从数据库也会出现相同的数据库,说明主从同步已实现
当前,左右两边数据库都只有这四个:
在主数据库中新建一个数据库db_test:
从数据库查询:
完成