【Linux】MySQL部署

一、单机部署

1、下载安装包

MySQL官网选择一个版本下载:

在这里插入图片描述

Linux操作系统MySQL安装包分类:

  • RPM:RPM软件包是一种在Linux平台下的安装文件,通过安装命令可以很方便地安装与卸载。MySQL的RPM安装文件包分为两个:服务器和客户端,需要分别下载和安装或者下载整包,分别安装。
  • Generic Binaries: 二进制软件包,经过编译生成的二进制文件软件包。
  • 源码包:MySQL数据库的源代码,用户需要自己编译成二进制文件之后才能安装

官网下载比较慢,也可从镜像站下载

2、安装 mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

# 卸载系统中有旧版 MySQL 或 MariaDB
dnf remove mariadb-server mysql-server

# 创建用户
[root@localhost app]# useradd mysql 
[root@localhost app]# passwd mysql	

# 切换用户
[root@localhost app]# su mysql

# 解压缩(压缩包为提前下好上传至服务器)
[mysql@localhost app]$ tar -xf mysql-5.7.37-linux-glibc2.12-x86_64.tar.gz

# 创建文件夹
[mysql@localhost app]$ mv mysql-5.7.37-linux-glibc2.12-x86_64 mysql-5.7.37
[mysql@localhost mysql-5.7.37]$ cd mysql-5.7.37 && mkdir conf data log  run 

# 修改配置( 具体配置见下文3 )
[chasing@localhost mysql-5.7.37]$ vi conf/my.cnf

# 初始化
[mysql@localhost mysql-5.7.37]$ ./bin/mysqld --defaults-file=/app/mysql-5.7.37/conf/my.cnf --initialize --user=mysql --basedir=/app/mysql-5.7.37 --datadir=/app/mysql-5.7.37/data

# 打开日志查看初始化情况,顺利的话,在末尾有个临时密码
[mysql@localhost mysql-5.7.37]$ less log/error.log
A temporary password is generated for root@localhost: ,k,30eqVrp3J

# 启动
[mysql@localhost mysql-5.7.37]$ ./bin/mysqld_safe --defaults-file=/app/mysql-5.7.37/conf/my.cnf  &

# 打开日志查看启动情况
[mysql@localhost mysql-5.7.37]$ less log/error.log

# 查看mysql进程是否启动
[mysql@localhost mysql-5.7.37]$ ps -ef | grep mysql

# 创建软连接
[mysql@localhost mysql-5.7.37]$ ln -s /app/mysql-5.7.37/run/mysqld.sock /tmp/mysql.sock

# 登录
[mysql@localhost mysql-5.7.37]$ ./bin/mysql -uroot -p
Enter password:

# 重设密码
mysql> alter user 'root'@'localhost' identified by 'nsdsb@2000';
Query OK, 0 rows affected (0.03 sec)

# 退出
mysql> exit
Bye

3、my.cnf

MySQL支持加载多个配置文件,可以使用 !include!includedir 指令在主配置文件中引入其他配置文件。

MySQL 配置文件加载顺序:默认配置文件、命令行参数指定的配置文件、系统级配置文件、用户级配置文件以及 MySQL 服务器特定目录下的配置文件等。

如果在多个位置定义了相同的配置项,最后加载的配置项将会生效。

官方文档:Chapter 7 MySQL Server Administration

###########################################################################
## my.cnf for MySQL 8.0.x                                                  
## 本配置参考  https://imysql.com/my-cnf-wizard.html、https://www.cnblogs.com/shiji888/p/10950361.html...                         
## 注意:                                                                   
##   (1)本配置假设物理服务器内存为 16G,总表数量在300之内,中小型企业业务          
##   (2)请根据实际情况作调整部分参数                                          
##   (3)本人不对这些建议结果负相应责任 ,仅作参考                             
###########################################################################

###########################################################################
##客户端参数配置
###########################################################################
[client]

port	= 3306
socket	= /app/mysql-5.7.37/run/mysqld.sock

[mysql]
#prompt="\u@mysqldb \R:\m:\s [\d]> "
#关闭自动补全sql命令功能
no-auto-rehash

###########################################################################
##服务端参数配置
###########################################################################
[mysqld]
port	  = 3306
basedir   = /app/mysql-5.7.37
datadir	  = /app/mysql-5.7.37/data
socket	  = /app/mysql-5.7.37/run/mysqld.sock
log-error = /app/mysql-5.7.37/log/error.log
pid-file  = /app/mysql-5.7.37/run/mysqld.pid

# 支持IPv4和IPv6的TCP/IP的连接
bind-address = ::

# mysqld 程序在启动后将在给定 UNIX/Linux 账户下执行。mysqld 必须从 root 账户启动才能在启动后切换到另一个账户下执行。mysqld_safe 脚本将默认使用 user=mysql 选项来启动 mysqld 程序。
user = chasing

# 只能用IP地址检查客户端的登录,不用主机名(https://wenku.baidu.com/view/1141a1396f175f0e7cd184254b35eefdc8d315a5.html)
# 开启的话,登录客户端需要加上具体ip
# skip_name_resolve

#若你的MySQL数据库主要运行在境外,请务必根据实际情况调整本参数
default_time_zone = "+8:00"

#数据库默认字符集, 主流字符集支持一些特殊表情符号(特殊表情符占用4个字节)
character-set-server = utf8mb4

