MYSQL主从环境的搭建

2023年 12月 7日 24.5k 0

准备两台服务器或者虚拟机

建议用linux服务器搭建

服务器记得在安全组放开端口,并且将防火墙的端口也放开,能省去百分之80的坑

在两台服务器上都安装mysql

mysql安装的方式:

  • 原生安装也就是软件包方式安装
  • docker安装
  • docker-compose安装

我在这里选择的是原生的方式,因为把mysql这种重要的东西放在一个篮子(docker容器)里面始终是不安全的!!

开始安装mysql服务

如果是rpm方式安装的mysql想卸载
# 查看mysql安装的服务和依赖
rpm -qa| grep  mysql
# 如果下面出现很多直接强行卸载 --nodeps为强行卸载
rpm -e --nodeps <列出的所有软件包名>

## =================上面只是卸载了服务,数据还在==========================
## 删除mysql的所有的数据,小心谨慎删除
whereis mysql
rm -rf <上面查找的目录文件>

卸载完成后会出现,没输出说明卸载完成

image.png

下载mysql的npm的包
# wget下载mysql的安装包源信息
wget  http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm

# rpm 安装源信息
rpm -ivh mysql80-community-release-el7-7.noarch.rpm

# 尝试使用 yum 安装MySQL
# 安装过程中,会提示让我们确认,一律输入 y 按回车即可
# 安装完成后,yum会自动覆盖自带的mariaDB,所以不需要我们手动卸载它
yum install mysql-community-server

# 检查一下刚才的安装是否成功
rpm -qa | grep mysql

出现下面说明服务安装成功

启动mysql服务
# 启动
systemctl start mysqld

# 第一次启动后,可以查看mysql初始化密码
grep 'temporary password' /var/log/mysqld.log

# 重启
systemctl restart mysqld

# 停止
systemctl stop mysqld

#查看状态
systemctl status mysqld

#开机启动
systemctl enable mysqld
systemctl daemon-reload

# 查看进程、版本信息
ps -ef | grep mysql
或
netstat -atp

# 登录
mysql -u root -p'密码内容'

# 查看所有表
show databases;

# 进入数据库
use 表名

# 查看所有表
show tables

image.png
我们安装的时候,并没有设置初始密码

所以 mysql 在第一次启动的时候,会自动初始化一个密码

通过以下这行代码,我们可以查看 mysql 自动初始化的密码:

# 第一次启动后,可以查看mysql初始化密码
grep 'temporary password' /var/log/mysqld.log
2023-11-29T14:49:53.577426Z 1 [Note] A temporary password is generated for root@localhost: 
lGkFsKd=W3jc
2023-11-30T03:15:50.461054Z 6 [Note] [MY-010454] [Server] A temporary password is generated
for root@localhost: L8%=n+Hx=dAu

image.png
粘贴过去后,敲回车,看到这样就算密码输入成功了

image.png

修改mysql的默认密码

注意了,默认的密码策略,需要:大写英文 + 特殊字符 + 数字

ALTER USER 'root'@'localhost' IDENTIFIED BY 'xxx654Q.';

有些同学可能会觉得,老子密码想设置啥就设置啥,轮得到你这 mysql 在这里瞎BB?

那也是可以修改密码校验策略的

首先,安装密码验证插件

但是有个前提,你还是需要先按它的要求修改第一次密码,才能安装密码验证策略插件

1、先按照mysql的要求,修改一次密码
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Root_123';

2、退出mysql
exit

3、重新登录mysql
mysql -u root -p'Root_123'

4、安装密码验证插件
install plugin validate_password soname 'validate_password.so';

5、查看是否启用了插件
select plugin_name, plugin_status from information_schema.plugins where plugin_name like 'validate%';
+-------------------+---------------+
| plugin_name       | plugin_status |
+-------------------+---------------+
| validate_password | ACTIVE        |
+-------------------+---------------+
输出这样的内容,表示成功启用

查看验证策略的键、值信息

SHOW VARIABLES LIKE 'validate_password%';

对于高版本的mysql,例如mysql 8,验证策略的key,是 validate_password.xxx
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 8     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | MEDIUM|
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+


对于低版本的mysql,例如mysql 5.7,验证策略的key,是 validate_password_xxx
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password.check_user_name    | ON    |
| validate_password.dictionary_file    |       |
| validate_password.length             | 8     |
| validate_password.mixed_case_count   | 1     |
| validate_password.number_count       | 1     |
| validate_password.policy             | MEDIUM|
| validate_password.special_char_count | 1     |
+--------------------------------------+-------+

