mysql主从呢,听就听得多了应该不难,但动手做还是第一次,做起来发现还是出了点小问题耽误了一下,这里做一下记录。
先记录问题:
slave_io_running: no
解决方法:
1、查mysql的error.log日志
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
原因分析:
mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的,show variables like '%server_uuid%';
解决方法:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可
2、配置文件my.cnf里面server.id一样
原因分析:
和server_uuid类似,servier_id也得保证不一样
解决方法:
找到my.cnf配置文件中的server_id,修改从库的server_id保证和复制结构中的其他db不一样,重启db即可
3、在配置slave同步时因为slave访问master没有权限导致;
注意用户权限
4、master上的mysql-bin.xxxxxx文件全被误删除了;
解决方法:
重建主从
master:
重启master库:service mysqld restart
mysql> show master status;
slave:
mysql> slave stop;
mysql> change master to Master_Log_File='mysql-bin.000001',Master_Log_Pos=98;
mysql> slave start;
一、基础环境
Centos6.5版本
master:192.168.2.52
slave: 192.168.2.65
注意下面几点:
1)防火墙开放3306端口。
2)关闭selinux。
3)同步前,双方数据库中需要同步的数据要保持一致。这样,同步环境实现后,再次更新的数据就会如期同步了。
二、搭建过程
在master上面新建库测试,这里只同步一个库
mysql> CREATE DATABASE center CHARACTER SET utf8 COLLATE utf8_general_ci;
Query OK, 1 row affected (0.00 sec)
mysql> use center;
Database changed
mysql> create table if not exists users (id int(10) PRIMARY KEY AUTO_INCREMENT,name varchar(50) NOT NULL);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users values(1,"zhangsan"),(2,"lisi");
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from users;
+----+-----------+
| id | name |
+----+-----------+
| 1 | zhangsan |
| 2 | lisi |
+----+-----------+
2 rows in set (0.00 sec)
下面是master数据库上的操作:
1)设置master数据库的my.cnf文件(在[mysqld]配置区域添加下面内容)
[root@master ~]# vim /usr/local/mysql/my.cnf
server-id=1 #数据库唯一ID,主从的标识号绝对不能重复。
log-bin=mysql-bin #开启bin-log,并指定文件目录和文件名前缀
binlog-do-db=center #需要同步的数据库。如果是多个同步库,就以此格式另写几行即可。如果不指明对某个具体库同步,就去掉此行,表示同步所有库(除了ignore忽略的库)。
binlog-ignore-db=mysql #不同步mysql系统数据库。如果是多个不同步库,就以此格式另写几行;也可以在一行,中间逗号隔开。
sync_binlog = 1 #确保binlog日志写入后与硬盘同步
binlog_checksum = none #跳过现有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都是binlog_checksum=none
binlog_format = mixed #bin-log日志文件格式,设置为MIXED可以防止主键重复。
2)导出master数据库,导入到slave数据库中。保证双方在同步环境实现前的数据一致。
导出数据库之前先锁定数据库
mysql> flush tables with read lock; #数据库只读锁定命令,防止导出数据库的时候有数据写入。unlock tables命令解除锁定
mysqldump -uroot -p密码 center > /opt/center.sql
scp center.sql root@192.168.2.65:/opt/ #将导出的sql文件上传到slave机器上
3)设置数据同步权限
mysql> grant replication slave,replication client on *.* to slave@'192.168.2.65' identified by "123456";
Query OK, 0 rows affected (0.02 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
4)查看主服务器master状态(注意File与Position项,从服务器需要这两项参数)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000009 | 721 | center | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
下面是slave数据库上的操作:
1)设置slave数据库的my.cnf配置文件
[root@master ~]# vim /usr/local/mysql/my.cnf
.......
server-id=2 #设置从服务器id,必须于主服务器不同
log-bin=mysql-bin #启动MySQ二进制日志系统
replicate-do-db=center #需要同步的数据库名。如果不指明同步哪些库,就去掉这行,表示所有库的同步(除了ignore忽略的库)。
replicate-ignore-db=mysql #不同步mysql系统数据库
slave-skip-errors = all #跳过所有的错误错误,继续执行复制操作
2)在slave数据库中导入从master传过来的数据。
mysql -uroot -p密码 -e "create database if not exists center;"
mysql -uroot -p密码 center < /opt/center.sql
3)配置主从同步指令
mysql> stop slave; #执行同步前,要先关闭slave
mysql> change master to master_host='192.168.2.52',master_user='slave',master_password='123456',master_log_file='mysql-bin.000009',master_log_pos=721;
mysql> start slave;
mysql> show slave status \G;
.......
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.52
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000009
Read_Master_Log_Pos: 721
Relay_Log_File: mysql-relay-bin.000009
Relay_Log_Pos: 721
Relay_Master_Log_File: mysql-bin.000009
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: center
Replicate_Ignore_DB: mysql
.............
Seconds_Behind_Master: 0
如上,当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!
下面测试下Mysql主从同步的效果
现在master数据库上写入新数据
mysql> unlock tables; #解锁,否则新数据无法写入
mysql> insert into center.users values(3,"test");
Query OK, 1 row affected (0.00 sec)
然后在slave数据库上查看,发现master上新写入的数据已经同步过来了
mysql> select * from center.users;
+-----+-----------+
| id | name |
+-----+-----------+
| 1 | zhangsan |
| 2 | lisi |
| 3 | test |
+-----+-----------+
3 rows in set (0.00 sec)
至此,主从同步环境已经实现!
参考网址:http://www.cnblogs.com/kevingrace/p/6256603.html