目录
一、MySQL 主从复制原理
二.主从数据库配置
主从复制(也称 AB 复制)允许将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。
复制是异步的 从站不需要永久连接以接收来自主站的更新。
根据配置,可以复制数据库中的所有数据库,所选数据库甚至选定的表。
MySQL中主从复制的优点包括:
Replication 的原理
前提是作为主服务器角色的数据库服务器必须开启二进制日志
I/O tread
(I/O 线程)保存在二进制日志 Binary log
里面。I/O thread
,通过配置好的用户名和密码,连接到主服务器上面请求读取二进制日志,然后把读取到的二进制日志写到本地的一个Relay log
(中继日志)里面。SQL thread
定时检查 Relay需要注意的是:
重要: 无法将主服务器配置为仅记录特定事件。
每个从站(从服务器)都会记录二进制日志坐标:
文件名
文件中它已经从主站读取和处理的位置。
由于每个从服务器都分别记录了自己当前处理二进制日志中的位置,因此可以断开从服务器的连接,重新连接然后恢复继续处理。
一主多从
如果一主多从的话,这时主库既要负责写又要负责为几个从库提供二进制日志。此时可以稍做调整,将二进制日志只给某一从,这一从再开启二进制日志并将自己的二进制日志再发给其它从。或者是干脆这个从不记录只负责将二进制日志转发给其它从,这样架构起来性能可能要好得多,而且数据之间的延时应该也稍微要好一些。工作原理图如下:
关于二进制日志
mysqld
将数字扩展名附加到二进制日志基本名称以生成二进制日志文件名。每次服务器创建新日志文件时,该数字都会增加,从而创建一系列有序的文件。每次启动或刷新日志时,服务器都会在系列中创建一个新文件。服务器还会在当前日志大小达到max_binlog_size
参数设置的大小后自动创建新的二进制日志文件 。二进制日志文件可能会比max_binlog_size
使用大型事务时更大, 因为事务是以一个部分写入文件,而不是在文件之间分割。
为了跟踪已使用的二进制日志文件, mysqld
还创建了一个二进制日志索引文件,其中包含所有使用的二进制日志文件的名称。默认情况下,它具有与二进制日志文件相同的基本名称,并带有扩展名.index
。在mysqld
运行时,不应手动编辑此文件。
二进制日志文件
通常表示包含数据库事件的单个编号文件。
二进制日志
表示含编号的二进制日志文件集加上索引文件。
SUPER
权限的用户可以使用SET sql_log_bin=0
语句禁用其当前环境下自己的语句的二进制日志记录
1.实验环境 : server2(172.25.254.2 master)server3(172.25.254.3 slave)
2.主数据库的配置
(1)vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
server-id=1 主机id号指定
log-bin=mysql-bin 日志文件名称指定
#
##
## include all files from the config directory
!includedir /etc/my.cnf.d
(2)[root@server2 mysql]# /etc/init.d/mysqld restart
(3)[root@server2 mysql]# mysql -p
(4)mysql> create user 'repl'@'172.25.11.%' identified by '密码'; 创建复制用户
mysql> grant replication slave on *.* to 'repl'@'172.25.11.%'; 授予用户权限
mysql> flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 156 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.04 sec)
测试master是否创建成功
[root@server3 bin]# mysql -h 172.25.254.2 -u repl -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.21 Source distribution
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>
3.slave的配置
(1)vim /etc/my.cnf
[mysqld]
basedir=/usr/local/lnmp/mysql
datadir=/data/mysql
socket=/data/mysql/mysql.sock
#skip-grant-tables
server-id=2 从机的id指定
#log-bin=mysql-bin
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d
(2)[root@server3 mysql]# /etc/init.d/mysqld restart
(3)[root@server3 mysql]# mysql -p
mysql> change master to #下面的参数信息需要从master中获取
-> master_host='172.25.254.2',
-> master_user='repl',
-> master_password='[email protected]',
-> master_log_file='mysql-bin.000001',
-> master_log_pos=156,
-> get_master_public_key=1;
Query OK, 0 rows affected, 2 warnings (0.25 sec)
mysql> start slave;
Query OK, 0 rows affected (0.03 sec)
(4)mysql> start slave; 开启slave
Query OK, 0 rows affected (0.03 sec)
mysql> show slave status\G; 查看是否同步master的数据
Slave_IO_Running: Yes 看到这两个参数表明同步成功
Slave_SQL_Running: Yes
4.测试主从复制是否成功
在主机上创建一个库
mysql> create database summer;
Query OK, 1 row affected (0.11 sec)
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 347 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)
在slave中看
mysql> show slave status\G;
Read_Master_Log_Pos: 347
Relay_Log_File: server3-relay-bin.000002
Relay_Log_Pos: 515
Relay_Master_Log_File: mysql-bin.000001 信息和master上面一致
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| summer | 建的库在slave中出现
| sys |
+--------------------+
5 rows in set (0.05 sec)