Skip to content

单体部署Mysql

1、下载mysql安装包

MySQL :: Download MySQL Community Server (Archived Versions)

2、检查mysql文件

shell
# 检查之前是否存在mysql
rpm -qa | grep mysql

# 如果存在就删除
rpm -e xxx

# 检查是否存在mariadb
rpm -qa|grep mariadb

# 如果存在就删除
rpm -e mariadb-libs --nodeps

3、解压缩

shell
# 进入到指定目录,并且将文件解压到该目录下
cd /usr/local

# 创建文件,将bundle文件上传至此
mkdir mysql

# 解压文件
tar -xvf mysql-8.4.0-1.el7.x86_64.rpm-bundle.tar

4、创建用户组并赋予权限

shell
# 先检查是否有mysql用户组和mysql用户,没有就添加有就忽略
groups mysql

# 添加用户组和用户
groupadd mysql && useradd -r -g mysql mysql

5、按照顺序进行rpm安装

shell
# 执行顺序,不可以颠倒
1、rpm -ivh mysql-community-common-8.4.0-1.el7.x86_64.rpm 
2、rpm -ivh mysql-community-client-plugins-8.4.0-1.el7.x86_64.rpm 
3、rpm -ivh mysql-community-libs-8.4.0-1.el7.x86_64.rpm 
4、rpm -ivh mysql-community-client-8.4.0-1.el7.x86_64.rpm 
5、rpm -ivh mysql-community-icu-data-files-8.4.0-1.el7.x86_64.rpm 
6、rpm -ivh mysql-community-server-8.4.0-1.el7.x86_64.rpm 

6、初始化

shell
# 修改文件拥有者为mysql组的mysql
chown mysql:mysql -R  /var/lib/mysql

# 初始化
mysqld --initialize --console

7、修改密码

shell
# 启动mysql
systemctl start mysqld

# 生成的临时密码在mysqld.log文件下,过滤出查看,localhost后的为密码
# 2024-08-13T03:12:26.802769Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ?;QdF#jwc22h
cat /var/log/mysqld.log | grep localhost

# 回车后输入临时密码登录
mysql -uroot  -p

# 修改密码
alter user 'root'@'localhost' identified by 'fujianz123';

# 退出
exit

# 使用新密码登录成功
mysql -uroot -pfujianz123

8、创建远程新用户

shell
# 创建新的用户和密码,%表示可以远程链接
CREATE USER 'remote'@'%' IDENTIFIED BY 'fujianz123';

# 授予权限
GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' WITH GRANT OPTION;

# 刷新权限信息
FLUSH PRIVILEGES;

#查看已有的用户
SELECT user,host FROM mysql.user;

9、开放系统端口号,用于远程连接

shell
#方案一:直接关闭整个防火墙
# 关闭防火墙
systemctl stop firewalld.service 
# 查看防火墙的状态
firewall-cmd --state 
# 禁止firewall开机启动
systemctl disable firewalld.service


#方案二:关闭指定端口号
# 3306 端口对外开放
firewall-cmd --permanent --add-port=3306/tcp
# 重启防火墙
firewall-cmd --reload
# 查询端口开放情况
firewall-cmd --query-port=3306/tcp


#如果报错: FirewallD is not running,开启防火墙即可
systemctl start firewalld

#SQLyog错误号码MySQL plugin caching_sha2_password could not be loaded
升级sqlyog,或者使用Navicat即可。

#下方命令用于关闭端口
firewall-cmd --remove-port=6379/tcp --permanent 

Mysql主从复制

原理

  1. 主库会生成一个 log dump 线程,负责将增删改操作写入 binlog ;
  2. 从库生成两个线程,一个 I/O 线程,一个 SQL 线程;
  3. I/O 线程去请求主库的 binlog,并将得到的 binlog 日志写到 relay log(中继日志) 文件中;
  4. SQL 线程会读取 relay log 文件中的日志,并解析成具体操作由从库执行,来实现主从的操作一致,而最终数据一致;

常见结构

一主多从

主节点负责写操作,从节点负责读操作

双主复制

任何一方所做的变更,都会通过复制应用到另外一方的数据库中。

级联复制

因为如果主节点有太多的从节点,就会损耗一部分性能用于 replication ,那么我们可以让 3~5 个从节点连接主节点,其它从节点作为二级或者三级与从节点连接,这样不仅可以缓解主节点的压力,并且对数据一致性没有负面影响。

