主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
根据配置,您可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中复制的优点包括:
首先准备好两台装有数据库的虚拟机
yum安装mysql步骤
192.168.13.128 master
192.168.13.129 slave
两台虚拟机都要做:地址解析,关闭防火墙,selinux,清空iptables
master:
[root@master ~]# vim /etc/hosts
192.168.13.128 master
192.168.13.129 slave
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@master ~]# setenforce 0
[root@master ~]# iptables -F
slave:
[root@slave ~]# vim /etc/hosts
192.168.13.128 master
192.168.13.129 slave
[root@slave ~]# systemctl stop firewalld
[root@slave ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@slave ~]# setenforce 0
[root@slave ~]# iptables -F
master 192.168.13.128
1. 在主服务器上,您必须启用二进制日志记录并配置唯一的服务器ID然后需要重启服务器。
[root@master ~]# vim /etc/my.cnf #在mysqld模块里面添加如下内容
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
2. 创建日志目录并赋予权限
[root@master ~]# mkdir /var/log/mysql
[root@master ~]# chown mysql.mysql /var/log/mysql
3. 重启服务
[root@master ~]# systemctl restart mysqld
4. 创建专门用于复制数据的用户,并授权
进入数据库 [root@master ~]# mysql -uroot -p
mysql> CREATE USER 'yjssjm'@'%';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'yjssjm'@'%' identified by '123';
mysql> show binlog events\G #查看我们需要的Log_name
*************************** 1. row ***************************
Log_name: mysql-bin.000001
Pos: 4
Event_type: Format_desc
Server_id: 1
End_log_pos: 123
Info: Server ver: 5.7.29-log, Binlog ver: 4
*************************** 2. row ***************************
Log_name: mysql-bin.000001
Pos: 123
Event_type: Previous_gtids
Server_id: 1
End_log_pos: 154
Info:
*************************** 3. row ***************************
Log_name: mysql-bin.000001
Pos: 154
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 219
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 4. row ***************************
Log_name: mysql-bin.000001
Pos: 219
Event_type: Query
Server_id: 1
End_log_pos: 354
Info: CREATE USER 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password'
*************************** 5. row ***************************
Log_name: mysql-bin.000001
Pos: 354
Event_type: Anonymous_Gtid
Server_id: 1
End_log_pos: 419
Info: SET @@SESSION.GTID_NEXT= 'ANONYMOUS'
*************************** 6. row ***************************
Log_name: mysql-bin.000001
Pos: 419
Event_type: Query
Server_id: 1
End_log_pos: 639
Info: GRANT REPLICATION SLAVE ON *.* TO 'yjssjm'@'%' IDENTIFIED WITH 'mysql_native_password' AS '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257'
6 rows in set (0.00 sec)
5. 连接测试
[root@master ~]# mysql -uyjssjm -p'123' -hmaster
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.29-log MySQL Community Server (GPL)
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
主服务器中无数据,所以我们不用备份,直接配置即可。
slave 192.168.13.129
1.修改配置文件
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server-id=4
# server-id只要不是1就可以
2.重启服务
[root@slave ~]# systemctl restart mysqld
3.配置相关连接信息
mysql> edit #进入编辑模式,复制下面内容
CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_LOG_FILE='mysqld-bin.000001',
MASTER_LOG_POS=0;
-> ;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
===========================================================================
MASTER_HOST='master' # master地址,如果你没做解析,可以直接用ip,如192.168.13.128
MASTER_USER='yjssjm' # 创建的用户名
MASTER_PASSWORD='123'
MASTER_LOG_FILE='mysqld-bin.000001'
MASTER_LOG_POS=0;
# 在master上执行show binlog events命令,可以看到第一个binlog文件的内容mysqld-bin.000001就是我们需要的文件名
===========================================================================
4. 查看
mysql> start slave;
mysql> show slave status\G
测试我就不演示了,在master上面对数据库进行增删改,slave上面会进行同样的操作。
如果主数据库包含现有数据,则必须将此数据复制到每个从站。有多种方法可以实现:
InnoDB
。[root@master ~]# mysqldump -u用户名 -p密码 --all-databases --master-data=1 > dbdump.db
这里的用户是主服务器的用户
如果不使用 --master-data
参数,则需要手动锁定单独会话中的所有表。
scp
或 rsync
等工具,把备份出来的数据传输到从服务器中。在主服务中执行如下命令
[root@master ~]# scp dbdump.db root@slave:/root/
这里的 slave 需要能被主服务器解析出 IP 地址,或者说可以在主服务器中 ping 通。
从服务器
上编辑其配置文件 my.cnf
并添加如下内容// my.cnf 文件
[mysqld]
server-id=2
/*导入数据*/
mysql> source /root/fulldb.dump
在从服务器配置连接到主服务器的相关信息
mysql> CHANGE MASTER TO
MASTER_HOST='master', -- 主服务器的主机名(也可以是 IP)
MASTER_USER='yjssjm', -- 连接到主服务器的用户
MASTER_PASSWORD='123'; -- 到主服务器的密码
mysql> start slave;
Query OK, 0 rows affected (0.09 sec)
检查是否成功
在从服务上执行如下操作,加长从服务器端 IO线程和 SQL 线程是否是 OK
mysql> show slave status\G
输出结果中应该看到 I/O 线程和 SQL 线程都是 YES
, 就表示成功。
执行此过程后,在主服务上操作的修改数据的操作都会在从服务器中执行一遍,这样就保证了数据的一致性。
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
gtid_mode=ON
enforce_gtid_consistency=1 # 强制执行GTID一致性。
重启服务
其他和之前的一样
mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '123';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
mysql>
测试用户有效性
mysql -urepl -p'123' -hmysql-master1
[mysqld]
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
# 可选项, 把连接到 master 的信息存到数据库中的表中
master-info-repository=TABLE
relay-log-info-repository=TABLE
重启服务
假如有数据,先导入数据
mysql> source dump.db
Mysql 终端执行连接信息
mysql> CHANGE MASTER TO
MASTER_HOST='master',
MASTER_USER='yjssjm',
MASTER_PASSWORD='123',
MASTER_AUTO_POSITION=1;
mysql> start slave;