1. mysql主从同步的存在意义
(1) 读写分离,主库负责写数据,从库负责读取数据,这样在主库执行update或其他的写操作导致锁表,程序在从库照样能读出数据来. 同样能减轻主库的负载压力,提升效率
(2) 做数据的热备,主库挂掉后,可以及时切换至从库
(3) 解决了单点问题,防止数据永久丢失
2. 主从同步的流程
(1) 主库db的更新事件(update、insert、delete)被写到binlog
(2)主库创建一个binlog dump thread,把binlog的内容发送到从库
(3)从库启动并发起连接,连接到主库
(4)从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log
(5)从库启动之后,创建一个sql线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db
3. 搭建主从同步(单机)
(1)分别搭建主Mysql和从Mysql
主Mysql:具体搭建方法见:Linux安装mysql_萌大叔灬的博客-CSDN博客
从Mysql:
#解压
tar -zxvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz
#移动文件
mv mysql-5.7.26-linux-glibc2.12-x86_64 /usr/local/mysql_slave
#创建从的data目录
mkdir -p /myTest/mysql_slave/data/mysql
#赋权限
chown mysql:mysql -R /myTest/mysql_slave/data/mysql
编辑my.cnf
vi /usr/local/mysql_slave/my.cnf #这里的路径跟主的不一致
[mysqld]
bind-address=0.0.0.0
port=3309 #这里端口要保证跟主不一致
user=mysql
basedir=/usr/local/mysql_slave #从mysql的路径
datadir=/myTest/mysql_slave/data/mysql #从mysql的路径
socket=/tmp/mysql1.sock #注意!!这里也要跟主的不一致(单机不更改的话有可能启动失败) 后期命令连接数据库时也会用到
log-error=/myTest/mysql_slave/data/mysql/mysql.err #从mysql的路径
pid-file=/myTest/mysql_slave/data/mysql/mysql.pid #从mysql的路径
#character config
#character_set_server=utf8mb4
#symbolic-links=0
#explicit_defaults_for_timestamp=true
初始化mysql
cd /usr/local/mysql_slave/bin/
#注意!!这里的路径都是从单独的
./mysqld --defaults-file=/usr/local/mysql_slave/my.cnf --basedir=/usr/local/mysql_slave/ --datadir=/myTest/mysql_slave/data/mysql/ --user=mysql --initialize
更改mysql.server
vi /usr/local/mysql_slave/support-files/mysql.server
将文件中以下参数
basedir=
datadir=
赋值
basedir=/usr/local/mysql_slave
datadir=/myTest/mysql_slave/data/mysql
启动mysql
cp /usr/local/mysql_slave/support-files/mysql.server /etc/init.d/mysql_slave
service mysql_slave start
ps -ef|grep mysql
修改mysql密码
cd /usr/local/mysql_slave/bin/
./mysql -u root -p --socket=/tmp/mysql1.sock #登陆 注意!!这里一定要指定sock
#输入刚查看的随机密码
SET PASSWORD = PASSWORD('123456'); #设置密码123456
ALTER USER 'root'@'localhost' PASSWORD EXPIRE NEVER;
use mysql #访问mysql库
update user set host = '%' where user = 'root'; #使root能再任何host访问
FLUSH PRIVILEGES; #刷新配置
从库安装完成!
需要注意的是,由于我是单机搭建的,所以从Mysql的my.cnf文件和data目录和主的分开,启动命令也区分了.
下一步搭建主从关系
master配置:
修改my.cnf
vi /etc/my.cnf
在[mysqld]中添加一下数据
[mysqld]
log-bin=mysql-bin #表示启用二进制日志
server-id=3308 #表示server编号,编号要唯一 从库必须设置为不同的值
binlog-ignore-db=information_schema #表示同步的时候忽略的数据库
binlog-ignore-db=performance_schema #表示同步的时候忽略的数据库
binlog-ignore-db=sys #表示同步的时候忽略的数据库
binlog-ignore-db=mysql #表示同步的时候忽略的数据库
binlog-do-db=test #指定需要同步的数据库
binlog-do-db=tools #指定需要同步的数据库
重启mysql
service mysql stop
service mysql start
登陆mysql创建从账户和赋权
cd /usr/local/mysql/bin/
./mysql -uroot -p
grant FILE on *.* to 'slave'@'127.0.0.1' identified by '123456'; #赋予Slave机器有File权限 ip为slave服务器ip slave为用户名 123456为密码
grant replication slave on *.* to 'slave'@'127.0.0.1' identified by '123456'; #创建slave用户并赋权 slave为用户名 123456为密码
flush privileges; #刷新
#备注
all privileges:表示将全部权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等。
on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示全部数据库,全部表。若是我要指定将权限应用到test库的user表中,能够这么写:test.user
to:将权限授予哪一个用户。格式:”用户名”@”登陆IP或域名”。%表示没有限制,在任何主机均可以登陆。好比:”yangxin”@”192.168.0.%”,表示yangxin这个用户只能在192.168.0IP段登陆
identified by:指定用户的登陆密码
with grant option:表示容许用户将本身的权限受权给其它用户linux
查看master服务器状态
show master status; #此命令执行后 不要在操作主库数据.
slave配置
修改my.cnf
vi /usr/local/mysql_slave/my.cnf
在[mysqld]添加一下数据
[mysqld]
log-bin=mysql-bin
server-id=3309
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60
重启mysql_slave
service mysql_slave stop;
service mysql_slave start;
登陆mysql_slave执行同步命令
cd /usr/local/mysql_slave/bin/
./mysql -u root -p --socket=/tmp/mysql1.sock #登陆 注意!!这里一定要指定sock
show slave status\G; #查看同步状态
stop slave; #停止同步
#需要更改对应数据,master_log_file为mysql_master中show master status命令后看到的file值, master_log_pos为Position值
change master to master_host='127.0.0.1',master_port=3308,master_user='slave',master_password='123456',master_log_file='mysql-bin.000001', master_log_pos=27509;
start slave; #开启同步
show slave status\G; #再次查看同步状态
验证
在主库上新建个表,从库查询也会自动同步相同的表