主从复制构建

部署流程

1、在机器上先完成MySQL单机部署,下述操作以一主一从为例

2、 主库配置编辑:vim /etc/my.cnf

properties
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1 
server-id=1 

#是否只读,1 代表只读, 0 代表读写 
read-only=0 

 # 启用二进制日志,路径中不要有中文和空格
log-bin=master-bin

# 可选,出错日志。出错之后可查看
# log-error=/opt/log

# 设置不要复制的数据库
# binlog-ignore-db=mysql

# 设置需要复制的数据库
# binlog-do-db=mydb2

# 设置logbin格式,默认就是statement,row/mixed(5.8以上支持)  
# statement: 此格式,日志记录的是主机数据库的写指令   默认  性能 高,但是now()之类的获取系统参数的操# 作会出现主从数据不同步的问题
# row: 此格式,日志记录的是主机数据库的写后的数据  批量操作时性能较差  解决now()或者  user()或者  #@@hostname 等操作获取系统参数时 由于延迟导致  主从获取的参数值不同步出现的问题
# mixed: 会按照statement保存写操作,但是now()等获取系统参数的操作会自动转为参数值保存 5.8 以后支持

# binlog_format=STATEMENT

3、主库创建用户

shell
# 启动MySQL
systemctl restart mysqld

# 创建新的用户和密码,%表示可以远程链接
CREATE USER 'remote'@'%' IDENTIFIED BY 'fujianz123';

#为 'master'@'%' 用户分配主从复制权限 
GRANT REPLICATION SLAVE ON *.* TO 'remote'@'%';

FLUSH PRIVILEGES;

4、查看主库二进制文件

sql
# mysql 8.4版本前使用这条命令查看
show master status;

# MySQL 8.4版本后使用这条命令查看
SHOW BINARY LOG STATUS;
  • file : 从哪个日志文件开始推送日志文件
  • position : 从哪个位置开始推送日志
  • binlog_ignore_db : 指定不需要同步的数据库

5、修改从库配置:vim /etc/my.cnf

properties
#mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,和主库不一样即可 
server-id=2 
#是否只读,1 代表只读, 0 代表读写
read-only=1

6、建立主从关系

  • SOURCE_HOST:主库的ip地址。
  • SOURCE_USER:主库创建的用户名。
  • SOURCE_PASSWORD:主库创建的用户名密码。
  • SOURCE_LOG_FILE:主库binlog文件的位置。
  • SOURCE_LOG_POS:主库binlog文件中的偏移量。
sql
# 重启MySQL
systemctl restart mysqld

# MSQL 8.23前
CHANGE MASTER TO MASTER_HOST='192.168.6.133', MASTER_USER='remote', MASTER_PASSWORD='fujianz123', MASTER_LOG_FILE='binlog.000003', MASTER_LOG_POS=158;

# MSQL 8.23后
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.6.133', SOURCE_USER='remote', SOURCE_PASSWORD='fujianz123', SOURCE_LOG_FILE='binlog.000003', SOURCE_LOG_POS=158;

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.6.136', SOURCE_USER='remote', SOURCE_PASSWORD='fujianz123', SOURCE_LOG_FILE='binlog.000004', SOURCE_LOG_POS=158,GET_SOURCE_PUBLIC_KEY=1;

7、开启同步

sql
# 开启同步
start replica ; #8.0.22之后 
start slave ; #8.0.22之前

# 查看状态,\G表示行转列,便于查看
show replica status\G ; #8.0.22之后 
show slave status\G ; #8.0.22之前

部署问题

相同UUID

使用虚拟机直接拷贝,就会出现相同的UUID,vim /var/lib/mysql/auto.cnf,将MySQL的UUID修改,即可避免主从机器有相同的UUID

Replica_IO_Running: Connecting

Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

sql
# mysql 8.4.0前
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.6.136', SOURCE_USER='remote', SOURCE_PASSWORD='fujianz123', SOURCE_LOG_FILE='binlog.000004', SOURCE_LOG_POS=158,get_master_public_key=1;

# mysql 8.4.0后
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.6.136', SOURCE_USER='remote', SOURCE_PASSWORD='fujianz123', SOURCE_LOG_FILE='binlog.000004', SOURCE_LOG_POS=158,GET_SOURCE_PUBLIC_KEY=1;

数据分片

使用中间件或者在代码端完成,参考Shardingsphere