CentOS 8 下 Mysql 8 主从从的搭建

2023-11-06

CentOS 8 下 Mysql 8 主从从的搭建

1,环境

[root@localhost etc]# cat /etc/redhat-release 
CentOS Linux release 8.2.2004 (Core) 
[root@localhost etc]# mysql --version
mysql  Ver 8.0.17 for Linux on x86_64 (Source distribution)

本次一共使用3台机子,环境都是一样的。Mysql的安装过程省略了,网上有很多教程。

IP地址 角色
192.168.1.102
192.168.1.103
192.168.1.104

2,配置 mysql 主从从环境
首先在主节点 192.168.1.102上操作,本次要同步的是HA数据库:

[root@localhost etc]# mysql -u root -p123456
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| HA                 |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| zabbix             |
+--------------------+
6 rows in set (0.02 sec)

mysql> use HA;
mysql> create table test(id int,name varchar(20));
mysql> insert into test(id,name)values(1,"mayun");
mysql> exit

退出mysql。

vim /etc/my.cnf #在文件最后,插入以下内容
[mysqld]
skip-name-resolve
log-bin=mysql-bin-master #启用二进制日志
server-id=1 #本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库,多个的话加行
binlog-ignore-db=zabbix #不可以被从服务器复制的库
然后重启mysql服务:

[root@localhost etc]# systemctl restart mysqld

主库创建主从用户(slave用户):

[root@localhost etc]# mysql -u root -p123456
mysql> create user 'repl'@'192.168.1.%' identified by 'mayun123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' with grant option;
mysql> flush privileges;

命令 flush privileges; 的作用是立即刷新MySQL的系统权限相关表。
mysql 8 中使用命令grant … identified by 时报错 error 1064 near ‘identified by ‘密码’’ at line 1
是因为新版的的mysql版本已经将创建账户和赋予权限的方式分开了。
查看主库二进制日志位置:

mysql> show master status;
+-------------------------+----------+--------------+------------------+-------------------+
| File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+----------+--------------+------------------+-------------------+
| mysql-bin-master.000006 |      155 | HA           | mysql,zabbix     |                   |
+-------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

mysql> exit

将HA数据库上传到从节点:

[root@localhost ~]# mysqldump -u root -p123456 -B HA >HA.sql
[root@localhost ~]# scp HA.sql 192.168.1.103:/root
[root@localhost ~]# scp HA.sql 192.168.1.104:/root

主节点192.168.1.102设置完成。

接下来到从节点192.168.1.103操作,导入数据库:

[root@localhost ~]# mysql -u root -p123456 <HA.sql

配置 my.cnf:

[root@localhost ~]# vim /etc/my.cnf

在文件最后添加如下内容:
[mysqld]
skip-name-resolve
log-bin=mysql-slave1 #启用二进制日志
server-id=2 #本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
binlog-ignore-db=zabbix #不可以被从服务器复制的库
log_slave_updates=1 #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的操作日志

重启 MySQL 并授权:

[root@localhost ~]# systemctl restart mysqld
[root@localhost etc]# mysql -u root -p123456
mysql> create user 'repl'@'192.168.1.%' identified by 'mayun123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' with grant option;
mysql> flush privileges;

建立主从关系:

mysql> change master to master_host='192.168.1.102',master_user='repl',master_password='mayun123456';
mysql> start slave;
mysql> show slave status\G
mysql> exit

这里有一个值得注意的地方,上一步配置/etc/my.cnf文件的时候,一定要添加这行[mysqld],不然查看show slave status\G的时候会看到:
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.1.102
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: localhost-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: Yes

有一个IO线程起不来Slave_IO_Running: No,并且在日志/var/log/mysql/mysqld.log里面还会看到报错内容:
because master and slave have equal MySQL server ids

接下来到从节点192.168.1.104操作,导入数据库:

[root@localhost ~]# mysql -u root -p123456 <HA.sql

配置 my.cnf:

[root@localhost ~]# vim /etc/my.cnf

在文件最后添加如下内容:
[mysqld]
skip-name-resolve
log-bin=mysql-slave2 #启用二进制日志
server-id=3 #本机数据库 ID 标示
binlog-do-db=HA #可以被从服务器复制的库。二进制需要同步的数据库名
binlog-ignore-db=mysql #不可以被从服务器复制的库
binlog-ignore-db=zabbix #不可以被从服务器复制的库
log_slave_updates=1 #只有开启 log_slave_updates,从库 binlog 才会记录主库同步的操作日志

重启 MySQL 并授权:

[root@localhost ~]# systemctl restart mysqld
[root@localhost etc]# mysql -u root -p123456
mysql> create user 'repl'@'192.168.1.%' identified by 'mayun123456';
mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' with grant option;
mysql> flush privileges;

建立主从关系:

mysql> change master to master_host='192.168.1.102',master_user='repl',master_password='mayun123456';
mysql> start slave;
mysql> show slave status\G
mysql> exit

测试一下主从同步是否成功:
在主数据库执行:

mysql> insert into test(id,name)values(2,'huateng');
Query OK, 1 row affected (0.00 sec)

然后在从数据库查看:

mysql> select * from test;
+------+---------+
| id   | name    |
+------+---------+
|    1 | mayun   |
|    2 | huateng |
+------+---------+
2 rows in set (0.00 sec)

