笔记内容:
- 17.1 MySQL主从介绍
- 17.2 准备工作
- 17.3 配置主
- 17.4 配置从
- 17.5 测试主从同步
笔记日期:2017-11-08
17.1 MySQL主从介绍
Mysql Replication(MySQL主从复制)是MySQL数据库使用率非常高的一种技术,它使用某个数据库服务器为主,然后在其他数据库服务器上进行复制,后面复制的数据库也称从数据库。
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。在设置链式复制服务器时,从服务器本身也可以充当主服务器,如:a->b->c,b对于a来说是从服务器,但是它又是c的主服务器。
注意:“主从”和“集群”是有区别的,一般刚接触这些概念的初学者很容易混淆。
简单来说,对主机器进行写入操作时会生成一个binlog文件,这个文件记录了主机器的更改操作,主机器会把binlog通过I/O流线程传输到从机器上。然后这个I/O线程会在从机器上生成一个relaylog文件,这个文件里就是记录了一些sql语句,接着就会执行relaylog里的sql语句,这样就达到了主从的数据同步。
主从一般应用于这两个场景:第一个是数据备份,然后是作为从库使用,从库可以分担主库的读取压力,但是从库不可写。
17.2 准备工作
首先得准备两台机器,一台作为主,一台作为从:
我这里是study01作为主机器,study02作为从机器。
这两台机器都需要安装mysql(我这里只演示其中一台,因为安装方法都是一样的):
因为之前安装了mysql,所以我得先卸载:
还需要删除库文件目录:
rm -rf /data/mysql/*
卸载完后,下载mysql的二进制包,下载地址:
http://mirrors.sohu.com/mysql/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
下载好后解压
tar -zxfv mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz
解压后将目录移动到/usr/local/下,并重新命名为mysql:
mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql
进入到mysql目录下:
cd /usr/local/mysql
如果你的系统没有/data/目录需要先创建:
mkdir /data/
如果你的系统没有myysql用户也需要先创建:
useradd mysql
执行初始化脚本:
./scripts/mysql_install_db --user=mysql --datadir=/data/mysql
如果出现这个错误:
就安装:
yum install -y perl-Module-Install.noarch
如果出现这个错误:
然后再安装:
yum install libaio* -y
拷贝配置文件:
cp support-files/my-default.cnf /etc/my.cnf
vim /etc/my.cnf 配置文件为以下内容:
拷贝启动脚本:
cp support-files/mysql.server /etc/init.d/mysqld
然后定义basedir和datadir的路径:
vim /etc/init.d/mysqld 脚本文件为以下内容:
完成以上操作后启动mysql服务:
/etc/init.d/mysqld start
启动成功:
查看一下端口是否正常监听,mysql默认端口为3306:
将mysql加入服务列表里面去,并设置为开机启动:
chkconfig --add mysqld
chkconfig mysqld on
然后就可以用service命令去启动或关闭mysql了
安装完后的mysql是没有密码的,可以使用以下命令无需密码直接本地登录:
mysql -uroot -h127.0.0.1
登录到mysql中使用以下命令设置密码:
set password=password(‘12345‘);
设置完密码后重启mysql,然后就可以使用设置的密码登录了:
mysql -uroot -p‘12345‘ -h127.0.0.1
17.3 配置主
准备好之后,开始配置主机器:
- 修改my.cnf配置文件:
vim /etc/my.cnf
增加以下内容:
server-id=130 //定义一个id
log_bin=study1 //定义binlog文件的前缀
- 修改完配置文件后,重启mysqld服务:
service mysqld restart
然后可以在/data/mysql 目录下看到多了这几个文件:
前缀为study1的文件是主从配置的核心文件。
- 把mysql库备份并恢复成testdata库,作为测试数据,备份:
mysqldump -uroot -p‘12345‘ mysql > /tmp/mysql.sql
创建一个新的库:
mysql -uroot -p‘12345‘ -e "create database testdata"
将备份的数据恢复到这个新的库中:
mysql -uroot -p‘12345‘ testdata < /tmp/mysql.sql
完成以上操作后,现在主从参考的库就是testdata库,现在可以看到study1.000001这个文件大小和刚刚那个备份文件的大小几乎是一致的,所以看得出来这个study1.000001文件里记录着的内容就是这个testdata库:
- 创建用作同步数据的用户:
grant replication slave on *.* to ‘repl‘@‘192.168.77.128‘ identified by ‘12345‘;
- 锁表,锁表就是禁止这个别被操作,不让这个表有任何的改动,这样一会才能配置从实现同步:
flush tables with read lock;
- 看一下主的状态,一会要用到:
show master status;
- 将除了mysql之外的库都备份一下:
mysqldump -uroot -p‘12345‘ mysql > /tmp/mysql2.sql
mysqldump -uroot -p‘12345‘ mysql > /tmp/zrlog.sql
mysqldump -uroot -p‘12345‘ mysql > /tmp/test.sql
mysqldump -uroot -p‘12345‘ mysql > /tmp/testdata.sql
mysqldump -uroot -p‘12345‘ mysql > /tmp/performance_schema.sql
17.4 配置从
1. 同样的从上也要修改my.cnf配置文件:
vim /etc/my.cnf
只不过在主上只需要增加一个server-id即可:
- 重启mysqld服务:
service mysqld restart
- 把主上tmp目录下的备份文件都同步到从上,命令如下:
scp 192.168.77.130:/tmp/*.sql /tmp/
- 登录到mysql中创建与备份文件相应的库,我这里就不逐一去创建了,仅示例其中几个:
- 将同步的备份文件恢复到对应的数据库中:
mysql -uroot -h127.0.0.1 -p‘12345‘ zrlog< /tmp/zrlog.sql
mysql -uroot -h127.0.0.1 -p‘12345‘ user< /tmp/user.sql
mysql -uroot -h127.0.0.1 -p‘12345‘ testdata< /tmp/testdata.sql
在实际情况中,需要把所有的除了mysql库之外的库都进行同步,由于是实验演示,我这里没有进行全部备份,因为操作都是一样的,也不需要过多的演示。
- 同步完成后,开始实现主从,这一步需要登录mysql:
执行以下两个命令:
stop slave;
change master to master_host=‘192.168.77.130‘, master_user=‘repl‘, master_password=‘12345‘, master_log_file=‘study1.000001‘, master_log_pos=661506;
解释一下这命令中的参数:
master_host 定义主机器的ip地址
master_user 定义主机器中给从机器使用的用户名
master_password 定义用户的密码
master_log_file 定义主机器上binlog文件的名称
master_log_pos 定义主机器上binlog文件的位置
其中master_log_file 和master_log_pos参数中的值可以在主机器上的mysql中查看到:
- 接着就是启动slave:
start slave;
8. 启动后执行以下命令查看是否能够正常连接主机器:
show slave status\G
关于其他的几个参数:
- 到主机器上,把刚刚把表解锁,命令如下:
unlock tables;
以上步骤都没有出现问题的话,那么mysql的主从就搭建完成了。
如果Slave_IO_Running和 Slave_SQL_Running显示为No或者Connecting的话,主要是由以下几个原因导致的:
- 用户密码错误
- POS错误(master_log_pos)
- 网络不通
- 防火墙规则
- 端口没有放行
- ID问题(server-id)
还有就是检查你执行的change master命令里的参数指定的值是否有写错,出现这种问题后一般首要就是排除这些配置的信息有没有问题,确定没有问题后,一般就是系统的问题了,比如设有防火墙规则,或者端口不通等等。
17.5 测试主从同步
上图介绍的这几个参数是在change命令上使用的,也就是说当你使用change命令的时候,可以根据需求去使用这些参数来定义相关的配置信息。
以上我们mysql的主从搭建完成了,之后就是测试出从是否能够正常同步了:
在主机器上查看某个已经同步的表:
在从机器上也查看一下这个表:
可以看到两个机器上的数据是一致的。接着在主机器上把这个表给清空:
然后再到从机器上去看:
如图,这个表也是空的,证明数据已经同步了。
在主机器上drop掉这个表:
在从机器上看看是否还能select到这个表:
如图,这个表已经被删掉了,所以select就会出错。
继续到主机器上drop,这次把整个testdata库给drop掉:
同样的到从机器上看看是否还有这个库:
结果如图,则测试完成,没有问题。
提示:从机器的数据库是不能做任何的修改操作的,因为会导致数据不同步了,如果你小心在从机器上执行了修改的操作,但是数据还是一致的话,那么关掉slave,再执行change命令即可。 反之,如果数据已经不一致了,只能重新备份搭建主从了。
如果遇到主从不能正常同步,提示uuid相同的错误。这是因为克隆机器导致:
https://www.2cto.com/database/201412/364479.html