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 复制模式在许多场景下提供了更简单、更安全、更可靠的复制管理方式,特别是在需要高可用性和自动故障转移的环境中。