一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情。
公司最近准备迁移服务器,抛弃原有的阿里云服务器,搞自建服务器。内心大喊:阿里云那么好用,为什么不用。奈何一个人的呐喊抵不过老板的一句话,只好默默想想办法。
迁移服务器,最先解决数据库的问题。现在的数据库使用的mysql,而且没有搭建过主从(他默默承受了太多,泪目),还有之后数据可能越来越大,就想先做一个主从。
准备工作:装有mysql的两台服务器
主从同步原理图
主库配置
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
从库配置
- 修改/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;
以上就是主从搭建,如果查看从库服务状态Slave_SQL_Running=no,就表示主从同步失败了,有可能是因为在从数据库上进行了写操作,与同步过来的SQL操作冲突了,也有可能是slave从服务重启后有事务回滚了。如果是因为slave从服务事务回滚的原因,可以按照以下方式重启主从同步,但是这种方式要注意binlog的文件和位置,如果修改后和之前的同步接不上,那就会丢失部分数据。所以不太常用。
stop slave ;
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
start slave ;