Linux 环境下安装 MySQL 8.0.34 二进制 详细教程 附docker+k8s启动

文章目录


Linux 环境下安装 MySQL 8.0(二进制)详细教程

在生产环境或部分场景下,我们通常不会直接使用 yumapt 安装 MySQL,而是通过官方提供的二进制 tar 包进行安装。本文以 CentOS 7.x 为例,详细记录 MySQL 8.0.34 的安装步骤及配置方法。


准备工作

安装依赖包

MySQL 运行需要依赖一些系统库,因此需要提前安装:

bash 复制代码
yum -y install tar            # 安装 tar 解压工具
yum -y install libaio         # 异步 I/O 库
yum -y install numactl        # NUMA 支持库

下载并解压 MySQL

下载 MySQL 二进制包

可以到 MySQL 官方下载页面 获取相应的版本。本文以 mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz 为例。

解压 MySQL

bash 复制代码
tar xf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz

移动目录并创建 MySQL 用户

创建 MySQL 专用的用户和用户组:

bash 复制代码
groupadd mysql
useradd -g mysql mysql

将解压后的文件移动至 /usr/local/mysql

bash 复制代码
mkdir -p /usr/local/mysql
mv mysql-8.0.34-linux-glibc2.12-x86_64/* /usr/local/mysql/

配置 MySQL

配置数据目录与日志目录

创建 MySQL 数据和日志存储目录,并授权给 mysql 用户:

bash 复制代码
mkdir -p /data/app/mysql/
chown -R mysql:mysql /data/app/mysql/

mkdir -p /usr/local/mysql/log
touch /usr/local/mysql/log/mysql_error.log
chown -R mysql:mysql /usr/local/mysql

编辑配置文件 /etc/my.cnf

根据实际需求编写配置文件,例如:

cnf 复制代码
[mysql]
# MySQL客户端默认字符集
default-character-set=utf8mb4
socket=/tmp/mysql.sock

[mysqld]
skip_ssl
skip_name_resolve

# 端口与时区
port=3306
default_time_zone='+08:00'

# 表名大小写(Linux默认区分大小写,若跨平台建议设置为1)
lower_case_table_names=1

# 二进制日志
log_bin=master-bin
server_id=10
binlog_format=ROW
sync_binlog=1
expire_logs_days=10
max_binlog_size=500M

# 目录
basedir=/usr/local/mysql
datadir=/data/app/mysql
socket=/tmp/mysql.sock

# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# 存储引擎
default_storage_engine=INNODB
max_allowed_packet=64M
key_buffer_size=32M

# InnoDB优化
innodb_buffer_pool_size=2G          # (2C4G改成1G,8C16G改成8G)
innodb_buffer_pool_instances=2
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1
innodb_flush_method=O_DIRECT
innodb_log_file_size=512M           # (2C4G可改256M,8C16G可改2G)
innodb_log_buffer_size=64M
innodb_lock_wait_timeout=50
innodb_io_capacity=2000
innodb_io_capacity_max=4000

# 慢查询日志
slow_query_log=1
slow_query_log_file=/usr/local/mysql/log/master.slow
long_query_time=2

# 错误日志
log_error=/usr/local/mysql/log/mysql_error.log

# SQL模式(MySQL8推荐严格模式)
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY

# GTID复制
gtid_mode=ON
enforce_gtid_consistency=TRUE
log_slave_updates=ON
binlog_checksum=NONE

# 连接与超时
max_connections=500                # (2C4G改200,8C16G可到2000)
max_connect_errors=1000
wait_timeout=120
interactive_timeout=120

# Performance Schema
performance_schema=ON

# 线程池(需要企业版/社区版Percona才支持,官方MySQL可忽略)
# thread_handling=pool-of-threads

初始化 MySQL 数据库

执行初始化操作,生成数据文件和 root 初始密码:

bash 复制代码
cd /usr/local/mysql/bin/
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/app/mysql

初始化完成后,可通过以下命令查看初始 root 密码:

bash 复制代码
cat ../log/mysql_error.log

日志中会出现类似以下内容:

复制代码
A temporary password is generated for root@localhost: y_U(lb-D/3Lj

请记下该密码,用于首次登录。


配置启动脚本与环境变量

配置系统启动脚本

复制官方提供的启动脚本并赋予执行权限:

bash 复制代码
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld

如有需要,可编辑 /etc/rc.d/init.d/mysqld 中的 basedirdatadir

配置环境变量

为了方便直接使用 mysql 命令,将 MySQL 的 bin 目录加入系统 PATH:

bash 复制代码
echo 'export PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
source /etc/profile

启动 MySQL 服务

检查 MySQL 状态并启动服务:

bash 复制代码
/etc/rc.d/init.d/mysqld status
/etc/rc.d/init.d/mysqld start

登录 MySQL 并修改 root 密码

使用初始化密码登录

bash 复制代码
mysql -u root -p'y_U(lb-D/3Lj'

注意:如果出现 libtinfo.so.5 缺失,可通过以下方法解决:

bash 复制代码
[root@test ~]# mysql -uroot -p
mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
[root@test ~]# find / -name libtinfo.so*
/usr/lib64/libtinfo.so.6
/usr/lib64/libtinfo.so.6.2
[root@test ~]# ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5
[root@test ~]# 
bash 复制代码
find / -name libtinfo.so*
ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5

修改 root 用户密码

进入 MySQL 后执行以下语句:

sql 复制代码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123.com';
FLUSH PRIVILEGES;

允许远程访问(可选)

如果需要远程登录,可将 root 用户的 host 设置为 %

sql 复制代码
USE mysql;
UPDATE user SET host='%' WHERE user='root';
FLUSH PRIVILEGES;

测试远程连接

bash 复制代码
mysql -u root -p'123.com' -h <server_ip> -P3306

如果连接正常,说明 MySQL 已安装并配置成功。


总结

以上就是在 Linux 下通过 tar 包安装 MySQL 8.0 的完整步骤。总结下关键点:

  • 选择二进制包安装的原因:可控性更强、版本灵活、适合生产环境定制化需求。
  • 注意初始化密码:安装后第一次必须使用日志中的临时密码。
  • 安全建议:不要直接暴露 root 用户远程访问,建议新建具有相应权限的业务账户。

docker-compose.yml

注: 官方镜像

yml 复制代码
version: '3.8'

services:
  mysql:
    image: mysql:8.0.34
    container_name: mysql-test
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "123.com"  # 初始化 root 密码(需要 Dockerfile 中支持此变量)
    ports:
      - "3307:3306"                  # 宿主机端口映射
    volumes:
      - ./data:/var/lib/mysql        # 数据持久化到当前目录
      - ./my.cnf:/etc/my.cnf         # 自定义 my.cnf(可选)
    networks:
      - mysql-net

networks:
  mysql-net:
    driver: bridge

my.cnf

cnf 复制代码
[mysqld]
# 基本配置
user=mysql
port=3306
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock

# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

# 日志相关
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=2

# 缓存大小示例
innodb_buffer_pool_size=256M

# 其他根据需求定制

k8s

configmap

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-config
  namespace: test
data:
  my.cnf: |
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    slow_query_log=1
    slow_query_log_file=/var/lib/mysql/mysql-slow.log
    long_query_time=2
    log-error=/var/lib/mysql/mysql-error.log
    max_connections=1000
    max_connect_errors=1000
    wait_timeout=28800
    # 时区设置
    default_time_zone='+08:00'

deployment

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  namespace: test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: harbor-ioscar.cbf.com/hawk/mysql:8.0.34
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "123.com"
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
            - name: mysql-config
              mountPath: /etc/mysql/conf.d
              readOnly: true
      volumes:
        - name: mysql-data
          hostPath:
            path: /data/mysql/test
            type: DirectoryOrCreate
        - name: mysql-config
          configMap:
            name: mysql-config

svc

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: mysql
  namespace: test
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
      nodePort: 30505 # 可以换成自己的端口
  type: NodePort
相关推荐
果子⌂32 分钟前
Kubernetes 服务发布进阶
linux·运维·服务器·云原生·容器·kubernetes·云计算
望获linux1 小时前
【Linux基础知识系列】第六十三篇 - 文件编辑器基础:vim
linux·运维·服务器·网络·嵌入式硬件·操作系统·嵌入式软件
我命由我123451 小时前
PostgreSQL 保留关键字冲突问题:语法错误 在 “user“ 或附近的 LINE 1: CREATE TABLE user
数据库·后端·sql·mysql·postgresql·问题·数据库系统
末日汐1 小时前
Linux常见指令
linux·运维·服务器
!chen2 小时前
Linux dd命令 数据备份、转换与磁盘操作的终极工具
linux·数据库·tomcat
rzl022 小时前
SpringBoot6-10(黑马)
linux·前端·javascript
overFitBrain2 小时前
数据结构-4(常用排序算法、二分查找)
linux·数据结构·算法
Heliotrope_Sun3 小时前
MySQL常见命令
数据库·mysql
UsamaBinLaden3 小时前
在 Alpine Linux 中创建虚拟机时 Cgroup 挂在失败的现象
linux·容器·虚拟化·incus·lxd·alpine
CheungChunChiu3 小时前
深入理解 eMMC RPMB 与 OP-TEE 在 Linux 系统中的应用开发
android·linux·运维·服务器·op-tee