参考:
https://dev.mysql.com/doc/refman/5.7/en/replication.htmlMySQL版本5.7
Master机器地址192.168.6.31
Slave机器地址192.168.6.58
Master机器(192.168.6.31)配置
修改MySQL的my.cnf文件(位于/etc下)
在文件的mysqld节下添加以下内容,如果已有该项,请修改该项的值如下:
[mysqld]
#Master复制配置
#打开log-bin功能
log-bin=mysql-bin
#唯一的server-id,int型,大于0
server-id=1
#在innodb引擎中为保证最大可能的一致性,使用以下两行配置
innodb_flush_log_at_trx_commit=1
sync_binlog=1
在shell中重启Mysql
service mysql restart;
登陆mysql
mysql –uroot –p
输入密码后执行以下SQL,创建复制用户
CREATE USER 'repl'@'192.168.6.58' IDENTIFIED BY 'repl';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.6.58';
通过SQL锁定主服务器并查看当前日志点
FLUSH TABLES WITH READ LOCK;
在==另一个会话==(可通过SQL图形化工具或在另一个shell中连接上mysql)中使用SQL查询当前日志点,并记录查询出的LOG_FILE和LOG_POS值
SHOW MASTER STATUS;
在shell中执行命令导出Master数据
mysqldump -uroot -p --all-databases --master-data > dbdump.sql
将dbdump.sql文件移动到备服务器上
Slave机器(192.168.6.58)配置
登陆mysql
mysql –uroot –p
使用SQL导入Master导出的数据,dbdump.sql请修改为包含目录的地址,如/usr/local/ dbdump.sql
source dbdump.sql
在==Master机器==执行SQL解除锁定
UNLOCK TABLES;
修改备服务器MySQL的my.cnf文件(位于/etc下)
在文件的mysqld节下添加以下内容,如果已有该项,请修改该项的值如下:
[mysqld]
#唯一值,必须与主服务器不同
server-id=2
重启备服务器mysql
service mysql restart
在备服务器执行SQL, ==MASTER_LOG_FILE和MASTER_LOG_POS的值需配置为上文SHOW MASTER STATUS 命令查询到的值==
CHANGE MASTER TO
MASTER_HOST='192.168.6.31',
MASTER_USER='repl',
MASTER_PASSWORD='repl',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=595;
在备服务器执行SQL启动复制
START SLAVE;
从服务器Mysql不能执行DML(数据管理语句)和DDL(数据定义语句),否则将从服务器与主服务器数据不一致,将数据复制将停止。只能通过在主服务器上执行DML(数据管理语句)和DDL(数据定义语句),通过数据复制自动在从服务器上同步执行后的状态。
验证
在主服务器数据库表中依次新增记录、修改该记录、删除该记录,查看从服务器是否也对应自动新增记录、修改该记录、删除该记录。
如果成功,则表示复制正常运行。
如果失败,请检查位于/var/log/mysqld.log的复制日志,查找原因
常见问题检查如下
- 防火墙端口是否开放
- 主从的MYSQL_UUID相同,在Slave服务器/var/lib/mysql/auto.cnf中的值并重启数据库
主从复制常用命令
Master机:
查看Master状态
show master status;
Slave从机:
查看Slave状态
show slave status;
停止复制
stop slave;
启动复制
start slave;
复制故障解决
如果Master宕机,Slave作为读写服务器。如果想启动Master并重新提供Master /Slave服务,需要重新进行日志复制中从FLUSH TABLES WITH READ LOCK开始的配置。