配置思路
1. 修改master和slave的配置文件,使用二进制日志,指定serverid
目的是让各自都有了自己的唯一标示,并以二进制文件格式进行交流
2. master中创建授权用户,查看二进制日志文件名,及最新位置
让slave知道用哪个用户信息访问master,知道读取哪个日志文件,及从哪儿开始读
3. slave中使用被授权用户信息及日志文件信息,进行指向master
这时已经建立了和master的联系,明确了从哪儿读取日志文件
3. 执行启动slave的命令,开始主从复制,并查看复制状态信息
准备条件
停止对master数据库的操作
把master中的数据库全部导入到slave,使两边数据库完全一致
配置步骤
1. 修改配置文件 my.cnf
vi /etc/my.cnf
master:
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段
slave:
[mysqld]
log-bin=mysql-bin
server-id=226
2. 重新启动两台服务器的mysql
3. master创建授权用户
登陆主服务器mysql命令行,创建一个用于从服务器复制的用户
CREATE USER '***'@'192.168.2.113' IDENTIFIED BY '******'; GRANT REPLICATION SLAVE ON *.* TO '***'@'192.168.2.113';
"*.*"表示对所有库的所有操作,“%”表示所有客户端都可能连,也可用具体客户端IP代替,如192.168.145.226,加强安全
4. 查看master状态
登陆主服务器mysql命令行
mysql>show master status;
mysql-bin.000001 是用于主从复制的文件名
619 是日志文件内的最新位置
5. slave指向master
登陆从服务器mysql命令行,使用之前创建的用户和master的日志文件及其位置
CHANGE MASTER TO MASTER_HOST='192.168.2.113', MASTER_USER='root', MASTER_PASSWORD='*****', MASTER_LOG_FILE='mysql-bin.000004', MASTER_LOG_POS=154;
6.启动slave
mysql>start slave;
7. 查看slave状态
mysql> show slave statusG;
结果中有两个重要数据项:
常见的问题是SQL线程没有正常工作 Slave_SQL_Running: No
通常是两边的数据库不是完全对应的,需要确保master上的库及到目前为止的最新记录都复制到slave上了
8.
在“Slave_SQL_Running_State”中出现了“Fatal error: The slave I/O thread stopsbecause master and slave have equal MySQL server UUIDs; these UUIDs must bedifferent for replication to work.”这个错误。
当时以为是主节点服务器的UUID和从节点服务器网卡的UUID重复了,经过查看,发现他们并没有重复,然后重启服务器以后发现仍然没有成功。有点摸不着头脑,所以通过上网搜索。
发现原来是Mysql的一个配置文件auto.cnf里面记录了mysql服务器的uuid。
vi /var/lib/mysql/auto.cnf
server_uuid:服务器身份ID。在第一次启动Mysql时,会自动生成一个server_uuid并写入到数据目录下auto.cnf文件里。
原来是这个uuid和主服务器的uuid重复了。(从节点服务器上的mysql安装包是直接从主节点服务器里面拷过来的),然后经过修改auto.cnf文件中的server-uuid,重启mysql服务器,再查看mysql从节点的状态,终于成功了。
9.测试
当IO线程和SQL线程都正常后,到master中随意测试下插入、修改、删除操作,同时到slave中检查
1) Slave_IO_Running: Yes
IO线程状态,必须YES
2) Slave_SQL_Running: Yes
SQL线程状态,必须YES