#数据库字符集对应一些排序等规则,注意要和character-set-server对应
collation-server = utf8mb4_general_ci

#设置client连接mysql时的字符集,防止乱码
init_connect='SET NAMES utf8mb4'

#是否对sql语句大小写敏感,1表示不敏感
lower_case_table_names = 1

# 执行sql的模式,规定了sql的安全等级, 暂时屏蔽,my.cnf文件中配置报错
#sql_mode = STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

#事务隔离级别,默认为可重复读,mysql默认可重复读级别(此级别下可能参数很多间隙锁,影响性能)
transaction_isolation = READ-COMMITTED

#TIMESTAMP如果没有显示声明NOT NULL,允许NULL值
explicit_defaults_for_timestamp = true

#它控制着mysqld进程能使用的最大文件描述(FD)符数量。
#需要注意的是这个变量的值并不一定是你设定的值,mysqld会在系统允许的情况下尽量获取更多的FD数量
open_files_limit    = 65535

#最大连接数
max_connections = 300

#最大错误连接数
max_connect_errors = 600

#在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中
#官方建议 back_log = 50 + (max_connections / 5),封顶数为65535,默认值= max_connections
back_log = 110

# The number of open tables for all threads
# For example, for 200 concurrent running connections, specify a table cache size of at least 200 * N, 
# where N is the maximum number of tables per join in any of the queries which you execute. 
table_open_cache = 600

# The number of table definitions that can be stored in the definition cache 
# MIN(400 + table_open_cache / 2, 2000)
table_definition_cache = 700

# 为了减少会话之间的争用,可以将opentables缓存划分为table_open_cache/table_open_cache_instances个小缓存
table_open_cache_instances = 64

# 每个线程的堆栈大小 如果线程堆栈太小,则会限制执行复杂SQL语句
thread_stack = 512K

# 禁止外部系统锁
external-locking = FALSE

#SQL数据包发送的大小,如果有BLOB对象建议修改成1G
max_allowed_packet = 128M

#order by 或group by 时用到
#建议先调整为4M,后期观察调整
sort_buffer_size = 4M

#inner left right join时用到
#建议先调整为4M,后期观察调整
join_buffer_size = 4M

# How many threads the server should cache for reuse.
# 如果您的服务器每秒达到数百个连接,则通常应将thread_cache_size设置得足够高,以便大多数新连接使用缓存线程
# default value = 8 + ( max_connections / 100) 上限为100
thread_cache_size = 20

#MySQL连接闲置超过一定时间后(单位:秒)将会被强行关闭
#MySQL默认的wait_timeout  值为8个小时, interactive_timeout参数需要同时配置才能生效
interactive_timeout = 1800
wait_timeout = 1800

#Metadata Lock最大时长(秒), 一般用于控制 alter操作的最大时长sine mysql5.6
#执行 DML操作时除了增加innodb事务锁外还增加Metadata Lock,其他alter(DDL)session将阻塞
lock_wait_timeout = 3600

#内部内存临时表的最大值。
#比如大数据量的group by ,order by时可能用到临时表,
#超过了这个值将写入磁盘,系统IO压力增大
tmp_table_size = 64M
max_heap_table_size = 64M

#--###########################-- 慢SQL日志记录 开始 --##########################################

#是否启用慢查询日志,1为启用,0为禁用  
slow_query_log = 1

#记录系统时区
log_timestamps = SYSTEM

#指定慢查询日志文件的路径和名字
slow_query_log_file = /app/mysql-5.7.37/log/slow.log

#慢查询执行的秒数,必须达到此值可被记录
long_query_time = 5

#将没有使用索引的语句记录到慢查询日志  
log_queries_not_using_indexes = 0

#设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间  
log_throttle_queries_not_using_indexes = 60

#对于查询扫描行数小于此参数的SQL,将不会记录到慢查询日志中
min_examined_row_limit = 5000

#记录执行缓慢的管理SQL,如alter table,analyze table, check table, create index, drop index, optimize table, repair table等。  
log_slow_admin_statements = 0

#作为从库时生效, 从库复制中如何有慢sql也将被记录
#对于ROW格式binlog,不管执行时间有没有超过阈值,都不会写入到从库的慢查询日志
log_slow_slave_statements = 1

#--###########################-- 慢SQL日志记录 结束 --##########################################

#--###########################-- Bin-Log设置 开始 --############################################

server-id = 110

#开启bin log 功能
log-bin=mysql-bin

# binlog 记录内容的方式
# STATEMENT, 基于语句的复制:在 Master 上执行的 SQL 语句,在 Slave 上执行同样的语句。MySQL 默 认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
# ROW, 基于行的复制:把改变的内容复制到 Slave,而不是把命令在 Slave 上执行一遍。从MySQL5.0 开始支持。
# MIXED, 混合类型的复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
binlog_format = ROW

#对于binlog_format = ROW模式时,FULL模式可以用于误操作后的flashBack。
#如果设置为MINIMAL,则会减少记录日志的内容,只记录受影响的列,但对于部分update无法flashBack
binlog_row_image = FULL

#bin log日志保存的天数
#如果 binlog_expire_logs_seconds 选项也存在则 expire_logs_days 选项无效
#mysql5用 expire_logs_days,mysql8用 binlog_expire_logs_seconds
#binlog_expire_logs_seconds = 1209600
expire_logs_days = 7

