MySQL主从同步:MySQL的主从复制广泛用于数据库备份、故障转移、数据分析等场合
主从同步原理*:
通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,再传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
目的:主从复制能够有效的缓解数据库读写的压力
模型图(图片来源于网络):
环境的准备
1.Mysql主备之前版本必须一致
2.为了不影响实验结果建议关闭'Selinux'
主服务器:mysql-master: 192.168.1.60
从服务器:mysql_slave: 192.168.1.61
安装Mariadb
[root@mysql-master /]yum -y install mariadb mariadb-server
[root@mysql-master /]systemctl enable mariadb.service ##开机启动mariadb服务
[root@mysql-master /]systemctl start mariadb.service ##启动mariadb服务
[root@mysql-master /]mysql_secure_installation ##初始化Mysql
从服务器同上操作
修改配置文件
主服务器的配置文件(/etc/my.cnf),开启日志功能,设置server_id 保证唯一
[root@mysql-master tmp]# vim /etc/my.cnf
加入以下两行内容
[mysqld]
server_id = 200 ##server_id 同步复制时标识该语句最初是从哪个server写入的
log-bin=mysql-bin ##开启二进制功能
保存退出,重启服务器
数据库授权
[root@mysql-master /]# mysqldump -uroot -p
MariaDB [mysql]> grant replication slave,reload,super on *.* to 'slave'@'192.168.1.60' identified by 'slavepass'
MariaDB [mysql]>flush privileges ##重读授权表信息
注释:
‘replication slave’拥有此权限可以查看从服务器,从主服务器读取二进制日志
‘reload’权限,才可以执行flush [tables | logs | privileges]
‘super’这个权限允许用户终止任何查询;修改全局变量的SET语句;使用CHANGE MASTER,PURGE MASTER LOGS。
MariaDB [mysql]>show master status; ##查看主服务的状态
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| mysql-bin.000002 | 245| | |
+----------------------+----------+--------------+------------------+
主从备份
为保证主DB server和从DB server的数据一致,这里采用主备份,从还原来实现初始数据一致
MariaDB [mysql]>flush tables with read lock; ##加临时锁,表只读
[root@mysql-master /]# mysqldump -uroot -p --all- databases > /home/backup.sql ##复制所有
数据库到/home/
[root@mysql-master /]# unlock tables; J##解锁
[root@mysql-master /]# scp /home/backup.sql ‘root’@‘192.168.1.61’:/home/ ##将备份数据发送到从服务器,用于恢复
配置Slave
[root@mysql-slave /]# vim /etc/my.cnf
server_id=201 ##设置server_id
Slave还原备份数据
[root@mysql-slave /]#systemctl restart mariadb.service
[root@mysql-slave /]#mysql -uroot -p < /home/backup.sql
连接Master服务器
登陆从数据库,添加相关参数(主服务器的ip/端口/同步用户/密码/position号/读取哪个日志文件)
[root@mysql-slave /]#mysql -uroot -p
MariaDB [mysql]>change master to master_host='192.168.1.60',master_user='slave',master_password='slavepass',
master_log_file='mysql-bin.000002',master_log_pos=245; ##开启主从同步
MariaDB [mysql]>start slave; ##查看主动同步状态
MariaDB [mysql]>show slave status\G; ##主要看下面2项,都是YES表示成功了
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Master和Slave验证
上面都没问题,那就开始测试了,去主服务断创建一个库,一张表,插入数据,再到从服务器来查看,如果数据一致表示没问题了
遇到的问题
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) ####解决办法:在错误日志中,启动失败的原因极为明显,file ‘./mysql-bin。000004’ not found,failed to open!
mysql开启了bin日志功能,到数据库根目录查看该文件是存在的,可能是文件权限的问题。
[root@mysql-slave /]chown -R mysql:mysql /var/log/mysql
[root@mysql-slave /]mysqld_safe & ##启动安全模式
[root@mysql-slave /]systemctl stop mariadb.service
[root@mysql-slave /]systemctl start mariadb.service
###再重新初始化数据库,就可以登录了
记得killall mysqld_safe mysql,因为不结束将不能开启二进制日志,结束安全模式进程然后
[root@mysql-slave /]systemctl stop mariadb.service
[root@mysql-slave /]systemctl start mariadb.service