一、下载软件程序

[root@db01 ~]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz
[root@db01 ~]# 
[root@db01 ~]# tar xf mysql-8.0.36-linux-glibc2.12-x86_64.tar.xz -C /usr/local/ 

二、配置环境变量(PATH)

[root@db01 ~]# ln -s /usr/local/mysql-8.0.36-linux-glibc2.12-x86_64 /usr/local/mysql 
[root@db01 ~]# cat /etc/profile 
...
export PATH="/usr/local/mysql/bin:$PATH"
...
[root@db01 ~]# source /etc/profile

三、数据库系统环境准备 (麒麟系统)

# 创建数据库的存储目录(空目录)
[root@db01 ~]# mkdir -p /data/3306/data  
# 创建数据库的管理用户
[root@db01 ~]# useradd mysql -M -s /sbin/nologin
[root@db01 ~]# chown mysql.mysql /data/3306/data

四、进行数据库服务初始化(创建数据库服务运行启动时运行加载的数据)

# 安装依赖
[root@db01 ~]# yum install libaio -y 

# 不安全初始化数据库服务(不会产生临时密码 可以免密登录)
[root@db01 ~]# mysqld --initialize-insecure  --datadir=/data/3306/data  --basedir=/usr/local/mysql/  --user=mysql
# 安全初始化数据库服务(会产生临时密码)
[root@db01 ~]# mysqld --initialize  --datadir=/data/3306/data  --basedir=/usr/local/mysql/  --user=mysql


参数解释:

1. libaio
1. 什么是 libaio?
  • lib: Library(库)的缩写。

  • aio: Asynchronous I/O(异步输入/输出)的缩写。

所以,libaio 就是 Linux 内核原生的异步I/O库。它允许一个进程(比如 MySQL)发起 I/O 操作(例如,从磁盘读取数据或向磁盘写入数据)后,不必等待操作完成,就可以立即返回并继续执行其他任务。当 I/O 操作真正完成后,内核会通知该进程。

为了更好地理解,我们来看一下同步I/O和异步I/O的区别:

  • 同步 I/O (Synchronous I/O):就像你去咖啡店点单,你必须在柜台前一直站着等待,直到咖啡师做好咖啡交给你,你才能离开去做别的事情。在程序中,就是一个线程发起读/写请求后,它会被“阻塞”(block),直到数据被完全读/写,它才能继续执行下面的代码。

  • 异步 I/O (Asynchronous I/O):就像你去一家高级餐厅点单,服务员给你一个电子蜂鸣器。你可以回到座位上玩手机、聊天,完全不用管厨房里的事。当你的菜准备好时,蜂鸣器会响,你再去取餐即可。在程序中,一个线程发起读/写请求后,请求被立即提交给内核,该线程可以马上回去处理其他任务(比如响应另一个用户的查询)。当内核完成了磁盘读/写后,会通过某种机制(如回调函数)通知该线程“你的数据准备好了”。

2. 为什么 MySQL 需要 libaio?

数据库是典型的 I/O 密集型应用。它需要不断地从磁盘读取数据页到内存(Buffer Pool),并将修改过的“脏页”和日志写入磁盘。

性能是关键!

如果 MySQL 使用同步I/O,那么每当一个工作线程需要读写磁盘时,它就会被阻塞。在一个高并发的系统中,成百上千的连接都在请求数据,如果大量线程都因为等待磁盘而阻塞,那么整个数据库的吞吐量将急剧下降,响应会变得非常慢。

而使用 libaio 带来的异步 I/O 有以下巨大优势:

  1. 高并发处理能力:工作线程可以将 I/O 请求“外包”给内核,然后立即去服务下一个客户端请求,极大地提高了 CPU 的利用率和数据库的并发处理能力。

  2. 减少线程上下文切换:避免了为每个 I/O 请求都创建一个新的辅助线程,减少了系统开销。

  3. 批量提交:可以将多个 I/O 请求合并在一起,一次性提交给内核,进一步优化磁盘性能。

MySQL 的默认存储引擎 InnoDB 在设计时就深度集成了对原生异步 I/O 的支持,通过参数 innodb_use_native_aio (在现代版本中默认开启) 来控制。

3. 为什么在 mysqld --initialize 时就需要?

mysqld --initialize 这个命令的作用是创建数据库的“毛坯房”。它需要执行以下关键的 I/O 操作:

  • 创建数据目录结构。

  • 创建系统表空间文件(如 ibdata1)。

  • 创建 Redo Log 文件(如 ib_logfile0, ib_logfile1)。

  • 创建数据字典和系统表。

  • ...等等

所有这些创建文件的过程,本质上都是写磁盘的操作。mysqld 程序在执行这些初始化任务时,使用的就是它运行时所依赖的 I/O 子系统。既然 InnoDB 引擎依赖 libaio 来进行 I/O, 那么在创建这些底层文件时,自然也需要调用 libaio 提供的接口。

如果你不安装 libaio,会发生什么?