#master status and connection information输出到表mysql.slave_master_info中
master_info_repository = TABLE

#the slave's position in the relay logs输出到表mysql.slave_relay_log_info中
relay_log_info_repository = TABLE

#作为从库时生效, 想进行级联复制,则需要此参数
log_slave_updates

#作为从库时生效, 中继日志relay-log可以自我修复
relay_log_recovery = 1

#作为从库时生效, 主从复制时忽略的错误
#如果在备份过程中执行ddl操作,从机需要从主机的备份恢复时可能会异常,从而导致从机同步数据失败
#如果对数据完整性要求不是很严格,那么这个选项确实可以减轻维护的成本
slave_skip_errors = ddl_exist_errors

#####RedoLog日志 和 binlog日志的写磁盘频率设置 BEGIN ###################################
# RedoLog日志(用于增删改事务操作) +  binlog日志(用于归档,主从复制)
# 为什么会有两份日志呢? 
# 因为最开始MySQL没有 InnoDB 引擎,自带MyISAM引擎没有 crash-safe能力,binlog日志只用于归档
# InnoDB 引擎是另一个公司以插件形式引入MySQL的,采用RedoLog日志来实现 crash-safe 能力

# redo log 的写入(即事务操作)拆成两阶段提交(2PC):prepare阶段 和 commit阶段
#(事务步骤1) 执行commit命令,InnoDB redo log 写盘,然后告知Mysql执行器:[你可以写binlog了,且一并提交事务],事务进入 prepare 状态
#(事务步骤2) 如果前面 prepare 成功,Mysql执行器生成 binlog 并且将binlog日志写盘
#(事务步骤3) 如果binlog写盘成功,Mysql执行器一并调用InnoDB引擎的提交事务接口,事务进入 commit 状态,操作完成,事务结束

#参数设置成 1,每次事务都直接持久化到磁盘
#参数设置成 0,mysqld进程的崩溃会导致上一秒钟所有事务数据的丢失。
#参数设置成 2,只有在操作系统崩溃或者系统掉电的情况下,上一秒钟所有事务数据才可能丢失。
#即便都设置为1,服务崩溃或者服务器主机crash,Mysql也可能丢失但最多一个事务

#控制 redolog 写磁盘频率 默认为1
innodb_flush_log_at_trx_commit = 1

#控制 binlog 写磁盘频率
sync_binlog = 1

#####RedoLog日志 和 binlog日志的写磁盘频率设置 END #####################################

#一般数据库中没什么大的事务,设成1~2M,默认32kb
binlog_cache_size = 4M

#binlog 能够使用的最大cache 内存大小
max_binlog_cache_size = 2G

#单个binlog 文件大小 默认值是1GB
max_binlog_size = 1G

#开启GTID复制模式
gtid_mode = on

#强制gtid一致性,开启后对于create table ... select ...或 CREATE TEMPORARY TABLE 将不被支持
enforce_gtid_consistency = 1

#解决部分无主键表导致的从库复制延迟问题
#其基本思路是对于在一个ROWS EVENT中的所有前镜像收集起来,
#然后在一次扫描全表时,判断HASH中的每一条记录进行更新
#该参数已经被标注为过期参数
#slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'

# default value is CRC32
#binlog_checksum = 1

# default value is ON
#relay-log-purge = 1

#--###########################-- Bin-Log设置 结束 --##########################################

#--###########################-- 可能用到的MyISAM性能设置 开始 --#############################

#对MyISAM表起作用,但是内部的临时磁盘表是MyISAM表,也要使用该值。
#可以使用检查状态值 created_tmp_disk_tables 得知详情
key_buffer_size = 15M

#对MyISAM表起作用,但是内部的临时磁盘表是MyISAM表,也要使用该值,
#例如大表order by、缓存嵌套查询、大容量插入分区。
read_buffer_size = 8M

#对MyISAM表起作用 读取优化
read_rnd_buffer_size = 4M

#对MyISAM表起作用 插入优化
bulk_insert_buffer_size = 64M
#--###########################-- 可能用到的MyISAM性能设置 开始 --################################

#--###########################-- innodb性能设置 开始 --##########################################
# Defines the maximum number of threads permitted inside of InnoDB. 
# A value of 0 (the default) is interpreted as infinite concurrency (no limit)
innodb_thread_concurrency = 0

#一般设置物理存储的 60% ~ 70%
innodb_buffer_pool_size = 8G

#当缓冲池大小大于1GB时,将innodb_buffer_pool_instances设置为大于1的值,可以提高繁忙服务器的可伸缩性
innodb_buffer_pool_instances = 4

#默认启用。指定在MySQL服务器启动时,InnoDB缓冲池通过加载之前保存的相同页面自动预热。 通常与innodb_buffer_pool_dump_at_shutdown结合使用
innodb_buffer_pool_load_at_startup = 1

#默认启用。指定在MySQL服务器关闭时是否记录在InnoDB缓冲池中缓存的页面,以便在下次重新启动时缩短预热过程
innodb_buffer_pool_dump_at_shutdown = 1

# Defines the name, size, and attributes of InnoDB system tablespace data files
innodb_data_file_path = ibdata1:1G:autoextend

