MySQL Replication

161 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1、MySQL 5.7主从复制(无初始数据)

系统资源及组件规划:

节点名称系统名称CPU/ 内存网卡磁盘IP 地址OS
Mastermaster2C/4Gens3364G192.168.0.10CentOS7
Slaveslave2C/4Gens3364G192.168.0.20CentOS7

YUM方式安装MySQL 5.7,略

在主数据库上编辑MySQL配置文件:

cat > /etc/my.cnf << EOF
[mysqld]
log-bin=mysql-bin
server-id=10
binlog_do_db=db
binlog_ignore_db=mysql

symbolic-links=0
datadir=/var/lib/mysql
log-error=/var/log/mysqld.log
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
EOF

image.png 在主数据库上重启MySQL服务:

systemctl restart mysqld

image.png 在从数据库上编辑MySQL配置文件:

cat > /etc/my.cnf << EOF
[mysqld]
server-id=20
binlog_do_db=db
binlog_ignore_db=mysql

symbolic-links=0
datadir=/var/lib/mysql
log-error=/var/log/mysqld.log
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
EOF

image.png 在从数据库上重启MySQL服务:

systemctl restart mysqld

image.png 在主从数据库上配置相同的数据库:

CREATE DATABASE db;
CREATE TABLE db.tb  (
  id int NOT NULL,
  name varchar(255) NULL,
  PRIMARY KEY (id)
);

image.png 在主数据库上创建同步账户:

CREATE USER 'repl'@'192.168.0.20' IDENTIFIED BY 'PassWord5.7!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.20' IDENTIFIED BY 'PassWord5.7!';
FLUSH PRIVILEGES;

image.png 在主数据库上查看主数据库状态:

SHOW MASTER STATUS;

image.png 在从数据库上执行同步命令,并开启同步功能:

CHANGE MASTER TO MASTER_HOST='192.168.0.10',MASTER_USER='repl',MASTER_PASSWORD='PassWord5.7!',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1229;
START SLAVE;

image.png 在从数据库上查看从数据库状态:

SHOW PROCESSLIST;

image.png

SHOW SLAVE STATUS \G;

image.png 在主数据库上查看从数据库状态:

SHOW SLAVE HOSTS;

image.png 在主数据库上插入数据:

INSERT INTO db.tb (id,name) VALUES (1,'MySQL');

image.png 在主从数据库上查看数据库数据:

SELECT * FROM db.tb;

image.png

2、MySQL 5.7主从复制(有初始数据)

系统资源及组件规划:

节点名称****系统名称****CPU/ 内存****网卡****磁盘****IP 地址****OS
Mastermaster2C/4Gens3364G192.168.0.10CentOS7
Slaveslave2C/4Gens3364G192.168.0.20CentOS7

YUM方式安装MySQL 5.7,略

在主数据库上编辑MySQL配置文件:

cat > /etc/my.cnf << EOF
[mysqld]
log-bin=mysql-bin
server-id=10
binlog_do_db=db
binlog_ignore_db=mysql

symbolic-links=0
datadir=/var/lib/mysql
log-error=/var/log/mysqld.log
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
EOF

image.png 在主数据库上重启MySQL服务:

systemctl restart mysqld

image.png 在从数据库上编辑MySQL配置文件:

cat > /etc/my.cnf << EOF
[mysqld]
server-id=20
binlog_do_db=db
binlog_ignore_db=mysql

symbolic-links=0
datadir=/var/lib/mysql
log-error=/var/log/mysqld.log
socket=/var/lib/mysql/mysql.sock
pid-file=/var/run/mysqld/mysqld.pid
EOF

image.png 在从数据库上重启MySQL服务:

systemctl restart mysqld

image.png 在主数据库上配置数据库,并插入数据:

CREATE DATABASE db;
CREATE TABLE db.tb  (
  id int NOT NULL,
  name varchar(255) NULL,
  PRIMARY KEY (id)
);

image.png

INSERT INTO db.tb (id,name) VALUES (1,'MySQL');

image.png 在主数据库上查看主数据库数据:

SELECT * FROM db.tb;

