Administrator
Administrator
发布于 2025-08-13 / 29 阅读
0
0

Linux服务器实现GTID主从复制(一主一从)

服务器: TencentOS Server 4 x86_64(CentOS 8)(RHEL,Red Hat Enterprise Linux)

MySQL版本: 8.0.43

SSH客户端: termcc

二台服务器,主节点在南京,从节点在新加坡

安装软件

sudo dnf install phpmyadmin mysql-server httpd

修改phpmyadmin配置

/etc/http/conf.d/phpMyAdmin.conf

<Directory /usr/share/phpMyAdmin>
   AllowOverride All
   Require all granted
</Directory>

修改my.cnf

配置文件在/etc/my.cnf

主节点

[mysqld]
server-id=1
log-bin=
binlog-format=row
character_set_server=utf8mb4
secure_file_priv=
log-slave-updates=1
skip-name-resolve
gtid-mode=ON
enforce-gtid-consistency=on
report_host=<主库IP>

从节点

[mysqld]
server-id=2
character_set_server=utf8mb4
secure_file_priv=
log-bin=
binlog-format=row
log-slave-updates=1
skip-name-resolve
gtid-mode=ON
enforce-gtid-consistency=on
report_host=<从库IP>

启动apache和mysql

systemctl start mysqld #注意是mysqld
systemctl start httpd

http://ip/phpmyadmin就可以访问了

修改MySQL的root账户密码

默认空密码连接,也就是终端输入mysql就连接上了

phpmyadmin不知道是否支持不输入密码,没有试验,如果不行就进入终端通过下面的语句改密码

alter user root@'localhost' identified with MYSQL_NATIVE_PASSWORD by '新的ROOT密码';

主从复制过程

主和从都执行一次SQL语句:

GRANT all on *.* TO 'root'@'%' with grant option;
FLUSH PRIVILEGES;

主库执行:

创建用于复制的账号,账号repl,密码repl_password,可以自定义

CREATE USER 'repl'@'%' IDENTIFIED BY 'repl_password';
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl_password';
GRANT all on *.* TO 'repl'@'%' with grant option;
FLUSH PRIVILEGES;

在主节点中创建数据库和表,并添加一些测试数据


主库执行:

记录文件名和当前日志位置,如:mysql-copy-master-bin.000001和2451

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

从节点在命令行中依次执行:

将主节点当前数据导出并导入从节点,执行第一条时输入的密码是主节点的,第二条命令的密码是从节点的

mysqldump -h <主库IP> -u root -p --all-databases --source-data=2 --all-databases --triggers --routines --events > alldb.sql
mysql -u root -p < alldb.sql

主库:

UNLOCK TABLES;

从库执行sql:

主库ip替换掉,文件名和位置在前面步骤中,账号密码是前面主节点创建出来的

CHANGE REPLICATION SOURCE TO
  SOURCE_HOST='<主库IP>',
  SOURCE_LOG_FILE='记录的binlog文件名',
  SOURCE_LOG_POS=记录的binlog位置;

START REPLICA USER='repl' PASSWORD='repl_password'

完成!!

从库执行sql:

show replica status;

可以查看状态,Replica_IO_Status是Waiting for source to send event表示正常,如果不是则查看Last_IO_Error列的错误内容,自行百度找资料修复。


评论