#InnoDB用于写入磁盘日志文件的缓冲区大小(以字节为单位)。默认值为16MB
innodb_log_buffer_size = 32M

#InnoDB日志文件组数量
innodb_log_files_in_group = 3

#InnoDB日志文件组中每一个文件的大小
innodb_log_file_size = 2G

#是否开启在线回收(收缩)undo log日志文件,支持动态设置,默认开启
innodb_undo_log_truncate = 1

#当超过这个阀值(默认是1G),会触发truncate回收(收缩)动作,truncate后空间缩小到10M
innodb_max_undo_log_size = 4G

#The path where InnoDB creates undo tablespaces
#没有配置则在数据文件目录下
innodb_undo_directory = /app/mysql-5.7.37/log/undolog

#用于设定创建的undo表空间的个数
#已经弃用了,只能手动添加undo表空间
#The innodb_undo_tablespaces variable is deprecated and is no longer configurable as of MySQL 8.0.14
#innodb_undo_tablespaces = 95

#提高刷新脏页数量和合并插入数量,改善磁盘I/O处理能力
#根据您的服务器IOPS能力适当调整
#一般配普通SSD盘的话,可以调整到 10000 - 20000
#配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000

#如果打开参数innodb_flush_sync, checkpoint时,flush操作将由page cleaner线程来完成,此时page cleaner会忽略io capacity的限制,进入激烈刷脏
innodb_flush_sync = 0
innodb_flush_neighbors = 0

#CPU多核处理能力设置,假设CPU是4颗8核的,设置如下
#读多,写少可以设成 2:6的比例
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50

#该参数针对unix、linux,window上直接注释该参数.默认值为 NULL
#O_DIRECT减少操作系统级别VFS的缓存和Innodb本身的buffer缓存之间的冲突
innodb_flush_method = O_DIRECT

innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32

#为了获取被锁定的资源最大等待时间,默认50秒,超过该时间会报如下错误:
# ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
innodb_lock_wait_timeout = 20

#默认OFF,如果事务因为加锁超时,会回滚上一条语句执行的操作。如果设置ON,则整个事务都会回滚
innodb_rollback_on_timeout = 1

#强所有发生的死锁错误信息记录到 error.log中,之前通过命令行只能查看最近一次死锁信息
innodb_print_all_deadlocks = 1

#在创建InnoDB索引时用于指定对数据排序的排序缓冲区的大小
innodb_sort_buffer_size = 67108864

#控制着在向有auto_increment 列的表插入数据时,相关锁的行为,默认为2
#0:traditonal (每次都会产生表锁)
#1:consecutive (mysql的默认模式,会产生一个轻量锁,simple insert会获得批量的锁,保证连续插入)
#2:interleaved (不会锁表,来一个处理一个,并发最高)
innodb_autoinc_lock_mode = 1

#表示每个表都有自已独立的表空间
innodb_file_per_table = 1

#指定Online DDL执行期间产生临时日志文件的最大大小,单位字节,默认大小为128MB。
#日志文件记录的是表在DDL期间的数据插入、更新和删除信息(DML操作),一旦日志文件超过该参数指定值时,
#DDL执行就会失败并回滚所有未提交的当前DML操作,所以,当执行DDL期间有大量DML操作时可以提高该参数值,
#但同时也会增加DDL执行完成时应用日志时锁定表的时间
innodb_online_alter_log_max_size = 4G

#--###########################-- innodb性能设置 结束 --##########################################

[mysqldump]
quick
max_allowed_packet = 128M

免密登录

配置文件 my.cnf 中找到[mysqld]部分,添加skip-grant-tables指令。

这个指令告诉MySQL服务器跳过权限表的验证,允许任何用户以任何密码登录。

4、创建用户并导入数据库数据:

# 数据库导入脚本
[mysql@localhost mysql-5.7.37]$ ls sql
admin.sql  local.sql  test.sql

# 登录
[chasing@localhost mysql-5.7.37]$ ./bin/mysql -uroot -p --socket=/app/mysql-5.7.37/run/mysqld.sock
Enter password:

# 创建用户 zhangsan
mysql> CREATE USER 'zhangsan'@'%' IDENTIFIED BY 'nsdsb@2001';
mysql> GRANT ALL ON *.* TO 'zhangsan'@'%'; 
mysql> show grants for 'zhangsan'@'%';

# 删除权限
# REVOKE ALL ON ecsb_pre_admin.* FROM 'zhangsan'@'%';

# 强制刷新
mysql> flush privileges;

# 执行脚本来创建数据库并导入数据
mysql> CREATE DATABASE db_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
mysql> use db_admin;
mysql> source /app/mysql-5.7.37/sql/admin.sql;

# 若数据库已存在,可在外部执行命令:
#./mysql –uroot –p –D db-local ../local.sql

5、开机自启

cat > /etc/systemd/system/mysqld.service <<EOF
[Unit]
Description=MySQL Server
After=syslog.target network.target

[Service]
Type=forking
User=mysql
Group=mysql
PIDFile=/app/mysql-5.7.37/mysql.pid
ExecStart=/app/mysql-5.7.37/bin/mysqld
ExecReload=/app/mysql-5.7.37/bin/mysqladmin --socket=/app/mysql-5.7.37/run/mysql.sock reload
ExecStop=/app/mysql-5.7.37/bin/mysqld --user=mysql --basedir=/app/mysql-5.7.37 --datadir=/app/mysql-5.7.37/data/ --remove
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