image.png 在主数据库上创建同步账户:

CREATE USER 'repl'@'192.168.0.20' IDENTIFIED BY 'PassWord5.7!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.20' IDENTIFIED BY 'PassWord5.7!';
FLUSH PRIVILEGES;

image.png 在主数据库上锁主数据库,并查看主数据库状态:

FLUSH TABLES WITH READ LOCK;

image.png 在主数据库上查看主数据库状态:

SHOW MASTER STATUS;

image.png 在主数据库上备份数据:

mysqldump --master-data -u root -p db > db.sql

image.png 在从数据库上恢复数据:

CREATE DATABASE db;

image.png

mysql -u root -p db < /root/db.sql

image.png 在从数据库上执行同步命令,并开启同步功能:

CHANGE MASTER TO MASTER_HOST='192.168.0.10',MASTER_USER='repl',MASTER_PASSWORD='PassWord5.7!',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=1485;
START SLAVE;

image.png 在从数据库上查看从数据库状态:

SHOW PROCESSLIST;

image.png

SHOW SLAVE STATUS \G;

image.png 在主数据库上查看从数据库状态:

SHOW SLAVE HOSTS;

image.png 在主数据库上释放锁:

UNLOCK TABLES;

image.png 在主数据库上插入数据:

INSERT INTO db.tb (id,name) VALUES (2,'Redis');

image.png 在主从数据库上查看数据库数据:

SELECT * FROM db.tb;

image.png

3、MySQL 5.7主备切换

系统资源及组件规划:

节点名称****系统名称****CPU/ 内存****网卡****磁盘****IP 地址****OS
Mastermaster2C/4Gens3364G192.168.0.10CentOS7
Slaveslave2C/4Gens3364G192.168.0.20CentOS7

YUM方式安装MySQL 5.7,略

配置MySQL 5.7主从复制,略

3.1 正常主从切换

在主数据库上锁定写操作:

FLUSH TABLES WITH READ LOCK;

image.png 在从数据库上创建同步账户:

CREATE USER 'repl'@'192.168.0.10' IDENTIFIED BY 'PassWord5.7!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.0.10' IDENTIFIED BY 'PassWord5.7!';
FLUSH PRIVILEGES;

image.png 在从数据库上停止IO_THREAD线程:

STOP SLAVE IO_THREAD;

image.png 在从数据库上查看从数据库状态:

SHOW SLAVE STATUS \G;

image.png 在从数据库上编辑MySQL配置文件,开启log-bin:

[mysqld]
log-bin=mysql-bin

在从数据库上重启MySQL服务:

systemctl restart mysqld

image.png 在从数据库上激活从数据库,变为主数据库:

STOP SLAVE;
RESET MASTER;
RESET SLAVE ALL;

image.png 在原从数据库上查看主数据库状态:

SHOW MASTER STATUS;

image.png 在主数据库上执行同步命令,并开启同步功能,变为从数据库:

CHANGE MASTER TO MASTER_HOST='192.168.0.20',MASTER_USER='repl',MASTER_PASSWORD='PassWord5.7!',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=154;
START SLAVE;

image.png 在原主数据库上查看从数据库状态:

SHOW PROCESSLIST;

image.png

SHOW SLAVE STATUS \G;

image.png 在原主数据库上解锁定写操作:

UNLOCK TABLES;

image.png 在主数据库上插入数据:

INSERT INTO db.tb (id,name) VALUES (3,'NoSQL');

image.png 在主从数据库上查看数据库数据:

SELECT * FROM db.tb;

image.png

3.2 宕机主从切换

在从数据库上编辑MySQL配置文件,开启log-bin:

[mysqld]
log-bin=mysql-bin

在从数据库上重新启动MySQL:

systemctl restart mysqld

image.png 在从数据库上激活从数据库,变为主数据库:

STOP SLAVE;
RESET MASTER;

image.png 在主数据库上插入数据:

INSERT INTO db.tb (id,name) VALUES (3,'NoSQL');

image.png 在主数据库上查看数据库数据:

SELECT * FROM db.tb;

image.png