首先要了解主从同步的架构,以及涉及的二进制日志binlog
作为准备工作,需要先在Master数据库上启用binlog日志,当然生产环境一般都会启动,因为这是基本要素。
上图中的Binlog二进制日志,记录了导致数据改变或潜在导致数据改变的SQL语句,记录已提交的日志。不依赖于存储引擎类型
另一个是中继日志:relay log, 主从复制架构中,从服务器用于保存从主服务器的二进制日志中读取的事件
下面就开始配置主从同步,使用两个虚拟机,分别全新安装 Mariadb
第一步:在主服务器启用二进制日志,并分开存储
[root@localhost home]# mkdir -p /data/logbin
[root@localhost /]# chown mysql:mysql /data
第二步:修改 /etc/my.cnf 开启binlog,并针对主从复制场景为主服务器设置一个全局惟一的ID号,
server-id=1
log-bin=/data/logbin/mysql-bin
datadir=/var/lib/mysql
[root@localhost /]# Systemctl start mariadb
【问题】
开启bin-log时,因为本身bin-log保存的位置存储太小,并且归类性也不好,自己新创建了/data/binlog来保存二进制日志
在/etc/my.cnf增加了bin-log的位置后,需要重启mariadb
但是重启后,却出现了如下的报错:
【解决方式一】
将需要存储二进制日志的目录加上权限:chown -R mysql:mysql /data
【解决方式二】
我设置了权限后重启mariadb还是出现了一样的报错,然后发现selinux是对deamon进程有操作权限的限制的,然而我的selinux的状态还是enforcing的状态…
将/etc/selinux/config文件里的SELINUX栏位改成了disabled 并reboot永久生效。
所有MySQL服务器都做上述配置,检查一下
第三步:在主服务器上创建有复制权限的用户账号
MariaDB [(none)]> grant replication slave on . to ‘repluser’@‘192.168.97.%’ identified by ‘centos’;
MariaDB [hellodb]> show master logs;
±-----------------±----------+
| Log_name | File_size |
±-----------------±----------+
| mysql-bin.000001 | 264 |
| mysql-bin.000002 | 445 |
| mysql-bin.000003 | 264 |
| mysql-bin.000004 | 375 |
| mysql-bin.000005 | 245 |
±-----------------±----------+
5 rows in set (0.00 sec)
查询当前logs记录位置,也就是之后的主从复制直接从这个位置同步。Mysql-bin.00005 位置 245
第四步:修改从服务器/etc/my.cnf 增加server-id=2 并重启maraidb
增加read_only=ON /*设置数据库只读, 当然这个不会对数据库的root权限限制 */
从服务器在这个场景不必须开启binlog
systemctl start mariadb
MariaDB [(none)]> show slave status;
第五步:在从服务器上,使用有复制权限的用户账号连接至主服务器,并启动复制线程
执行命令
MariaDB [(none)]>CHANGE MASTER TO
MASTER_HOST='192.168.97.144',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000005',
MASTER_LOG_POS=245,
MASTER_CONNECT_RETRY=10;
第六步:在主服务器执行数据插入脚本,造数据
[root@localhost home]# mysql < hellodb_innodb.sql
同时在从服务器检查复制状态
MariaDB [(none)]> start slave;
可以看到从数据库的数据得到了对齐: hellodb数据库也已经由主服务器复制到了从服务器。