6、rpm-bundle.tar

mysql-8.4.4-1.el9.aarch64.rpm-bundle.tar 包内容:

mysql-community-client-8.4.4-1.el9.aarch64.rpm
mysql-community-client-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-client-plugins-8.4.4-1.el9.aarch64.rpm
mysql-community-client-plugins-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-common-8.4.4-1.el9.aarch64.rpm
mysql-community-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-debugsource-8.4.4-1.el9.aarch64.rpm
mysql-community-devel-8.4.4-1.el9.aarch64.rpm
mysql-community-icu-data-files-8.4.4-1.el9.aarch64.rpm
mysql-community-libs-8.4.4-1.el9.aarch64.rpm
mysql-community-libs-compat-8.4.4-1.el9.aarch64.rpm
mysql-community-libs-compat-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-libs-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-server-8.4.4-1.el9.aarch64.rpm
mysql-community-server-debug-8.4.4-1.el9.aarch64.rpm
mysql-community-server-debug-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-server-debuginfo-8.4.4-1.el9.aarch64.rpm
mysql-community-test-8.4.4-1.el9.aarch64.rpm
mysql-community-test-debuginfo-8.4.4-1.el9.aarch64.rpm

核心功能包

RPM 包名称作用
mysql-community-server-8.4.4-1.el9.aarch64.rpmMySQL 服务端主程序,包含 mysqld 服务、初始化脚本、配置文件 (/etc/my.cnf)、Systemd 服务文件等。
mysql-community-client-8.4.4-1.el9.aarch64.rpmMySQL 客户端工具,包括 mysql、mysqldump、mysqladmin 等命令行工具。
mysql-community-common-8.4.4-1.el9.aarch64.rpm公共文件,如配置文件模板、系统账户设置(创建 mysql 用户和组)、基础依赖文件。
mysql-community-libs-8.4.4-1.el9.aarch64.rpmMySQL 客户端共享库(如 libmysqlclient.so),供其他应用程序链接使用。
mysql-community-libs-compat-8.4.4-1.el9.aarch64.rpm兼容旧版本 MySQL 客户端库(例如支持老版本的 libmysqlclient.so.18)。
mysql-community-client-plugins-8.4.4-1.el9.aarch64.rpm客户端插件(如 caching_sha2_password 认证插件、mysql_clear_password 等)。
mysql-community-icu-data-files-8.4.4-1.el9.aarch64.rpmICU(Unicode 国际化组件)数据文件,用于支持字符集、排序规则等国际化功能。

开发与扩展包

RPM 包名称作用
mysql-community-devel-8.4.4-1.el9.aarch64.rpm开发头文件(.h)和静态库(.a),用于编译基于 MySQL 的应用程序(如 C/C++ 程序链接 MySQL)。
mysql-community-test-8.4.4-1.el9.aarch64.rpmMySQL 测试套件,包含官方测试工具和用例(仅用于开发和调试,生产环境无需安装)。

调试与诊断包

RPM 包名称作用
mysql-community-debuginfo-8.4.4-1.el9.aarch64.rpm主程序的调试符号文件(用于 gdb 调试崩溃或性能分析)。
mysql-community-debugsource-8.4.4-1.el9.aarch64.rpm调试源码包(配合 debuginfo 使用,用于源码级调试)。
mysql-community-server-debug-8.4.4-1.el9.aarch64.rpm带调试支持的 MySQL 服务端版本(性能较低,仅用于开发调试)。
mysql-community-server-debuginfo-8.4.4-1.el9.aarch64.rpm服务端调试符号文件。
mysql-community-client-debuginfo-8.4.4-1.el9.aarch64.rpm客户端调试符号文件。
mysql-community-client-plugins-debuginfo-8.4.4-1.el9.aarch64.rpm客户端插件调试符号文件。
mysql-community-libs-debuginfo-8.4.4-1.el9.aarch64.rpm库文件调试符号文件。
mysql-community-libs-compat-debuginfo-8.4.4-1.el9.aarch64.rpm兼容库调试符号文件。
mysql-community-test-debuginfo-8.4.4-1.el9.aarch64.rpm测试套件调试符号文件。

依赖关系说明

  • 必须安装的包:
    mysql-community-common
    mysql-community-client-plugins
    mysql-community-client
    mysql-community-icu-data-files
    mysql-community-libs
    mysql-community-server
    
  • 可选安装的包:
    mysql-community-devel(开发需要)
    mysql-community-test(测试需要)
    mysql-community-libs-compat(兼容旧应用)
    
  • 调试包:仅在需要分析崩溃或性能问题时安装。

典型安装场景

  • 最小化生产环境安装
    sudo rpm -ivh mysql-community-common-*.rpm \
                 mysql-community-client-plugins-*.rpm \
                 mysql-community-libs-*.rpm \
                 mysql-community-client-*.rpm \
                 mysql-community-icu-data-files-*.rpm \
                 mysql-community-server-*.rpm
    
  • 开发环境安装(含头文件和测试工具)
    sudo dnf install mysql-community-{common,client-plugins,libs,client,icu-data-files,server,devel,test}
    
  • 调试环境安装
    sudo dnf install mysql-community-server-debuginfo mysql-community-client-debuginfo
    

