为什么还要学数据库安装这么基础的知识?
首先,安装数据库是了解一个数据库的第一步。通过安装部署,你可以了解数据库的核心组件,数据库由哪些文件组成,服务是怎么启动和停止的。
其次,要深入掌握一门数据库技术,离不开大量的实践操作。你在文档或书籍上看到的知识,需要在真实的数据库环境中进行测试验证,这不仅能验证你看到的内容是否正确,也能加深你对相关知识的理解。所以你需要从零开始搭建数据库、创建用户、配置数据库、搭建数据库高可用环境,测试和验证数据库的各种功能。
最后,虽然云数据库已经将大量数据库运维管理的动作自动化了,但是背后还是需要有人去设计和运维云平台本身,而你将来可能就是云数据库背后的那个人。而且,在工作中,你可能需要解决不同环境下的各种千奇百怪的数据库问题。系统地掌握数据库从安装部署到运维管理整个环节,能帮你更好地应对各种环境下的复杂问题。
安装
MySQL 3种安装方式:
- 二进制安装
- RPM 包安装
- 源码编译安装
操作系统:CentOS 7.9
请记住,我们的目标并不仅仅是安装 MySQL,而是通过安装部署来深入理解 MySQL 的运行方式。
二进制安装
使用二进制包安装 MySQL 是比较常用的一种方式,主要分为六个步骤。
- 获取二进制安装包。
- 创建运行 MySQL 的用户。
- 规划数据目录,准备 my.cnf 参数文件。
- 初始化数据库。
- 启动数据库服务。
- 设置数据库初始密码。
第一步:获取二进制安装包
先到 MySQL 官网下载二进制安装包,选择 8.0 GA 最新版本,当前 8.0 最新 GA 版本是 8.0.39。
注:MySQL 一般 3 个月左右出一个新的小版本,你看到这里的时候,可能又出了新的版本,但基本上不影响文章后面的讨论。
使用二进制安装时,操作系统选择“Linux - Generic”,操作系统版本要根据系统的 glibc 版本来选择,我们可以使用一些方法来确定 glibc 的版本,比如通过 ldd 命令。
# ldd --version
ldd (GNU libc) 2.17
可以先用浏览器下载安装包,再上传到服务器,也可以直接在服务器上使用 wget、curl 等工具下载。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz
安装包下载完成后使用 md5sum 工具检查文件校验码是否和官网上提供的一致。
# md5sum mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz
1c092c3814b10bfa0794077867f9f4ad mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz
如果一切正常,解压二进制包,将解压后的文件夹放到一个安装目录下,这里我们将安装包放到 /opt 目录下,并创建一个软链接。
tar xvf mysql-8.0.39-linux-glibc2.17-x86_64.tar.xz
mv mysql-8.0.39-linux-glibc2.17-x86_64 /opt
ln -s /opt/mysql-8.0.39-linux-glibc2.17-x86_64 /opt/mysql80
到这里,MySQL 软件其实就已经安装好了。接下来,我们熟悉一下 MySQL 安装目录下都有哪些文件。
- bin 目录下包含 MySQL 的服务端和客户端,以及一些命令行工具。
- lib 目录中有 MySQL 客户端库,使用 C API 访问 MySQL 数据库时,需要用到这里面的库文件。lib 目录下还有一个 plugin 目录,存放着 MySQL 的各类插件,包括 CLONE 插件、半同步插件、组复制(MGR)插件。
- include 目录下是 C API 的头文件,编译访问 MySQL 的 C 代码时会用到这些文件。
- share 目录下有一些运行 MySQL 需要用到的文件,如不同语言的错误日志信息文件、字符集的定义文件。
下面表格对其中一些重要文件做了简单介绍。
第二步:创建运行 MySQL 的用户
出于安全考虑,我们需要创建一个单独的用户来运行 MySQL。
groupadd mysql
useradd mysql -g mysql
第三步:规划数据目录,准备 my.cnf 参数文件
我们需要规划一个数据目录,用来存放 MySQL 的数据文件,以及各类日志文件。如果你部署的 MySQL 将用于生产,那么我建议你使用满足一定性能要求的磁盘设备,如 SSD,以保障性能。这里提供一种我平时使用的目录规划方式。
mkdir -p /data/mysql3306/{data,log,binlog,relaylog,run,tmp}
# tree -d -L 2 /data
/data
|-- mysql3306
| |-- binlog
| |-- data
| |-- log
| |-- relaylog
| |-- run
| `-- tmp
|-- mysql3307
| |-- binlog
| |-- data
| |-- log
| |-- relaylog
| |-- run
| `-- tmp
其中 data 是挂载点,把文件系统挂载到 /data。每个实例的所有文件,都放在同一个顶层目录中,以 mysql{$PORT}
的方式命名。
- data 目录用来存放数据库的数据文件。
- binlog 和 relaylog 目录分别用来存放 binlog 和 relaylog。
- log 目录存放日志文件,包括错误日志、慢 SQL 日志。
- run 目录存放 pid 文件和 sock 文件。
- tmp 目录用来存放 MySQL 运行过程中可能会产生的临时文件。配置文件 my.cnf 存放到实例的顶层目录中。
在这个目录规划下,一个基本的配置文件如下:
## /data/mysql3306/my.cnf
[mysql]
socket=/data/mysql3306/run/mysql.sock
[mysqld]
port=3306
mysqlx_port=33060
basedir=/opt/mysql80
lc_messages_dir=/opt/mysql80/share
datadir=/data/mysql3306/data
tmpdir=/data/mysql3306/tmp
log-error=/data/mysql3306/log/alert.log
slow_query_log_file=/data/mysql3306/log/slow.log
general_log_file=/data/mysql3306/log/general.log
socket=/data/mysql3306/run/mysql.sock
innodb_data_file_path=ibdata1:128M:autoextend
innodb_buffer_pool_size=2G
第四步:初始化数据库
使用 mysqld 初始化数据库,第一个参数必须是 defaults-file,指向上一步准备好的 my.cnf 配置文件,第二个参数是 initialize,指示 mysqld 进行初始化操作。
/opt/mysql80/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --initialize
初始化可能需要一定的时间,完成后会在数据目录(datadir)下生成默认数据库和相关的系统表。
为什么MySQL需要初始化?
在数据库系统中,MySQL作为一种广泛使用的关系型数据库管理系统,具有强大的性能和灵活性。然而,在首次安装或配置MySQL实例时,往往需要执行一个关键步骤——数据库初始化。那么,为什么MySQL要进行初始化呢?
创建系统数据库和表
MySQL的初始化过程最主要的目的之一就是创建系统数据库和表。系统数据库(如mysql、information_schema、performance_schema和sys等)包含了MySQL管理系统的核心数据。这些数据包括用户账户、权限、系统变量以及系统状态信息等。通过初始化,MySQL能够确保这些关键的系统数据库和表格被正确创建并可供使用。生成数据目录结构
数据库的所有数据都需要存储在硬盘的特定位置,MySQL初始化过程中会生成所需的数据目录结构。这些目录包括存储表数据、日志文件、临时文件等必要的文件夹和配置项。初始化过程确保这些目录和文件的正确性和一致性,从而为数据的存储和管理提供了可靠的环境。创建默认用户
在初始化过程中,MySQL会创建一个默认的超级用户账户(通常为root)。这个账户拥有数据库的所有权限,并可以用于后续的数据库管理和配置操作。初始化时生成的初始密码或者安全措施,是确保系统安全性的重要一环。通过这种方式,用户可以在安装完成后安全地访问和配置数据库。安全设置
MySQL的初始化不仅仅是生成数据目录和创建用户,它还会应用一些默认的安全设置。例如,MySQL可能会强制用户设置强密码策略,并设置默认的数据库访问权限。这些措施有效地减少了安全隐患,保护数据库免受未经授权的访问和操作。日志和错误文件的生成
MySQL在初始化时,还会生成日志文件和错误日志文件。这些文件记录了数据库运行过程中的操作和错误信息,为后续的维护和问题诊断提供了重要依据。通过日志,管理员可以实时监控数据库的运行状态,并在出现问题时快速定位和解决问题。结论
综上所述,MySQL的初始化是确保数据库正常运行的必要步骤。通过创建系统数据库、生成数据目录、创建默认用户、设置安全配置以及生成日志文件,MySQL得以在一个稳定、安全的环境中高效运行。因此,无论是安装新的MySQL实例,还是在新环境中配置现有数据库,初始化都是至关重要的一步。
# tree -L 1 -u -h -F /data/mysql3306/data
/data/mysql3306/data
|-- [root 576K] #ib_16384_0.dblwr
|-- [root 8.6M] #ib_16384_1.dblwr
|-- [root 4.0K] #innodb_redo/
|-- [root 4.0K] #innodb_temp/
|-- [root 56] auto.cnf
|-- [root 1.7K] ca-key.pem
|-- [root 1.1K] ca.pem
|-- [root 1.1K] client-cert.pem
|-- [root 1.7K] client-key.pem
|-- [root 5.8K] ib_buffer_pool
|-- [root 128M] ibdata1
|-- [root 4.0K] mysql/
|-- [root 25M] mysql.ibd
|-- [root 4.0K] performance_schema/
|-- [root 1.7K] private_key.pem
|-- [root 452] public_key.pem
|-- [root 1.1K] server-cert.pem
|-- [root 1.7K] server-key.pem
|-- [root 4.0K] sys/
|-- [root 16M] undo_001
`-- [root 16M] undo_002
如果初始化没有成功,需要到错误日志中查看相关的报错信息,进行相应的处理。错误日志的路径由配置文件中的参数 log-error 指定。初始化成功后,可以看到错误日志的最后一行输出的 mysql root 账号的临时密码,我们要用这个密码来登录数据库。
# tail -10 /data/mysql3306/log/alert.log
2024-06-24T01:56:48.849579Z 0 [System] [MY-013169] [Server] /opt/mysql80/bin/mysqld (mysqld 8.0.39) initializing of server in progress as process 5352
2024-06-24T01:56:48.863677Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-06-24T01:57:30.863543Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-06-24T01:57:55.476711Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: YB%OojGi85?L
数据库初始化完成后,就可以启动了,不过在启动前,还需要做一件事情。如果初始化数据库时使用了 Linux 的 root 账号,还需要把 mysql 目录下的文件 owner 修改成 mysql。
chown -R mysql:mysql /data/mysql3306/
第五步:启动数据库服务
我们有几种不同的方式来启动 MySQL 服务,下面的例子使用 mysqld_safe 脚本来启动 MySQL,使用 defaults-file 指定参数文件的路径。
# /opt/mysql80/bin/mysqld_safe --defaults-file=/data/mysql3306/my.cnf &
[1] 5569
# mysqld_safe Logging to '/data/mysql3306/log/alert.log'.
mysqld_safe Starting mysqld daemon with databases from /data/mysql3306/data
如果启动失败,需要到错误日志中查看具体的报错信息。比较常见的问题有端口已经被占用了,或者参数文件中参数名写错了。
# tail -10 /data/mysql3306/log/alert.log
2024-06-24T02:17:43.215483Z 0 [ERROR] [MY-010262] [Server] Can't start server: Bind on TCP/IP port: Address already in use
2024-06-24T02:17:43.215527Z 0 [ERROR] [MY-010257] [Server] Do you already have another mysqld server running on port: 3306 ?
2024-06-24T02:17:43.215560Z 0 [ERROR] [MY-010119] [Server] Aborting
2024-06-24T02:17:45.035093Z 0 [System] [MY-010910] [Server] /opt/mysql80/bin/mysqld: Shutdown complete (mysqld 8.0.39) MySQL Community Server - GPL.
MySQL 服务启动成功后,可以在错误日志中看到“ready for connections”的日志信息。
[Server] /opt/mysql80/bin/mysqld: ready for connections. Version: '8.0.39' socket: '/data/mysql3306/run/mysql.sock' port: 3306 MySQL Community Server - GPL.
第六步:设置数据库初始密码
MySQL 在数据库初始化时设置了一个临时密码,可以在错误日志中找到。
# grep password /data/mysql3306/log/alert.log
2024-06-24T01:57:55.476711Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: YB%OojGi85?L
使用临时密码登录数据库后,执行 SQL 会提示要先修改密码。
# mysql -uroot -h127.0.0.1 -p'YB%OojGi85?L'
mysql> select now();
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
使用 alter user 命令修改 mysql root 账号的密码后,就可以正常使用数据库了。
mysql> alter user 'root'@'localhost' identified by 'Abcd1234';
Query OK, 0 rows affected (1.45 sec)
mysql> select now();
+---------------------+
| now() |
+---------------------+
| 2024-06-24 11:09:23 |
+---------------------+
1 row in set (0.00 sec)
这就是使用二进制方式安装 MySQL 的整个过程,可以看到过程并不复杂。使用二进制安装的主要优点就是你可以很方便地部署多实例,在同一台服务器运行多个版本的 MySQL,可以方便地规划磁盘路径。
RPM 安装
使用 Linux 的包管理器安装 MySQL 也是一种比较常用的方式,这里我们以 CentOS 7.9 为例来简单说明安装过程。
第一步:下载 RPM 包
选择 8.0 当前的最新版本。由于我们使用了 CentOS 7.9,操作系统选择“Red Hat Eenterrise Linux / Oracle Linux”,操作系统版本选择“Red Hat Enterprise Linux 7 / Oracle Linux 7(x86,64-bit)”。
下载 mysql-8.0.39-1.el7.x86_64.rpm-bundle.tar,里面包含了安装 MySQL 需要的所有 rpm 包。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.39-1.el7.x86_64.rpm-bundle.tar
下载完成后验证 md5,并解压。
# md5sum mysql-8.0.39-1.el7.x86_64.rpm-bundle.tar
1f59378ee4a9b40791672eed61366f52 mysql-8.0.39-1.el7.x86_64.rpm-bundle.tar
# tar xf mysql-8.0.39-1.el7.x86_64.rpm-bundle.tar
第二步:处理有冲突的包
如果服务器上已经安装了其他版本的 MySQL 或 MariaDB 的 RPM 包,就有可能会和待安装的 RPM 包发生冲突,需要先把这些 RPM 包卸载掉。注意,在生产环境卸载已经安装的包可能会引起问题,需要在服务器上线前就处理好这些问题。
# rpm -qa | egrep -i 'mysql|mariadb'
mariadb-libs-5.5.68-1.el7.x86_64
# yum remove mariadb-libs
Resolving Dependencies
......
Removed:
mariadb-libs.x86_64 1:5.5.68-1.el7
Dependency Removed:
postfix.x86_64 2:2.10.1-9.el7
第三步:安装 RPM 包
使用 RPM 命令安装 RPM 包,把 server、client 以及依赖的 lib 包都安装上。
# rpm -ivh mysql-community-libs-8.0.39-1.el7.x86_64.rpm \
mysql-community-client-8.0.39-1.el7.x86_64.rpm \
mysql-community-libs-compat-8.0.39-1.el7.x86_64.rpm \
mysql-community-client-plugins-8.0.39-1.el7.x86_64.rpm \
mysql-community-server-8.0.39-1.el7.x86_64.rpm \
mysql-community-common-8.0.39-1.el7.x86_64.rpm \
mysql-community-icu-data-files-8.0.39-1.el7.x86_64.rpm
warning: mysql-community-libs-8.0.39-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID a8d3785c: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-common-8.0.39-1.e################################# [ 14%]
2:mysql-community-client-plugins-8.################################# [ 29%]
3:mysql-community-libs-8.0.39-1.el7################################# [ 43%]
4:mysql-community-client-8.0.39-1.e################################# [ 57%]
5:mysql-community-icu-data-files-8.################################# [ 71%]
6:mysql-community-server-8.0.39-1.e################################# [ 86%]
7:mysql-community-libs-compat-8.0.3################################# [100%]
第四步:启动 MySQL 服务
RPM 包安装成功后,就可以使用 service 命令启动 MySQL 服务了。
# service mysqld start
Redirecting to /bin/systemctl start mysqld.service
使用 RPM 安装的 MySQL,默认的错误日志文件路径为 /var/log/mysqld.log。如果无法正常启动 MySQL 服务,可以到错误日志中查看相关报错信息。
# tail -100 /var/log/mysqld.log
......
2024-06-24T04:34:12.995336Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.39' socket: '/var/lib/mysql/mysql.sock' port: 3306 MySQL Community Server - GPL.
2024-06-24T04:34:12.995347Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
第五步:修改数据库默认密码
和二进制安装一样,使用 RPM 安装的 MySQL,第一次访问时,也需要先修改数据库的默认密码。先从错误日志中找到临时密码。
# grep password /var/log/mysqld.log
2024-06-24T03:56:57.469312Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: ,6R&fqlf/5TS
再使用临时密码登录数据库,执行 alter user 命令修改密码。密码修改后,数据库就可以正常使用了。
# mysql -uroot -h 127.0.0.1 -p',6R&fqlf/5TS'
mysql> select 1;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> alter user 'root'@'localhost' identified by 'Abcd1234';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> alter user 'root'@'localhost' identified by 'ComplexPassword2024$';
Query OK, 0 rows affected (0.45 sec)
mysql> select 1;
+---+
| 1 |
+---+
| 1 |
+---+
1 row in set (0.00 sec)
注意,使用 RPM 包安装的 MySQL,增加了数据库账号密码强度的验证。
二进制安装和 RPM 安装的区别
我们来对比下二进制安装和 RPM 包安装这两种安装方式的主要区别。
使用二进制安装时,我们需要做更多的准备工作,包括创建 MySQL 操作系统账号、创建数据库相关目录、准备参数文件。而使用 RPM 包安装时,自动包含了这些初始化动作。
使用二进制安装时,我们需要先创建初始化数据库。而使用 RPM 安装的 MySQL,把初始化数据库的操作放到了 service 的启动脚本中。
# more /usr/lib/systemd/system/mysqld.service
[Service]
User=mysql
Group=mysql
......
# Needed to create system tables
ExecStartPre=/usr/bin/mysqld_pre_systemd
# Start main service
ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS
执行 service start mysql 命令启动 MySQL 服务时,脚本 mysqld_pre_systemd 会检查数据目录是否存在,如果数据目录还没有创建,就会创建目录,并执行数据库初始化。并且 mysqld_pre_systemd 在初始化数据库时,还执行了下面这个 SQL,启用了密码验证组件。
INSERT INTO mysql.component (component_id, component_group_id, component_urn) VALUES (1, 1, 'file://component_validate_password');
启用密码验证组件后,在 MySQL 中创建账号或修改账号密码时,需要使用有一定复杂度的密码。
二进制安装时,MySQL 程序安装在一个统一的目录中,比如我们使用的 /opt/mysql80。而使用 RPM 安装时,将 MySQL 程序安装在不同的路径下。mysqld 安装在 /usr/sbin 路径下,其它程序安装在 /usr/bin 路径下,库文件安装在 /usr/lib64/mysql 下,字符集等相关支持文件放在 /usr/share/mysql-8.0 路径下。
二进制安装时,我们把参数文件、数据目录和其他运行 MySQL 的文件都放到了 /data/mysql{$PORT} 路径下,而 RPM 安装时,my.cnf 默认放到 /etc,数据目录放到 /var/lib/mysql,错误日志使用了 /var/log/mysqld.log。
如果你有单机多实例,或者在单台服务器上运行多个 MySQL 版本的需求,使用二进制安装更方便。
源码编译安装
通常我们会选择使用官方提供的二进制版本来部署 MySQL,但是有些情况下也可能会采用源码编译的方式。比如,在一些信创环境下,官方可能没有提供目标系统的二进制安装包。或者我们需要安装一些非标准版本的 MySQL,可能需要安装一些社区的 patch、bugfix、扩展插件。或者想使用其他编译器或编译选项来编译 MySQL,比如使用 Intel 的 C 编译器。或者出于学习的目的编译 Debug 版本的 MySQL,用来调试一些功能。
第一步:准备 build 环境
编译 MySQL 本身不复杂,不过需要先准备好一个编译环境。编译 MySQL 8.0 需要以下几个基本工具。
- cmake3
- binutils
- gcc 7.1 以上版本
- openssl
- ncurse
CentOS 7.9 默认的 GCC 版本太老了,需要安装一个新版本的 GCC。当然你也可以使用其它的 Linux 发行版本。
安装 cmake3。
yum install cmake3
安装 GCC。
yum install centos-release-scl
yum install devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils
安装其它依赖库。
yum install -y ncurses-devel openssl openssl-devel
第二步:下载源码
在 MySQL 的下载页面,操作系统选择“Source Code”,操作系统版本选择“All operating Systems (Generic) (Architecture Independent)”。选择带 C++ boost 库的源码包,编译 MySQL 时需要这些代码。
源码下载后,先验证一下文件校验码,确认没问题后再解压文件。
# wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.39.tar.gz
# md5sum mysql-boost-8.0.39.tar.gz
07ee1d23908fc4ad7fc6a5cb8f2c99de mysql-boost-8.0.39.tar.gz
# tar zxf mysql-boost-8.0.39.tar.gz
# tree -d -L 1 mysql-8.0.39
mysql-8.0.39
|-- archive_output_directory
|-- bin -> ./runtime_output_directory
|-- boost
|-- client
|-- cmake
|-- CMakeFiles
|-- components
|-- Docs
......
第三步:构建 MySQL
二进制进入源码目录,这里我们演示使用 cmake3 来构建一个 Debug 版本的 MySQL。如果执行 cmake 报错,需要查看错误信息,并做相应的处理。
# cd mysql-8.0.39
# cmake3 -DWITH_DEBUG=ON \
-DWITH_BOOST=boost/boost_1_77_0 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql8.0
构建 MySQL 有很多选项,这里我介绍其中最基础的几个选项,完整的选项你可以到官方文档中查看。
cmake 成功后,使用 make 命令构建 MySQL,使用参数 -j 指定编译的并发数,可以根据机器的配置选择合适的并发数,以加快构建的速度。
make -j 4
第四步:安装二进制
构建成功后,使用 make install 命令将 MySQL 安装到 CMAKE_INSTALL_PREFIX 指定的路径下。
make install
我们的例子中,MySQL 安装到了 /usr/local/mysql8.0 下。
# tree -L 1 /usr/local/mysql8.0/
/usr/local/mysql8.0/
├── bin
├── docs
├── include
├── lib
├── LICENSE
├── mysql-test
├── README
└── share
我们构建出来的 mysqld 占用的空间比较大,如果要用在生产环境,可以使用 strip 命令对可执行文件进行裁剪,去掉二进制文件中的一些符号和调试信息。
# ls -lSh bin
total 1.2G
-rwxr-xr-x 1 root root 707M Jun 24 18:26 mysqld
-rwxr-xr-x 1 root root 39M Jun 24 17:47 mysqlxtest
-rwxr-xr-x 1 root root 22M Jun 24 17:39 mysqlpump
-rwxr-xr-x 1 root root 21M Jun 24 17:39 mysqlbinlog
......
### 使用strip减少文件大小
# strip mysqld
# ls -lSh
total 565M
-rwxr-xr-x 1 root root 128M Jun 25 10:32 mysqld
-rwxr-xr-x 1 root root 39M Jun 24 17:47 mysqlxtest
-rwxr-xr-x 1 root root 22M Jun 24 17:39 mysqlpump
-rwxr-xr-x 1 root root 21M Jun 24 17:39 mysqlbinlog
二进制文件安装完成后,接下来的步骤和“二进制安装”中的步骤没有区别,这里就不再重复了。
总结
本文我们学习了在 Linux 操作系统下安装 MySQL 的几种方法。如果你需要安装部署大量 MySQL 服务器,我个人比较推荐使用二进制的方式安装。你需要制定一个标准规范,包括二进制安装路径、数据文件存放路径、服务器和数据库的标准参数配置等,并且按这个标准来部署所有的 MySQL 环境。
思考
问题1 - 修改完root密码忘记了怎么办?
早期的版本中,登录服务器本地的 MySQL 默认不需要密码。这存在一定的安全风险,因为你只要能登录到数据库服务器,就能访问这台服务器上的 MySQL 数据库。从 5.7 版本开始,给数据库的 root 账号设置了默认密码,首次登录时需要先修改密码。在部署一套 MySQL 数据库环境时,小明按规范修改了数据库 root 账号的密码,但是当时忘了将 root 密码记录下来,因此小明向你寻求帮助。你有办法帮小明解决这个问题吗?
回答
修改root账号密码:
- 关闭MySQL进程
service mysqld stop
- 启动 MySQL 服务,并跳过授权表验证
添加--skip-grant-tables参数,重启进程
bin/mysqld_safe --defaults-file=my.cnf --skip-grant-tables --skip-networking &
skip-networking这个选项也很重要,5.7或更早的版本中,如果不加skip-networking,任何地方都能登陆数据库,执行任何操作。
不过根据我的测试,8.0在安全性方面做了增强,即使不加skip-networking,也只能通过sock文件访问数据库。
- 用 mysql 客户端登录 MySQL,不需要密码
mysql -uroot
- flush privileges触发加载权限表
- alter user修改root用户密码
flush privileges; alter user 'root'@'localhost' identified by '新的密码';
- 退出 MySQL,并重新启动 MySQL 服务:
quit service mysqld restart
为什么修改完密码后还要重启,不是可以直接用了吗?
回答
在通过 --skip-grant-tables
模式重置 MySQL 密码后,重新启动 MySQL 服务的原因是为了恢复正常的安全模式。在 --skip-grant-tables
模式下,MySQL 不会验证用户的密码,也不会加载权限表。这种模式仅用于紧急修复,例如重置密码。
如果不重启 MySQL,数据库仍会运行在不安全的模式下,任何人都可以直接访问 MySQL 而不需要密码。这是非常危险的,尤其是在生产环境中。因此,在完成密码重置后,必须重启 MySQL 服务,以便让数据库重新加载权限表,恢复正常的密码验证机制。
总结来说,重启的目的是为了确保 MySQL 恢复到安全模式,避免出现潜在的安全漏洞。
除了 mysqladmin shutdown 命令之外,还有哪些方式可以正常关闭 mysql 呢?
我看 https://dev.mysql.com/doc/refman/8.4/en/programs-server.html 里面描述,服务器的启动方式有 mysqld,mysqld_safe,mysql.server,mysqld_multi。
除了 mysqladmin shutdown 命令之外,还有哪些方式可以正常关闭 mysql 呢?
回答
除了使用mysqladmin shutdown,如果你登陆了MySQL,可以执行命令shutdown。
如果使用systemd来管理mysql服务,也可以使用service 或 systemctl来正常关闭mysql,如systemctl stop mysqld。
还可以使用kill命令来关闭mysql,注意是kill, 不是kill -9。
你可以观察下错误日志中是不是有类似的输出: [Server] Received SHUTDOWN from user
报错:Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
我有个疑问,我是用二进制的方式安装mysql,按照老师的步骤安装的,log-error 日志中的输出:
2024-08-29T06:35:22.874674Z 0 [System] [MY-010931] [Server] /data/opt/mysql/mysql84/bin/mysqld: ready for connections. Version: '8.4.0' socket: '/data/var/mysql/mysql3306/run/mysql.sock' port: 3306 MySQL Community Server - GPL.
我用下面这个命令可以正确进入客户端:
/data/opt/mysql/mysql84/bin/mysql -u root -h 127.0.0.1 -p'Abcd1234'
但是我用下面的命令就会出现错误:
mysqluser@ubuntu000:~$ /data/opt/mysql/mysql84/bin/mysql -u root -h localhost -p'Abcd1234'
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
mysqluser@ubuntu000:~$ /data/opt/mysql/mysql84/bin/mysql -u root -h localhost
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
这是为什么呢?
回答
客户端使用了默认的sock文件/tmp/mysql.sock来连数据库,但实际上sock文件不在/tmp目录下。
试一下这么连:
mysql -u root -h 127.0.0.1 -p
或者这么连:
mysql -u root -S /data/var/mysql/mysql3306/run/mysql.sock -p
源码下载的时候,8.4.0 以后的版本,就没有 boost 选项了,这个是 mysql 做了什么调整吗?
回答
我下载了一个8.4的代码,boost的代码已经包含在里面了,路径是extra/boost。
# ls extra/boost/
boost_1_84_0
按官方文档的描述,MySQL 8.3开始,就把boost代码一起打包到MySQL的源码中了。
使用二进制方式进行安装,安装的版本与系统的 glibc 版本不一致,会有什么影响吗?之前部署安装5.7的版本,自己好像从未关注过这一块儿
回答
如果 mysql的glibc版本比操作系统的高,可能会运行不起来,报“version GLIBC_xxx not found”这样的错误。
what's difference if mysql binary don't compile with boost library?
回答
The Boost C++ libraries are required to build MySQL. MySQL compilation requires a particular Boost version.
按我的理解,编译MySQL 8是一定要用boost库的,而且对版本也有要求。
strip mysqld裁剪后体积还是很大,比官方编译的要大。这个是什么原因,是老师的环境区别还是别的原因?
主要是文稿里的例子中,我加上了Debug选项 WITH_DEBUG=ON。Release版本的二进制要小很多。
总结要点
- 数据库安装是了解数据库的第一步,通过安装部署可以了解数据库的核心组件和服务启动方式。
- 实践操作是深入掌握数据库技术的关键,通过测试验证可以加深对数据库知识的理解。
- 学习数据库安装部署有助于更好地应对各种环境下的复杂问题,为未来的数据库运维管理奠定基础。
- 二进制安装MySQL的常用步骤包括获取安装包、创建运行用户、规划数据目录、初始化数据库、启动数据库服务、设置初始密码。
- 在二进制安装中,需要注意选择适合操作系统版本的安装包,并进行文件校验。
- 创建单独的用户来运行MySQL是出于安全考虑,可以提高数据库的安全性。
- 规划数据目录时,建议使用满足性能要求的磁盘设备,如SSD,以保障数据库性能。
- 初始化数据库可能需要一定时间,完成后会生成默认数据库和相关的系统表。
- 在启动数据库服务前,需要将相关文件的owner修改为mysql用户,以确保数据库正常运行。
- 启动MySQL服务时,需要注意查看错误日志,处理可能出现的启动问题。