本文主要说的是mysql读写分离中必不可少的一步,就是主从复制,意思是说,当你在主数据库对数据库进行更改后,从数据库跟着修改
1.开启二进制日志
我们需要开启mysql的二进制日志,当主库更新数据时,会记录到该日志中,从库会读取该日志对数据库进行更新
先找到linux下mysql的配置文件在哪,通过which查找目录:
which mysql
得到目录类似:
/usr/bin/mysql
接下来就可以针对这个目录通过一些命令查看配置文件在哪,如下:
/usr/bin/mysql --verbose --help | grep -A 1 'Default options'
然后在下面会出现一些信息比如我的
Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
这个信息的意思是:
服务器首先读取的是/etc/mysql/my.cnf文件,如果前一个文件不存在则继续读/etc/my.cnf文件,如若还不存在便会去读~/.my.cnf文件
2.在主库中添加一个授权账号,供从库连接:
mysql>GRANT REPLICATION SLAVE ON *.* TO '用户名'@'172.16.15.%' IDENTIFIED BY '密码';
该用户必须具有replication slave 权限,其中172.16.15.%表示允许172.16.15.1~172.16.15.254的ip地址连接,也可以指定ip
执行成功后,刷新命令
flush privileges;
3.修改mysql配置文件:
我的是在/etc/my.cnf中,配置主库,开启二进制日志
vim /etc/my.cnf #进入文件
#在[mysqld]下面添加一下配置
server-id = 1
log-bin = mysql-master
log-bin-index=mysql-master.index
配置后重启数据库
/etc/init.d/mysqld restart
然后我们进入mysql查看一下master的状态
show master status;
可以看到类似如下信息:
+--------------------------+------------+--------------------+-------------------------+---------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+--------------------------+------------+--------------------+-------------------------+---------------------------+
| master-bin.000001 | 1516 | | | |
+--------------------------+------------+--------------------+-------------------------+---------------------------+
File: 日志文件名称
Position: 日志所在位置
4.开启从库的二进制日志:
步骤与2一样,这就不重复了,注意server-id一定不要与主库相同
然后我们进入到从库中,执行一下代码:
mysql>CHANGE MASTER TO
>MASTER_HOST='master所在服务器的IP',
>MASTER_USER='master授权的账号',
>MASTER_PASSWORD='master授权的密码',
>MASTER_LOG_FILE='master的日志文件名',
>MASTER_LOG_POS=master的日志所在位置;
master的日志文件名为上面查看master状态的File ,master的日志所在位置为master状态的Position.
5.开启主从复制:
我们在从库中执行命令:
start slave;
然后查看slave的状态
show slave status\G;
我们就可以看到slave库的相关信息了
注意:
Slave_IO_Running: YES 表示slave的日志读取线程开启
Slave_SQL_Running: YES 表示SQL执行线程开启
如果有主从复制有错误信息其实也可以看到
6.测试结果
我们在主库中进行建表,插入更新操作,查看从表是否变动
7.注意
1)开启了主从复制,slave库如果写入数据的话,可能导致数据回滚从而主从复制线程中断,可以通过以下方式解决:
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
2)如果要停止slave的复制可以使用命令:
stop slave;
到这里整个配置就结束了
参考文章:
1) https://www.cnblogs.com/lay2017/p/9043985.html
2) https://blog.csdn.net/tribalElders/article/details/53895982