验证成功。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CentOS 8 下 Mysql 8 主从从的搭建 的相关文章

  • 通过我的java代码导出数据库

    我想使用我的 java 代码导出我的 MySQL 数据库 但我还没有找到任何办法 我想要做的就是我的应用程序中有一个按钮作为 导出数据库 单击该按钮时 我的数据库应导出到指定的路径 我使用了以下代码 但它不起作用 Runtime runti
  • MySQL Workbench 6.0 错误无法获取管理员的管理访问权限?

    我在这里使用 MySQL Workbench 6 0 当我选择服务器状态时 出现此错误 对此 我尝试在Google和StackOverflow上寻找解决方案 e g 这个结果 https stackoverflow com question
  • SQL 检查一组日期是否在指定的日期范围内

    我有一个表 其中保存架构中房间不可用的日期 ROOM ID DATE UNAVAILABLE 我需要一个 sql 查询来检查两个日期范围内是否有可用房间 类似于 Select All rooms that are constantly av
  • MySQL用户创建的临时表已满

    我使用内存引擎创建了一个临时表 如下所示 CREATE TEMPORARY TABLE IF NOT EXISTS some text id INT DEFAULT 0 string varchar 400 DEFAULT engine m
  • 使用唯一索引删除重复项

    我在两个表字段 A B C D 之间插入 相信我已经在 A B C D 上创建了唯一索引以防止重复 然而我以某种方式简单地对这些做了一个正常的索引 因此插入了重复项 这是2000万条记录的表 如果我将现有索引从普通索引更改为唯一索引 或者只
  • mysql语句中的*星号是什么意思?

    Ex mysql query SELECT FROM members WHERE id id 这意味着选择表中的所有列
  • C#:SQL 查询生成器类

    在哪里可以找到好的 SQL 查询构建器类 我只需要一个简单的类来构建 SQL 字符串 仅此而已 我需要它用于 C 和 MySql 我真的不需要像 Linq 或 NHibernate 这样的东西 谢谢 由于 Google 将我引导至此页面 我
  • MySQL 服务器未启动

    当我做 mysql u root p并输入my password这就是我得到的 错误 2002 HY000 无法通过套接字 var run mysqld mysqld sock 连接到本地 MySQL 服务器 2 所以我输入 systemc
  • mySQL MATCH 跨多个表

    我有一组 4 个表 我想对其进行搜索 每个都有全文索引 查询可以使用每个索引吗 CREATE TABLE categories id int 5 unsigned NOT NULL auto increment display order
  • PHP PDO相关:更新SQL语句未更新数据库内容

    我正在尝试使用准备好的语句来实现更新语句PHP http en wikipedia org wiki PHP脚本 但它似乎没有更新数据库中的记录 我不确定为什么 所以如果您能分享一些见解 我将不胜感激 Code query UPDATE D
  • 对于数据库来说,选择正确的数据类型会影响性能吗?

    如果是这样 为什么 我的意思是 tinyint 的搜索速度比 int 快吗 如果是这样 性能上的实际差异是什么 是的 根据数据类型 它确实有所不同 int vs tinyint不会在速度上产生明显的差异 但会在数据大小上产生差异 假设tin
  • 比较表中的行以了解字段之间的差异

    我有一个包含 20 多列的表 客户端 其中大部分是历史数据 就像是 id clientID field1 field2 etc updateDate 如果我的数据如下所示 10 12 A A 2009 03 01 11 12 A B 200
  • 如何使用 MySQL 的 LOAD DATA LOCAL INFILE 在导入 CSV 时将字符串日期更改为 MySQL 日期格式

    我正在使用 MySQL 的 LOAD DATA LOCAL INFILE SQL 语句将数据从 CSV 文件加载到现有数据库表中 下面是一个 SQL 语句示例 LOAD DATA LOCAL INFILE file csv INTO TAB
  • Mysql 检索所有有限制的行

    我想检索特定用户的所有行 限制为 0 x 所以我只是想问是否有任何方法可以检索 mysql 中的所有行 而不调用返回 x 的 count id 的方法 而不重载现有函数 该函数在查询中根本没有限制 与我们的 string Relace 功能
  • MySQL 使用 ALTER IGNORE TABLE 出现重复错误

    我的 MySQL 中有一个有重复项的表 我尝试删除重复项并保留一项 我没有主键 我可以通过以下方式找到重复项 select user id server id count as NumDuplicates from user server
  • MYSQL 区分大小写的 utf8 搜索(使用 hibernate)

    我的登录表具有 utf8 字符集和 utf8 排序规则 当我想要检查用户名并检索该特定用户名的其他信息时 hql 查询会为我提供小写和大写相同的结果 我应该如何处理适用于案例的 HQL 查询 我使用 Mysql 5 和 java hiber
  • MySQL MIN/MAX 所有行

    我有桌子Races与行ID Name and TotalCP 我选择分钟 TotalCP FROM Races 但是我想选择具有最小值的整行 我如何在单个查询中做到这一点 从聚合值获取整行的一般形式是 SELECT FROM Races W
  • 在 MySQL 中使用 COUNT 时如何返回 0 而不是 null

    我使用此查询返回存储在 sTable 中的歌曲列表以及存储在 sTable2 中的总项目数 SQL queries Get data to display sQuery SELECT SQL CALC FOUND ROWS str repl
  • MySQL 查询计算上个月

    我想计算上个月的订单总额 我收到了从当前日期获取当月数据的查询 SELECT SUM goods total AS Total Amount FROM orders WHERE order placed date gt date sub c
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教

随机推荐