主从复制原理
从机会从主机读取binlog来进行数据同步
主库线程发现从库线程连接的时候,主库可以将二进制日志发送给从库
从库通过主库的dump线程同步主库的binlog二进制文件
从库通过I/O线程写入到中继日志中,SQL线程读取中继日志执行日志中的事件,将从库中的数据与主库保持同步
三个步骤:
Master将写操作记录到binlog
Slave将Master的binlog拷贝到中继日志
Slave执行中继日志的事件,改变自己的数据库
安装wget依赖
yum install wget -y
下载mysql5.7.26到data目录
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
解压mysql
tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
修改mysql文件夹
mv mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz mysql-5.7.26
创建mysql数据存储文件
cd /mysql-5.7.26
mkdir data
chmod -R 777 /data/mysql-5.7.26/data/
创建组和用户,并将用户加入组
groupadd mysql
useradd -g mysql mysql
修改mysql配置文件
vi /etc/my.cnf
[mysqld] bind-address=0.0.0.0 port=3306 #skip-grant-tables user=mysql basedir=/data/mysql-5.7.26 datadir=/data/mysql-5.7.26/data socket=/tmp/mysql.sock log-error=/data/mysql-5.7.26/data/mysql.err pid-file=/data/mysql-5.7.26/data/mysql.pid #character config character_set_server=utf8mb4 symbolic-links=0 explicit_defaults_for_timestamp=true
进入bin目录,初始化mysql
cd /data/mysql2.7.26/bin
./mysqld --initialize --user=mysql --datadir=/data/mysql-5.7.26/data/ --basedir=/data/mysql-5.7.26/
查看mysql初始化密码
cat /data/mysql-5.7.26/data/mysql.err
添加软链接,可以在任意目录执行mysql命令
ln -s /data/mysql-5.7.26/support-files/mysql.server /etc/init.d/mysql
ln -s /data/mysql-5.7.26/bin/mysql /usr/bin/mysql
service mysql restart
登录mysql修改密码
vi /etc/my.cnf
去掉#skip-grant-tables的注释
mysql -u root -p
use mysql
修改密码
update user set authentication_string=password('Pw!123456') where user='root';
|alter user USER() identified by 'Pw!123456';
开启远程访问权限
update user set host ='%' where user ='root';
刷新权限
flush privileges;
重启mysql
service mysql restart
将mysql端口加入防火墙的白名单
firewall-cmd --zone=public --add-port=3306/tcp --permanent
systemctl restart firewalld.service
修改主库的my.cnf文件
#------------- 主从复制配置 start ---------------- log-bin = mysql-bin # 开启二进制日志,保存到.../mysql-bin中 server-id = 1 # 设置主服务器的ID(不能重复,建议使用ip的最后一段) innodb_flush_log_at_trx_commit=1 # 每次commit 日志缓存中的数据刷到磁盘中。通常设置为 1,意味着在事务提交前日志已被写入磁盘, 事务可以运行更长以及服务崩溃后的修复能力 sync_binlog=1 # 开启binlog同步功能,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘 # binlog-ignore-db 表示同步的时候忽略的数据库,忽略几个就写几个,如果使用binlog-do-db指定要同步的数据库,这些可以不设置
重启MySQL验证
service mysql restart
mysql -u root -p
查看二进制日志是否开启
show global variables like '%log_bin%';
log_bin value 等于ON 说明开启
查看主节点二进制日志列表 (以后会有多个)
show master logs;
查看主节点的serverid
show global variables like '%server%';
在mysql中创建从服务器的用户和权限
GRANT REPLICATION SLAVE ON . TO 'slave1'@'%' IDENTIFIED BY 'abc123';
flush privileges;
查看主库信息
show master status;
从服务器配置
修改my.cnf文件
server-id=2 #不能和主节点的id重复
重启mysql
service mysql restart
查看中继日志是否开启
show global variables like '%log%';
设置从库访问主库
暂停同步
stop slave;
链接主库
change master to master_host='192.168.0.102',master_user='slave1',master_password='abc123',master_log_file='mysql-bin.000001', master_log_pos=154; 参数说明 master_host='192.168.0.102', 主库ip地址 master_user='slave1', 设置的账号 master_password='abc123', 密码 master_log_file='mysql-bin.000001', 上面查询到的File字段值 master_log_pos=154; 上面查询到的Position字段值
查询同步信息是否成功
show slave status\G;
Slave_IO_Running,Slave_SQL_Running 都为Yes的时候表示配置成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
设置开机自启动
查看自启动的服务
chkconfig --list
设置自启动
cd /etc/rc.d/init.d
cp /data/mysql-5.7.26/support-files/mysql.server /etc/rc.d/init.d/
赋予可执行权限:chmod +x /etc/init.d/mysql.server
添加为服务: chkconfig --add mysql.server