Linux搭建mysql主从同步

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;    #再次查看同步状态

 验证

在主库上新建个表,从库查询也会自动同步相同的表

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值