mysql_主从复制

1.初始化配置

1. 关闭防火墙、Selinux
2. 修改主机名
   主[root@192 ~]# hostnamectl set-hostname master[root@192 ~]# hostnamectl set-hostname slave1
3. 配置本地解析都可配置
	[root@master etc]# vim /etc/hosts 
	192.168.29.129 mysql-master
    192.168.29.142 mysql-slave1
    确保没有行尾空格或制表符,并且每行只有一对 IP 地址和主机名。
4. 静态IP
5. 时间同步

安装数据库

可参考我之前的帖子
链接: mysql-yum安装

2.同步数据

如果主库没有数据则可以省略这步操作

mysqldump -u username -p mydatabase > mydatabase.sql
#这里 -u username 指定了数据库用户,
# -p 表示会提示输入密码,
# mydatabase 是要导出的数据库名,
# mydatabase.sql 是导出文件的名称。

例:
主库
mysqldump -u username -p database_name > database_name.sql
scp database_name.sql 目标ip:/目标目录

从库
mysql -uroot -p123456 </目标目录/database_name.sql

3.主从复制

主库操作

1.创建复制用户

1. 创建用户
mysql> create user "repUser"@"%" identified by "123456";
2. 授权
# replication slave 这是一种权限类型,它允许用户在从服务器上执行读取主服务器二进制日志的操作,这是设置 MySQL 复制所必需的。
# *.*:这表示权限应用于所有数据库和表。*.* 是一个通配符,其中第一个 * 代表所有数据库,第二个 * 代表所有表。
# 'repUser'@'%':这指定了接收权限的用户和主机。在这里,repUser 是用户名,% 表示任何主机。这意味着名为 repUser 的用户可以从任何 IP 地址连接并执行复制从服务器的操作。
mysql> grant replication slave on *.* to "repUser"@"%";
3. 刷新权限
mysql> flush privileges;

2.创建二进制日志文件

[root@master  ~]# mkdir /var/log/mysql
[root@master  ~]# chown mysql.mysql /var/log/mysql

[root@master  ~]# cd /etc/my.cnf
添加配置
[mysqld]
# 二进制日志所在位置, mysql-bin指的是二进制日志的前缀
log-bin=/var/log/mysql/mysql-bin
# 主库server-id与从库的server-id 不一致。
server-id=1

3.重启服务

[root@master  ~]# systemctl restart mysqld

4.登录数据库

mysql -uroot -p123456

mysql> show master status\G
*************************** 1. row ***************************
             File: mysql-bin.000001
         Position: 154
     Binlog_Do_DB: 
 Binlog_Ignore_DB: 
Executed_Gtid_Set: 
1 row in set (0.00 sec)

# File: 指的是binlog日志的名字
# Position:binlog日志的位置点
# 这两个参数在配置从库的时候要用到

从库操作

1. 开启主从配置 
[root@slave ~]# vim /etc/my.cnf
server-id=2
2. 重启数据库
[root@slave ~]# systemctl restart mysqld
3. 主从配置
mysql> CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repUser',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154,
  MASTER_CONNECT_RETRY=10;
4. 启动主从配置
mysql> start slave;

5. 查看主从的状态信息
mysql> SHOW SLAVE STATUS\G
## Slave_IO_Running与Slave_SQL_Running如果都是yes,证明主从配置无问题
##    Last_Errno: 0  Last_Error: 最后一次错误代码及错误信息
#               Last_IO_Errno: 0
#               Last_IO_Error: 
#               Last_SQL_Errno: 0
#               Last_SQL_Error:
#  Slave_SQL_Running_State 详细的错误代码
# Seconds_Behind_Master: 主从复制延时时间

4.基于 GTID 的主从复制

#这里的配置新增了GTID 相关的配置
[mysqld]
log-bin=/var/log/mysql/mysql-bin
server-id=1
#打开gtid模式
gtid_mode=ON
enforce_gtid_consistency=1  
重启服务
systemctl start mysqld

从库配置MASTER 参数时不需要指定 MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154参数
mysql> CHANGE MASTER TO
  MASTER_HOST='mysql-master',
  MASTER_USER='repUser',
  MASTER_PASSWORD='123456',
  MASTER_PORT=3306,
  MASTER_CONNECT_RETRY=10;

基于 GTID 的 MySQL 主从复制模式相较于传统的基于位置的复制模式(基于 binlog 文件名和偏移量)具有多个优势:

简化的故障转移和主从搭建:GTID 允许从服务器自动定位到主服务器上正确的事务,无需手动指定 binlog 文件名和位置。这意味着在进行故障转移或初次搭建主从复制时,可以简单地使用 MASTER_AUTO_POSITION=1 来启动复制过程 。

数据一致性:GTID 确保每个事务在复制集群中只被执行一次,从而避免了数据不一致的风险。如果从服务器在恢复时遇到重复的事务,它会识别并忽略已经执行过的事务 。

提高复制安全性:GTID 模式下,MySQL 会记录每个事务的 GTID,这有助于在复制过程中跟踪事务的执行情况,确保数据的完整性和顺序性 。

并行复制:在 GTID 复制中,可以更容易地实现并行复制(Multi-Threaded Slave, MTS),从而提高复制效率,尤其是在复制大量数据时 。

减少人为错误:由于不需要手动管理 binlog 的文件名和位置,基于 GTID 的复制减少了因人为错误导致的数据不一致问题 。

简化的监控和管理:GTID 提供了一种更清晰的方式来监控复制状态,因为每个事务都有一个唯一的标识符,使得问题诊断和故障排除更加容易 。

然而,GTID 复制也有一些限制和缺点,例如:

存储引擎限制:GTID 复制要求所有涉及的表必须是事务型的存储引擎,如 InnoDB 。

复杂的多源复制:在多源复制(多个主服务器复制到同一个从服务器)的场景中,管理 GTID 可能会变得更加复杂 。

备份和恢复的注意事项:在进行备份和恢复时,需要特别注意 GTID 的处理,以确保数据的一致性和复制的连续性 。

不支持某些操作:例如,不支持 CREATE TABLE ... SELECT 语句复制,因为这会生成多个 GTID 。

性能考虑:虽然 GTID 提供了许多好处,但在某些情况下,它可能会对性能产生影响,尤其是在高并发事务的环境中 。

总的来说,GTID 复制模式在许多场景下提供了更简单、更安全、更可靠的复制管理方式,特别是在需要高可用性和自动故障转移的环境中。

你可能感兴趣的:(mysql,数据库,linux)