我们修改密码策略和密码长度

我的策略信息的 key ,是 validate_password.xxx这个格式的,所以按照如下进行设置

set global validate_password_policy=0;
set global validate_password_length=1;

set global validate_password.policy=0;
set global validate_password.length=1;

image.png
好了,现在密码就可以按照你刚才配置的策略,来进行设置密码了

ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新密码';
或者 
set password for 'root'@'%'=password('你的新密码');
可视化工具的登录授权:(如果授权不成功,请查看防火墙)

操作完成上面的,现在还不能用可视化的客户端进行连接,需要我们进行授权:

# 连接 mysql 服务器
mysql -u root -p
# 进入 mysql 数据库
mysql> use mysql;
# 查看 user 表
mysql> select user,host from user;
# 修改 user 表中的 Host
mysql> update user set host='%' where user='username';
# 查看 user 表
mysql> select user,host from user;
# 刷新权限
mysql> flush privileges;
# 退出
mysql> quit;

操作完毕,接下来可以使用navicat或者sqlylog进行远程连接了.

第二台服务器同理,安装好mysql服务并且顺利运行起来,然后进行下一步

MySQL报错的解决Can‘t connect to local MySQL server through socket ‘varlibmysqlmysql.sock

参考文章:blog.csdn.net/m0_67390379…

开始配置主从环境

服务器配置
Master节点配置/etc/my.cnf(master节点执行)
> vim /etc/my.cnf
[mysqld]
## 同一局域网内注意要唯一
server-id=1  
## 开启二进制日志功能,可以随便取(关键)
log-bin=mysql-bin
## 复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
Slave节点配置/etc/my.cnf(slave节点执行)
> vim /etc/my.cnf
[mysqld]
## 设置server_id,注意要唯一
server-id=100
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin
## relay_log配置中继日志
relay_log=edu-mysql-relay-bin
##复制过滤:不需要备份的数据库,不输出(mysql库一般不同步)
binlog-ignore-db=mysql
## 如果需要同步函数或者存储过程
log_bin_trust_function_creators=true
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
在master服务器授权slave服务器可以同步权限(master节点执行)

注意:在master服务器上执行

# mysql5.7的版本
mysql > mysql -uroot -pmaster的密码
# 授予slave服务器可以同步master服务 mysql8.0要求强行分开执行,现有用户再有权限
mysql > grant replication slave, replication client on *.* to 'root'@'slave服务的ip' identified by 'slave服务器的密码';
mysql > flush privileges;
# 查看MySQL现在有哪些用户及对应的IP权限(可以不执行,只是一个查看)
mysql > select user,host from mysql.user;

# mysql8.0版本有坑,一行命令变两行命令,并且密码有限制,老恶心了
# 先把密码的要求先去除掉,这个设置每次mysql重启就会失效,很烦
set global validate_password_policy=0;
set global validate_password_length=1;

set global validate_password.policy=0;
set global validate_password.length=1;

# 创建用户
CREATE USER '账号'@'从服务器ip' IDENTIFIED BY '你的密码';
# 授予权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO '账号'@'从服务器ip';
# 刷新权限
FLUSH PRIVILEGES;
查询master服务的binlog文件名和位置(master节点执行)
mysql> show master status;

image.png

slave进行关联master节点(slave节点执行)
  • 进入到slave节点:
mysql > mysql -uroot -p你slave的密码 
  • 开始执行:

这里注意一下 master_log_file 和 master_log_pos 都是通过 master服务器通过show master status获得。

mysql> change master to master_host='master服务器ip', master_user='在master创建的账号',master_password='在master创建密码', master_port=3306, master_log_file='上面binlog文件名',master_log_pos=上面查到的偏移量;

image.png

在slave节点上查看主从同步状态(slave节点执行)

启动主从复制

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

再查看主从同步状态

mysql> show slave statusG;

image.png
这个错误是由于MySQL 8.0引入了一个新的身份验证方法:caching_sha2_password,它需要安全连接(1)(2)。如果您的连接不是通过SSL进行的,那么就会出现这个错误。

参考:blog.csdn.net/heisejingyu…

偏移量不对的话:

mysql> stop slave;
mysql> CHANGE MASTER TO MASTER_LOG_FILE='binlog文件名',MASTER_LOG_POS=偏移量位置; 
mysql> start slave;

最后看到这样就成功了

image.png

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论