注意事项

  • 版本一致性:所有包需保持相同版本(如 8.4.4-1.el9),否则会引发依赖冲突。
  • 架构匹配:确认系统为 aarch64(ARM 架构),非 x86_64。
  • 调试包占用空间:debuginfo 和 debugsource 包体积较大,生产环境建议不安装。

7、安装 mysql-community-server-8.4.4-1.el9.aarch64.rpm

#!/bin/bash
# 安装依赖
dnf install -y perl libtirpc net-tools

# 导入MySQL RPM包公钥
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

# 解压
tar -xvf mysql-8.4.4-1.el9.aarch64.rpm-bundle.tar -C /app/mysql-8.4.4

cd /app/mysql-8.4.4

# 根据实际需求安装对应的服务,这里做最小化安装:
VERSION=8.4.4-1.el9.x86_64
rpm -ivh mysql-community-common-$VERSION.rpm \
         mysql-community-client-plugins-$VERSION.rpm \
	     mysql-community-libs-$VERSION.rpm \
	     mysql-community-icu-data-files-$VERSION.rpm \
	     mysql-community-client-$VERSION.rpm \
	     mysql-community-server-$VERSION.rpm


# 启动mysql
systemctl start mysqld

# 设置允许开机自启动
systemctl enable mysqld

# 查看初始密码
grep 'temporary password' /var/log/mysqld.log

# 登陆MySQL客户端
mysql -u root -p

# 修改初始密码:密码必须为至8位数的大小写+数字+符号
mysql> alter user 'root'@'localhost' identified by '+Admin123';

# 若不想设置着吗复杂的密码,可修改密码策略与长度
mysql> set global validate_password_policy=LOW;
mysql> set global validate_password_length=4;

8、执行 rpm -ivh mysql-server.rpm,Linux 做了哪些事?

执行 rpm -ivh
       │
       ↓
依赖检查 → 失败 → 报错并退出
       │
       ↓
解压文件到系统路径
       │
       ↓
执行 %pre 脚本(创建用户、检查目录)
       │
       ↓
安装文件并记录到 RPM 数据库
       │
       ↓
执行 %post 脚本(初始化数据库、注册服务)
       │
       ↓
更新 RPM 数据库
       │
       ↓
显示成功消息
  • 依赖检查(Dependency Check)
    • 检查包依赖:RPM 会解析 mysql-community-server 包的元数据,验证其依赖是否已满足。包括:
      • 其他 RPM 包:例如 mysql-community-client、mysql-community-common、openssl、libaio 等。
      • 库文件:如 libssl.so、libcrypto.so 等。
    • 若依赖缺失:
      • 抛出错误(例如 error: Failed dependencies: …)。
      • 此时需手动安装缺失的依赖(如使用 dnf install )。
  • 文件解压与安装(File Extraction & Installation)
    • 解压文件:RPM 包内的文件会被解压到预定义的系统路径,包括:
      • 二进制文件:如 /usr/bin/mysqld、/usr/sbin/mysqld。
      • 配置文件:如 /etc/my.cnf、/etc/mysql/ 下的模板文件。
      • 数据目录:如 /var/lib/mysql(但首次初始化前可能为空)。
      • Systemd 服务文件:如 /usr/lib/systemd/system/mysqld.service。
      • 文档和手册:如 /usr/share/doc/mysql-community-server-*。
    • 记录文件到 RPM 数据库:所有安装的文件路径会被写入 /var/lib/rpm 数据库,用于后续查询或卸载。
  • 执行预安装脚本(Pre-Install Script)
    • 运行 %pre 脚本(如果包内定义了该脚本):
      • 常见操作:创建 mysql 用户和用户组,防止权限冲突。
      • 检查旧版本残留文件(如 /var/lib/mysql 是否已存在)。
  • 安装包内容(Core Installation)
    • 实际拷贝文件:将二进制文件、配置文件等写入目标路径。
    • 设置默认权限:例如:
      • /var/lib/mysql 目录可能被设置为 mysql:mysql 所有。
      • 配置文件 /etc/my.cnf 可能保留默认权限(root:root )。
  • 执行后安装脚本(Post-Install Script)
    • 运行 %post 脚本(关键步骤!):
      • 初始化数据目录:调用 mysqld --initialize 或 mysql_install_db(取决于 MySQL 版本),生成:
        • 系统表(如 mysql.user、mysql.db)。
        • 临时 root 密码(写入 /var/log/mysqld.log)。
      • 设置 Systemd 服务:
        • 注册服务:systemctl enable mysqld(部分 RPM 包会自动执行)。
      • 安全增强:可能调用 mysql_secure_installation 的简化版逻辑(非交互式)。
      • 创建 SELinux 策略(如果启用 SELinux):标记 MySQL 相关文件和进程的安全上下文。
  • 更新 RPM 数据库(Update RPM Database)
    • 记录包信息:将 mysql-community-server 的元数据(版本、依赖、安装时间等)写入 /var/lib/rpm 数据库。
    • 生成事务 ID:用于回滚或验证操作。
  • 输出结果(Final Output)
    • 显示进度条(因 -h 参数):########### [100%]
    • 打印成功消息:Verifying… ################################# [100%]
    • 错误处理:如果任何步骤失败,RPM 会回滚已执行的操作,保持系统一致性。