当你尝试运行 mysqld --initialize 时,操作系统会尝试加载 mysqld 这个可执行文件及其所有动态链接的共享库。mysqld 会依赖 libaio.so.1 这个文件。如果系统里找不到它,你会立即看到一个类似这样的错误,程序根本无法启动:

codeCode

mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
2. --initialize-insecure

这是整个命令中最关键的参数,它包含了两个动作:initialize 和 insecure。

  • --initialize (初始化)

    • 这个动作会在 --datadir 指定的目录下创建 MySQL 运行所需的一切基础结构。

    • 这包括:系统数据库(如 mysql, performance_schema, sys),这些库里存放着用户信息、权限、配置等元数据。

    • 还会创建必要的日志文件(如 redo log, undo log)。

    • 简而言之,它把一个空目录变成了一个可以启动的 MySQL 数据库的“家”。

  • -insecure (不安全的)

    • 在初始化过程中,MySQL 需要创建一个超级管理员账户 root@'localhost'。

    • --initialize-insecure 的方式是:为 root@'localhost' 用户创建一个空密码

    • 与之相对的是安全的方式:--initialize。如果只使用 --initialize,MySQL 会为 root 用户生成一个随机的、复杂的临时密码,并将其输出到错误日志中。

    • 为什么用 -insecure? 通常在自动化部署脚本或测试环境中为了方便,省去了去日志里找随机密码的步骤。但在生产环境中,这被认为是不安全的,因为初始化完成后,数据库存在一个短暂的无密码 root 登录窗口。

3. --datadir=/data/3306/data
  • --datadir: 指定数据目录 (Data Directory) 的路径。

  • 作用: 这是 MySQL 数据库存放所有“数据”的地方。你创建的所有数据库、表、索引、日志文件等,都会被存储在这个目录下。

  • /data/3306/data: 这是一个自定义的路径。

    • data: 表明这是数据存放区。

    • 3306: 常常用来标识 MySQL 实例的端口号,这暗示了这台服务器上可能运行了多个 MySQL 实例,用不同的目录和端口来区分。

    • 默认的数据目录通常是 /var/lib/mysql。使用自定义目录是运维中的常见做法,便于管理和备份。

4. --basedir=/usr/local/mysql/
  • --basedir: 指定 MySQL 的安装目录 (Base Directory)

  • 作用: 这个目录下存放的是 MySQL 的程序文件,比如 mysqld(服务器)、mysql(客户端)、mysqladmin(管理工具)等可执行文件,以及库文件、头文件、帮助文档等。

  • /usr/local/mysql/: 这是一个典型的源码编译安装或二进制包解压安装的路径。通过包管理器(如 yum 或 apt-get)安装的 MySQL,其 basedir 通常在 /usr/。

5. --user=mysql
  • --user: 指定运行 mysqld 进程以及拥有数据目录文件的操作系统用户

  • 作用: 这是非常重要的一个安全设置。让 MySQL 以一个权限受限的普通用户(通常就叫 mysql)来运行,而不是以系统 root 用户运行。

  • 为什么? 万一 MySQL 程序出现安全漏洞被攻击者利用,攻击者获得的也仅仅是 mysql 这个用户的权限,无法对整个操作系统造成毁灭性破坏。如果用 root 运行,整个服务器就都暴露在风险之下了。

  • 前提条件: 在执行此命令之前,你必须已经在操作系统中创建了名为 mysql 的用户,并且确保 /data/3306/data 这个目录的父目录(/data/3306)是存在且可写的,或者整个路径的权限都已正确设置,允许 mysql 用户在其中创建和写入文件。

五、编写生成数据库服务配置文件

[root@db01 ~]# cat /etc/my.cnf
[mysql]
socket=/tmp/mysql.sock
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
[root@db01 ~]# 

参数解释:

  1. 服务器 (mysqld)
    • 必须以 mysql 用户身份运行。

    • 它的程序安装在 /usr/local/mysql。

    • 它的所有数据都存储在 /data/3306/data。

    • 它会创建一个位于 /tmp/mysql.sock 的 socket 文件,用于本地连接。

  2. 客户端 (mysql)
    • 当连接本地数据库时,会去 /tmp/mysql.sock 找这个 socket 文件进行通信。

六、启动数据库服务程序 

# 利用脚本文件启动数据库服务
[root@db01 ~]# ll /usr/local/mysql/support-files/mysql.server
-rwxr-xr-x 1 7161 31415 10576 Dec 13  2023 /usr/local/mysql/support-files/mysql.server
[root@db01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@db01 ~]# 
[root@db01 ~]# /etc/init.d/mysqld start
Starting MySQL.Logging to '/data/3306/data/db01.err'.
 SUCCESS! 
[root@db01 ~]# ps -ef|grep mysql
root       1571      1  0 09:59 pts/0    00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/3306/data --pid-file=/data/3306/data/db01.pid
mysql      1710   1571  8 09:59 pts/0    00:00:01 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=db01.err --pid-file=/data/3306/data/db01.pid --socket=/tmp/mysql.sock
root       1757   1380  0 09:59 pts/0    00:00:00 grep --color=auto mysql
[root@db01 ~]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.36 MySQL Community Server - GPL

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 


 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