MySQL(Percona Server) 5.6 主从复制
Posted Hey!Linux.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL(Percona Server) 5.6 主从复制相关的知识,希望对你有一定的参考价值。
mysql(Percona Server) 5.6.15 主库:192.168.2.21 从库:192.168.2.22
例如我们同步的数据库为:test。 如果需要同步多个数据库下面会有说明。
MySQL 主从复制原理
1. master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
2. slave将master的binary log events拷贝到它的中继日志(relay log);
3. slave重做中继日志中的事件,将改变反映它自己的数据。
主库(192.168.2.21):
主库开放 3306 端口
# /sbin/iptables -I INPUT -s 192.168.2.0/24 -p tcp --dport 3306 -j ACCEPT # service iptables save
查看开放的端口:
# service iptables status 或 # iptables -L -n
授权同步账户
mysql> GRANT REPLICATION SLAVE ON *.* TO rep@\'192.168.2.22\' IDENTIFIED BY \'123\'; mysql> flush privileges;
授权格式为:GRANT REPLICATION SLAVE ON *.* TO username@\'ipaddress\' IDENTIFIED BY \'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
,详见 MySQL Binlog ROW 和 STATEMENT 选择。
可以通过 show variables like \'binlog_format\';
查看。
保存,重启 MySQL:
# service mysql restart
拷贝主库需要同步的数据到从库
进入 mysql 终端 /usr/local/mysql/bin/mysql -uroot -p
:
设置主库成只读状态
mysql> use test; mysql> FLUSH TABLES WITH READ LOCK;
重置 binlog 日志
mysql> RESET MASTER;
查看运行状态
mysql> SHOW MASTER STATUS\\G; ******************* 1. row ******************* File: mysql-bin.000001 Position: 120 Binlog_Do_DB: test Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)
此处需记录 File
和 Position
两个值,下面从库的 CHANGE MASTER TO
命令中需要用到这两个值。
接下来切换到从库服务器
,导出主库中需要同步的数据,并导入到从库:
# /usr/local/mysql/bin/mysqldump -h192.168.2.21 -urep -p test > dumptest.db # /usr/local/mysql/bin/mysql -uroot -p test < dumptest.db
再回到主库服务器
, 解锁主库数据库只读状态
mysql> UNLOCK TABLES;
从库(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:
# service mysql restart
指定主库
进入 MySQL 终端:
mysql> CHANGE MASTER TO MASTER_HOST=\'192.168.2.21\', MASTER_USER=\'rep\', MASTER_PASSWORD=\'123\', MASTER_LOG_FILE=\'mysql-bin.000001\', MASTER_LOG_POS=120;
启动从库连接
mysql> start slave;
查看从库状态
mysql> SHOW SLAVE STATUS\\G;
......
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
两个 Yes 成功。
测试
现在可以在主库中插入/更新数据,添加表等操作,看从库是否可以同步相应的数据。
问题
在最后使用 SHOW SLAVE STATUS\\G;
查看 slave 运行状态时,有一个错误:
Last_IO_Error: 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.
server uuid 是从 MySQL 5.6 开始添加进来的, 由于我偷了个懒,从库是直接在 VirtualBox 中 Clone 的主库,所以 /var/lib/mysql/auto.cnf
文件中的 server-uuid
的值是一样的。 随便改一个值,但是值的格式不能变,不与群组中的其他 server-uuid 重复即可。
改完之后,重启 mysql:
# service mysql restart
再次使用 SHOW SLAVE STATUS\\G;
查看状态正常。
附两个小命令:
mysql> SHOW SLAVE HOSTS; #需在 master 中执行,查看 slave 列表,包括相应的 server-uuid 值
mysql> show variables like \'server_uuid\'; #查看本机的 server-uuid 值
Good Luck!
以上是关于MySQL(Percona Server) 5.6 主从复制的主要内容,如果未能解决你的问题,请参考以下文章
CentOS7.4 x64环境Percona-Server-5.6安装
Linux下安装percona-server-5.6+tokuDB
Percona Server 5.6 RPM 快速安装&快速完全卸载