Mysql基于binlong主从搭建

136 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

公司最近准备迁移服务器,抛弃原有的阿里云服务器,搞自建服务器。内心大喊:阿里云那么好用,为什么不用。奈何一个人的呐喊抵不过老板的一句话,只好默默想想办法。

迁移服务器,最先解决数据库的问题。现在的数据库使用的mysql,而且没有搭建过主从(他默默承受了太多,泪目),还有之后数据可能越来越大,就想先做一个主从。

准备工作:装有mysql的两台服务器

主从同步原理图

主从同步原理图.png

主库配置

mysql默认是不打开binlog日志的,需要手动打开

  • 修改/ect/my.cnf配置文件
[mysqld] 

datadir=/var/lib/mysql 

socket=/var/lib/mysql/mysql.sock 

user=mysql 

symbolic-links=0 

 ##id唯一
server-id=33 

## 日志名字
log_bin=master-binlog 

## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7

## 不需要同步的库
binlog_ignore_db = information_schema

binlog_ignore_db = performation_schema

binlog_ignore_db = sys

[mysqld_safe] 

log-error=/var/log/mariadb/mariadb.log 

pid-file=/var/run/mariadb/mariadb.pid 

[client] 

port=3306 

socket=/var/lib/mysql/mysql.sock
  • 重启数据库 systemctl restart mysqld

  • 查看主库状态 show master status \G

主库状态.png

从库配置

  • 修改/etc/my.cnf配置文件
datadir=/var/lib/mysql 

socket=/var/lib/mysql/mysql.sock 

user=mysql 

symbolic-links=0 

 ##id唯一
server-id=96 

## 日志名字
log_bin=slave-binlog 

## 打开MySQL中继日志 

relay-log-index=slave-relay-bin.index 

relay-log=slave-relay-bin

## 使得更新的数据写进二进制日志中 

log-slave-updates=1

## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7

## 设置只读模式
read_only=1

[mysqld_safe] 

log-error=/var/log/mariadb/mariadb.log 

pid-file=/var/run/mariadb/mariadb.pid 

[client] 

port=3306 

socket=/var/lib/mysql/mysql.sock

-重启mysql

systemctl restart mysqld

-设置从库


#登录从服务 
mysql -u root -p;

#设置同步主节点: 

CHANGE MASTER TO 

MASTER_HOST='192.168.232.128', 

MASTER_PORT=3306, 

MASTER_USER='root', 

MASTER_PASSWORD='root', 

MASTER_LOG_FILE='master-bin.000004', 

MASTER_LOG_POS=156, 

GET_MASTER_PUBLIC_KEY=1;

#开启slave 

start slave;
  • 查看主库状态 show slave status \G;

从库状态.png

以上就是主从搭建,如果查看从库服务状态Slave_SQL_Running=no,就表示主从同步失败了,有可能是因为在从数据库上进行了写操作,与同步过来的SQL操作冲突了,也有可能是slave从服务重启后有事务回滚了。如果是因为slave从服务事务回滚的原因,可以按照以下方式重启主从同步,但是这种方式要注意binlog的文件和位置,如果修改后和之前的同步接不上,那就会丢失部分数据。所以不太常用。

    stop slave ; 
    
    set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
    
    start slave ;