1、当我们的数据库主服务器发生了写操作数据发生了变化时,二进制日志就会记录,然后主服务器主动通知从服务器过来拿二进制日志,此时,Slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并且携带master.info的信息,以便让master知道该从哪个位置开始拿日志给Slave,此时master会起一个log dump的线程来接待;2、当Slave服务器的IO线程获取到Master服务器上dump线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到Slave端自身的Relay Log(即中继日志)文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容;3、Slave服务器端的SQL线程会实时检测本地Relay Log 中IO线程新增的日志内容,然后及时把Relay LOG 文件中的内容解析成sql语句,并在自身Slave服务器上按解析SQL语句的位置顺序执行应用这样sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点。
两台linux服务器(2核心、4G)、centos7、MySQL5.7.29(我们这里使用的是脚本一键编译安装mysql)
#编译安装mysql 5.7.29
#os: centos7.8.2003
####################################
#第1步
#假定mysql的源码包已经上传到linux服务器里的当前目录下(可以去各大国内源或官方下载)
#安装解决软件依赖关系的包
yum install cmake ncurses-devel gcc gcc-c++ vim lsof bzip2 openssl-devel -y
#第2步:解压src的rpm包
rpm -ivh mysql-community-5.7.29-1.el7.src.rpm
#第3步:进入/root/rpmbuild目录
cd /root/rpmbuild/SOURCES
#第4步:新建用户
useradd -r -s /sbin/nologin mysql
#第5步:新建数据目录
mkdir -p /data/mysql
#第6步:修改数据目录的拥有者为mysql
chown mysql:mysql /data/mysql
#第7步:解压真正的源码包
tar xf mysql-5.7.29.tar.gz
tar xf boost_1_59_0.tar.bz2
#将boost包移动到mysql解压的包里
mv boost_1_59_0 mysql-5.7.29
#第8步:进入解压后的目录
cd mysql-5.7.29
#第9步:编译前的配置
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/sc_mysql -DMYSQL_DATADIR=/data/mysql -DSYSCONFDIR=/etc -DMYSQL_USER=mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_BOOST=boost_1_59_0
#第10步:编译,启动2个进程去编译,加快速度
make -j 2
#第11步:安装编译好的二进制文件到指定的目录 --》复制当前目录下编译好的二进制文件到当时指定的目录
make install
#第12步:备份原来的my.cnf配置文件,然后清空这个文件,这个文件是mariadb的配置文件,不是mysql的
cp /etc/my.cnf /root/mysql.cnf.bak
>/etc/my.cnf
#第13步:进入编译安装好的mysql的目录--》安装目录
cd /usr/local/sc_mysql/bin
#执行mysqld这个程序,初始化我们的mysql,并且将日志和临时密码重定向到/root/temp_password.txt文件里
./mysqld --initialize --user=mysql --basedir=/usr/local/sc_mysql/ --datadir=/data/mysql &>/root/temp_password.txt
#第14步:修改PATH变量,在linux系统里可以找到我们编译安装的mysql相关的命令
#/etc/profile /etc/bashrc /root/.bashrc /root/.bash_profile
#修改PATH变量,让linux系统里有mysql相关的命令
PATH=$PATH:/usr/local/sc_mysql/bin
echo 'PATH=$PATH:/usr/local/sc_mysql/bin' >>/etc/bashrc
#第15步:就是拷贝mysqld的程序文件到指定的目录,方便后面设置mysqld服务开机启动--》mysqld服务的启动、停止、重启的脚本
cp ../support-files/mysql.server /etc/init.d/mysqld
#第16步:关闭防火墙和selinux
#关闭防火墙firewalld服务
service firewalld stop
#设置firewalld服务开机不启动
systemctl disable firewalld
#临时关闭selinux
setenforce 0
#永久修改selinux配置文件里的内容
sed -i 's/=enforcing/=disabled/g' /etc/selinux/config
#第17步:设置MySQL开机启动
chkconfig mysqld on
#第18步:启动MySQL
service mysqld start
#第19步:登录进去MySQL并且重新设置密码Sanchuang123#
#从保存的临时密码文件里,截取出临时密码,赋值给一个变量temp_pwd
temp_pwd=$(cat /root/temp_password.txt |tail -1|awk '{print $11}')
#给MySQL设置密码为Sanchuang123#
mysql -uroot -p$temp_pwd --connect-expired-password -e "set password='Sanchuang123#'"
echo '###### congratulation! your mysql has be installed successfully ######'
1.修改mysql的配置文件,启动二进制日志功能:
在主服务器上开启二进制日志,server_id=1
#binary log
log_bin
server_id = 1
在从服务器上也可以开启二进制日志,server_id=2
#binary log
log_bin
server_id = 2
2.在主服务器上新建并且授权一个用户,用于复制二进制日志:
grant replication slave on *.* to 'oudi'@'192.168.0.177' identified by 'Sanchuang123#';
3.备份出主服务器上的数据,然后到导入到从服务器上:
[root@sc-mysql-master ~]# mysqldump -uroot -p'Sanchuang123#' --all-databases > /backup/all_db.sql
[root@sc-mysql-master backup]# scp all_db.sql [email protected]:/root
all_db.sql 100% 11MB 21.0MB/s 00:00
[root@sc-mysql-master backup]#
在从服务器上导入数据
[root@sc-mysql-slave ~]# mysql -uroot -p'Sanchuang1234#'
mysql: [Warning] Using a password on the command line interface can be insecure.
4.在从服务器上配置master 的信息:
#在主服务器上查看当前的二进制日志的文件和位置号
root@(none) 15:12 mysql>show master status;
root@(none) 15:19 mysql>flush logs; 刷新二进制日志
root@(none) 15:20 mysql>show master status; 再次查看并记录位置号
#在从服务器上配置master的信息
[root@sc-mysql-slave ~]mysql -uroot -p'Sanchuang1234#'
root@(none) 15:26 mysql>CHANGE MASTER TO MASTER_HOST='192.168.0.83' ,
-> MASTER_USER='oudi',
-> MASTER_PASSWORD='Sanchuang123#',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='sc-mysql-master-bin.000002',
-> MASTER_LOG_POS=154;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
root@(none) 15:27 mysql>
root@(none) 15:27 mysql>show slave status \G; 查看slave的状态信息
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.0.83
Master_User: oudi
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: sc-mysql-master-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: sc-mysql-slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: sc-mysql-master-bin.000002
Slave_IO_Running: No
Slave_SQL_Running: No
5.在master和slave上关闭防火墙和selinux:
主服务器
[root@sc-mysql-master backup]service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@sc-mysql-master backup]getenforce
Permissive
从服务器
[root@sc-mysql-slave ~]service firewalld stop
Redirecting to /bin/systemctl stop firewalld.service
[root@sc-mysql-slave ~]getenforce
Disabled
6.在slave上启动复制功能:
oot@(none) 15:33 mysql>start slave;
Query OK, 0 rows affected (0.01 sec)
root@(none) 15:33 mysql>
root@(none) 15:33 mysql>show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.0.83
Master_User: oudi
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: sc-mysql-master-bin.000002
Read_Master_Log_Pos: 154
Relay_Log_File: sc-mysql-slave-relay-bin.000002
Relay_Log_Pos: 330
Relay_Master_Log_File: sc-mysql-master-bin.000002
Slave_IO_Running: Yes --》是yes
Slave_SQL_Running: Yes --》是yes表示主从复制已经配置成功了
7.验证主从复制的效果:
在master上新建库
root@(none) 15:36 mysql>create database zouweicheng;
Query OK, 1 row affected (0.00 sec)
root@(none) 15:36 mysql>use zouweicheng
Database changed
root@zouweicheng 15:37 mysql>show tables;
Empty set (0.00 sec)
root@zouweicheng 15:37 mysql>create table t1(id int);
Query OK, 0 rows affected (0.06 sec)
root@zouweicheng 15:38 mysql>insert into t1 values(1),(2);
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
8.到slave上去看master.info 和relay-log.info:
[root@sc-mysql-slave ~]cd /data/mysql/ 到数据目录下查看
[root@sc-mysql-slave mysql]cat master.info
25
sc-mysql-master-bin.000002
782
192.168.0.83
oudi
Sanchuang123#
3306
60
0
[root@sc-mysql-slave mysql]cat relay-log.info
7
./sc-mysql-slave-relay-bin.000002
958
sc-mysql-master-bin.000002
782
0
0
1