您的位置:首页 > 数据库 > MySQL

MySQL(Percona Server) 5.6 主从复制

2016-06-21 16:54 603 查看
MySQL(PerconaServer)5.6.15 主库:192.168.2.21 从库:192.168.2.22

例如我们同步的数据库为:test。如果需要同步多个数据库下面会有说明。

MySQL主从复制原理

1.master将改变记录到二进制日志(binarylog)中(这些记录叫做二进制日志事件,binarylogevents,可以通过showbinlogevents进行查看);
2.slave将master的binarylogevents拷贝到它的中继日志(relaylog);
3.slave重做中继日志中的事件,将改变反映它自己的数据。

主库(192.168.2.21):

主库开放3306端口

#/sbin/iptables-IINPUT-s192.168.2.0/24-ptcp--dport3306-jACCEPT #serviceiptablessave


查看开放的端口:

#serviceiptablesstatus

#iptables-L-n



授权同步账户

mysql>GRANTREPLICATIONSLAVEON*.*TOrep@'192.168.2.22'IDENTIFIEDBY'123';
mysql>flushprivileges;



授权格式为:
GRANTREPLICATIONSLAVEON*.*TOusername@'ipaddress'IDENTIFIEDBY'password'


现在可以在192.168.2.22从库上测试是否可以访问:

#/usr/local/mysql/bin/mysql-h192.168.2.21-urep-p123



配置主库my.cnf

#vi/etc/my.cnf

[mysqld]
log-bin=mysql-bin#开启MYSQL二进制日志
server-id=1#主库服务器ID,注意服务器ID不能重复
binlog-do-db=test#需要做主从备份的数据库名,如果复制多个数据库,重复设置这个选项即可
expire-logs-days=7#只保留7天的二进制日志,以防磁盘被日志占满
binlog_format=MIXED#设置binlog的格式为MIXED


binlog的三种格式
STATEMENT
ROW
MIXED
,详见MySQLBinlogROW和STATEMENT选择。

可以通过
showvariableslike'binlog_format';
查看。

保存,重启MySQL:

#servicemysqlrestart


拷贝主库需要同步的数据到从库

进入mysql终端
/usr/local/mysql/bin/mysql-uroot-p


设置主库成只读状态

mysql>usetest;
mysql>FLUSHTABLESWITHREADLOCK;


重置binlog日志

mysql>RESETMASTER;


查看运行状态

mysql>SHOWMASTERSTATUS\G;
*******************1.row*******************
File:mysql-bin.000001
Position:120
Binlog_Do_DB:test
Binlog_Ignore_DB:
Executed_Gtid_Set:
1rowinset(0.00sec)


此处需记录
File
Position
两个值,下面从库的
CHANGEMASTERTO
命令中需要用到这两个值。

接下来
切换到从库服务器
,导出主库中需要同步的数据,并导入到从库:

#/usr/local/mysql/bin/mysqldump-h192.168.2.21-urep-ptest>dumptest.db
#/usr/local/mysql/bin/mysql-uroot-ptest<dumptest.db


再回到主库服务器
,解锁主库数据库只读状态

mysql>UNLOCKTABLES;


从库(192.168.2.22):

配置从库my.cnf

#vi/etc/my.cnf

[mysqld]
server-id=2#从库服务器ID,注意服务器ID不能重复
replicate-do-db=test#需要做复制的数据库名,如果复制多个数据库,重复设置这个选项即可
slave-skip-errors=1032,1062,126,1114,1146,1048,1396#自动跳过的错误代码,以防复制出错被中断


如果数据库中有不需要同步的表可以添加
replicate-ignore-table=table_name,...
配置项,自动跳过这些表。

保存,重启MySQL:

#servicemysqlrestart


指定主库

进入MySQL终端:

mysql>CHANGEMASTERTO
MASTER_HOST='192.168.2.21',
MASTER_USER='rep',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=120;


启动从库连接

mysql>startslave;


查看从库状态

mysql>SHOWSLAVESTATUS\G;
......
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
......

两个Yes成功。

测试

现在可以在主库中插入/更新数据,添加表等操作,看从库是否可以同步相应的数据。

问题

在最后使用
SHOWSLAVESTATUS\G;
查看slave运行状态时,有一个错误:

Last_IO_Error:Fatalerror:TheslaveI/OthreadstopsbecausemasterandslavehaveequalMySQLserverUUIDs;theseUUIDsmustbedifferentforreplicationtowork.

serveruuid是从MySQL5.6开始添加进来的,由于我偷了个懒,从库是直接在VirtualBox中Clone的主库,所以
/var/lib/mysql/auto.cnf
文件中的
server-uuid
的值是一样的。随便改一个值,但是值的格式不能变,不与群组中的其他server-uuid重复即可。

改完之后,重启mysql:

#servicemysqlrestart

再次使用
SHOWSLAVESTATUS\G;
查看状态正常。

附两个小命令:

mysql>SHOWSLAVEHOSTS;#需在master中执行,查看slave列表,包括相应的server-uuid值

mysql>showvariableslike'server_uuid';#查看本机的server-uuid值

GoodLuck!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: