MySQL主从复制

来源:互联网 发布:知无涯 编辑:程序博客网 时间:2024/06/07 01:23

参考:
https://dev.mysql.com/doc/refman/5.7/en/replication.html

MySQL版本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型,大于0server-id=1#在innodb引擎中为保证最大可能的一致性,使用以下两行配置innodb_flush_log_at_trx_commit=1sync_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开始的配置。

0 0