9、常见报错

1、Plugin caching_sha2_password could not be loaded: 找不到指定的模块。

Dbeaver 转储数据库时报错:

C:\Users\user\AppData\Roaming\DBeaverData\drivers\clients\mariadb\win\mariadb-dump.exe --skip-lock-tables --routines --add-drop-table --disable-keys --extended-insert -u demo --host=192.168.80.132 --port=3306 demo
2025-06-16 14:23:38.199 - Dump database into file:///D:/tmp/dump-demo-202506161423.sql
任务  'MySQL 转储' 开始于 Mon Jun 16 14:23:38 CST 2025
WARNING: option --ssl-verify-server-cert is disabled, because of an insecure passwordless login.

mariadb-dump.exe: Got error: 1045: "Plugin caching_sha2_password could not be loaded: 找不到指定的模块。 Library path is 'caching_sha2_password.dll'" when trying to connect

任务  'MySQL 转储' 结束于 Mon Jun 16 14:23:38 CST 2025
2025-06-16 14:23:38.403 - IO error: Process failed (exit code = 2). See error log.
2025-06-16 14:23:38.403 - java.io.IOException: Process failed (exit code = 2). See error log.
	at org.jkiss.dbeaver.tasks.nativetool.AbstractNativeToolHandler.validateErrorCode(AbstractNativeToolHandler.java:264)
	at org.jkiss.dbeaver.tasks.nativetool.AbstractNativeToolHandler.executeProcess(AbstractNativeToolHandler.java:242)
	at org.jkiss.dbeaver.tasks.nativetool.AbstractNativeToolHandler.doExecute(AbstractNativeToolHandler.java:285)
	at org.jkiss.dbeaver.ext.mysql.tasks.MySQLNativeToolHandler.doExecute(MySQLNativeToolHandler.java:47)
	at org.jkiss.dbeaver.tasks.nativetool.AbstractNativeToolHandler.lambda$0(AbstractNativeToolHandler.java:88)
	at org.jkiss.dbeaver.runtime.RunnableContextDelegate.lambda$0(RunnableContextDelegate.java:39)
	at org.eclipse.jface.operation.ModalContext$ModalContextThread.run(ModalContext.java:124)

这个错误是由于 MariaDB 客户端工具 mariadb-dump 无法加载 caching_sha2_password 认证插件导致的。

解决方案:

  • 方案一:修改用户认证方式(推荐):在 MySQL/MariaDB 服务器上执行以下 SQL 命令,将用户认证方式改为兼容的 mysql_native_password:

    ALTER USER 'your account'@'%' IDENTIFIED WITH mysql_native_password BY 'your password';
    FLUSH PRIVILEGES;
    
  • 方案二:在 DBeaver 中指定认证插件:打开 DBeaver 连接设置,转到 驱动属性 选项卡,添加/修改以下属性:

    authenticationPlugins: mysql_native_password
    useSSL: false  # 可选,如果未启用SSL
    
  • 方案三:命令行添加认证参数:在备份命令中加入 --default-auth=mysql_native_password 参数:

    mariadb-dump.exe --default-auth=mysql_native_password --skip-lock-tables ...其他参数...
    
  • 方案五:检查客户端插件文件(备用方案)

    • 确保 lib\plugin\caching_sha2_password.dll 存在于 MariaDB 安装目录
    • 或从官方安装包提取该文件到客户端目录:
      C:\Program Files\MariaDB\MariaDB Connector C\lib\plugin\
      
  • 方案六:切换客户端
    在这里插入图片描述

    MariaDB 是 MySQL 的兼容分支,两者使用相同的通信协议(如客户端/服务器协议、认证协议)。

    MariaDB 客户端工具(如 mariadb-dump)完全兼容 MySQL 服务器(5.5+ 版本),可直接操作 MySQL 数据库。

二、MySQL 主从复制

MySQL5.6 开始主从复制有两种方式:基于日志(binlog)、基于 GTID(全局事务标示符)。

这里,我们主要讲基于日志(binlog)的复制。

1、MySQL主从复制原理

MySQL主从复制原理,也称为A/B原理。

(1) Master 将数据改变记录到二进制日志(binary log)中,也就是配置文件 log-bin 指定的文件, 这些记录叫做二进制日志事件(binary log events);

(2) Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log);

(3) Slave 重做中继日志中的事件,把中继日志中的事件信息一条一条的在本地执行一次,完 成数据在本地的存储,从而实现将改变反映到它自己的数据(数据重放)。

在这里插入图片描述

2、主从配置注意事项

(1)主从服务器操作系统版本和位数一致;

(2) Master 和 Slave 数据库的版本要一致;

(3) Master 和 Slave 数据库中的数据要一致;

(4) Master 开启二进制日志,Master 和 Slave 的 server_id 在局域网内必须唯一;

3、主从配置的简要步骤

3.1 Master 上的配置

(1) 安装数据库;

(2) 修改数据库配置文件,指明 server_id,开启二进制日志(log-bin);

(3) 启动数据库,查看当前是哪个日志,position 号是多少;

(4) 登录数据库,授权数据复制用户(IP 地址为从机 IP 地址,如果是双向主从,这里的 还需要授权本机的 IP 地址,此时自己的 IP 地址就是从 IP 地址);

(5) 备份数据库(记得加锁和解锁);

(6) 传送备份数据到 Slave 上;

(7) 启动数据库;

以下步骤,为单向主从搭建成功,想搭建双向主从需要的步骤:

(1) 登录数据库,指定 Master 的地址、用户、密码等信息(此步仅双向主从时需要);

(2) 开启同步,查看状态;

3.2 Slave 上的配置

(1) 安装数据库;

(2) 修改数据库配置文件,指明 server_id(如果是搭建双向主从的话,也要开启二进制 日志 log-bin);

(3) 启动数据库,还原备份;

(4) 查看当前是哪个日志,position 号是多少(单向主从此步不需要,双向主从需要);

(5) 指定 Master 的地址、用户、密码等信息;

(6) 开启同步,查看状态。

4、单向主从环境搭建

注意:这里的数据库版本为9.2,不同版本的MySQL配置以及源配置等操作不太一致,建议对照官方文档 Chapter 19 Replication 食用。

  • 第一步,在主从服务器上安装MySQL( 参照上述单机部署即可,注意版本)
  • 第二步,设置主服务器的配置文件
    • master主节点服务的配置文件 my.cnf
      [mysqld]
      ## 同一局域网中需要唯一
      server_id=1
      ## 开启二进制日志功能
      log-bin=mysql-bin
      
    • slave 从节点服务的配置文件 my.cnf
      [mysqld]
      ## 设置server_id,同一局域网中需要唯一
      server_id=2
      ## 配置中继日志
      relay_log=relay-bin
      ## slave设置为只读(具有super权限的用户除外)
      read_only=1
      
  • 第三步,在主数据库上创建用于复制的用户
    mysql -u root -p										# 登陆数据库
    CREATE USER 'replicator'@'%' IDENTIFIED BY '123456';	# 创建用户
    GRANT REPLICATION SLAVE ON *.* To 'replicator'@'%';		# 授权复制权限	
    FLUSH PRIVILEGES;										# 刷新权限
    
  • 第四步,获取主数据库二进制日志坐标
    mysql> show binary log status \G
    *************************** 1. row ***************************
                 File: mysql-bin.000003
             Position: 713
         Binlog_Do_DB: 
     Binlog_Ignore_DB: 
    Executed_Gtid_Set: 
    1 row in set (0.00 sec)
    
  • 第五步,复制现有数据快照(这里暂不考虑现有数据)
  • 第六步,从数据库设置源配置,开启主从同步
    -- 源配置
    mysql> CHANGE REPLICATION SOURCE TO
        SOURCE_HOST='192.168.88.88',
        SOURCE_PORT=3307,
        SOURCE_USER='slave',
        SOURCE_PASSWORD='123456',
        SOURCE_LOG_FILE='mysql-bin.000003',
        SOURCE_LOG_POS=123,
        GET_SOURCE_PUBLIC_KEY=1;
    
    -- 开启主从同步
    mysql> start replica;
    
    -- 查看从数据库状态
    mysql> show replica status \G
    
  • 第七步,测试主从复制
    -- 在主库上新建数据库
    mysql> create database test;
    
    -- 在从库上可以看到新建的数据库 test
    mysql> show databases;
    

十、资料

### 安装和配置 MySQL 8 的过程 #### 准备工作 确保 Linux 系统已经更新到最新状态并安装必要的依赖项。 ```bash sudo apt-get update && sudo apt-get upgrade -y ``` #### 下载 MySQL 8.0 安装包 前往官方下载页面获取适用于当前系统的 MySQL 版本,通常会提供 `.tar.xz` 压缩文件作为通用二进制分发版本。对于特定版本号 `8.0.36` 可执行如下命令完成解压缩操作[^2]: ```bash wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz sudo tar xvJf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz ``` #### 移动与初始化数据目录 将解压后的文件夹移动至 `/usr/local/mysql` 路径下,并创建相应的软链接以便于管理;随后设置权限以及初始化数据库实例[^3]: ```bash sudo mv mysql-8.0.36-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/ sudo ln -s mysql mysql-current sudo chown -R root:mysql . /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql ``` 注意这里使用了 `--initialize-insecure` 参数来跳过初始密码设定环节,在生产环境中不建议这样做。 #### 启动 MySQL 服务 通过运行脚本来启动 MySQL 数据库服务器进程,这一步骤可以验证之前的操作是否成功[^1]: ```bash cd /usr/local/mysql/support-files/ sudo cp mysql.server /etc/init.d/mysql.server sudo chmod +x /etc/init.d/mysql.server sudo service mysql.server start ``` 此时应该能够正常访问本地主机上的 MySQL 实例,默认端口为 `3306`. #### 配置环境变量 (可选) 为了方便后续管理和维护,可以把 MySQL 执行程序路径加入全局 PATH 中去: ```bash echo 'export PATH=$PATH:/usr/local/mysql/bin' >> ~/.bashrc source ~/.bashrc ``` 这样就可以直接在终端输入 `mysql`, `mysqldump` 等指令而无需指定完整路径. #### 修改默认安全选项 首次登录之后应当立即更改 root 用户的密码并且按照提示增强安全性设置: ```sql ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; FLUSH PRIVILEGES; ``` 以上就是整个部署流程概述, 更多细节可以根据实际需求调整参数或功能模块.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值