文章目录
MySQl数据库安装
本文将系统讲解MySQL安装的二进制安装、源码安装两种方式,涵盖从软件下载到不同安装方法的全流程,帮助读者快速搭建数据库环境,本文涉及的操作系统为 CentOS 7.9
数据库版本为 MySQL 8.0.41
一、下载 MySQL
1.下载地址
从MySQL官网下载页面 https://www.mysql.com/cn/downloads/
提供了以下3个产品的下载入口
- MySQL企业版(MySQL Enterprise Edition): 提供了企业版本备份工具、线程池、防火墙、审计、监控等功能
- MySQL Cluster 企业版(MySQL NDB Cluster CGE): 是基于NDB存储引擎的内存、无共享高的高可用方案
- MySQL社区版本(MySQL Community ): 它是广受大众喜爱的免费版本,遵循GPL开源协议
前两个是企业版,需要付费购买许可才能使用
2.选择产品
点击MySQL Community (GPL) Downloads »
链接后,进入MySQL社区版本的下载页面,这里提供了MySQL社区版产品的下载入口
2.二进制下载
在Select Version
处选择需要的版本,在Select Operating System
选择操作系统,在Select OS Version
选择对应的平台。
- 32-bit、64-bit指的是操作系统的位数
- X86 、arm指的是CPU架构
- glibc 2.17、glibc 2.28 指的是统译MySQL时的 glibc版本,glibc版本在Linux系统中可以通过
ldd -version
查看。需要注的是这里glibc版本没有限制作用,并不是说glibc2.17版本的MySQL只能在glibc2.17的操作系统上运行。
3.源码包下载
下载源码包的步骤与二进制包基本一致,在操作系统与对应平台的选择不同
- 在
Select Operating System
选择Source Code
- 在
Select OS Version
选择All Operating Systems(Generic)(Architecture Independent)
在源的下载选择中,建议下载带有 Boost Headers
的版本,否则需要在CMake的过程中指定 -DDOWNLOAD_BOOST=1
-DWITH_BOOST-<DIRECTORY>
进行编译。
二、基于二进制包的安装
1.环境准备
# 关闭SELinux
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
2.创建操作系统用户
#创建用户组
groupadd mysql
#创建用户
useradd -g mysql mysql
# 创建专用存储目录(推荐独立磁盘分区)
mkdir -p /data/mysql/3306/data
chown -R mysql:mysql /data/mysql
chmod 750 /data/mysql
注意:这里也可用使用其了用户名,不一定是mysql
3.解压二进制包
#将下载的软件包移动到 /usr/local 目录
mv mysql-8.0.41-linux-glibc2.17-x86_64.tar.xz /usr/local
#进入到 /usr/local目录
cd /usr/local
#解压MySQL软件包
tar -xvf mysql-8.0.41-linux-glibc2.17-x86_64.tar.xz
#创建软链接
ln -s mysql-8.0.41-linux-glibc2.17-x86_64 mysql
4.配置my.cnf文件
编辑/etc/my.cnf
配置文件,为了方便下面只给出几个主要参数
[client]
socket = /data/mysql/3306/data/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system
5.初始化实例
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
其中 --defaults-file
是参数文件的路径,--initialize
是初始化实例,上面的初始化命令使用了-initialize
,其实也可使用-initialize-insecure
,两者唯一的区别是前者会为root@localhost
生成一个随机密码,而后者不会。线上一般建议使用-initialize
。
6.启动实例
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
一般会通过以下两种方式来判断实例是否启动成功
- 查看错误日志,如果启动成功,日志中会打印
ready for connections
2025-03-09T19:24:09.804126+08:00 0 [System] [MY-010931] [Server] /usr/local/mysql/bin/mysqld: ready for connections. Version: '8.0.41' socket: '/data/mysql/3306/data/mysql.sock' port: 3306 MySQL Community Server - GPL.
- 查看mysqld进程是否启动
# ps -ef|grep mysqld
root 20839 20423 0 19:24 pts/0 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf
mysql 20991 20839 1 19:24 pts/0 00:00:01 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/3306/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql/3306/data/mysqld.err --pid-file=mysql01.pid --socket=/data/mysql/3306/data/mysql.sock --port=3306
7.问题排查
如果启动失败可以通过以下步骤定位失败原因
- 查看错误日志,一般来说启动过程中出现的错误都会打印在错误日志中,常见的错误有以下几种 ,如果错误日志中没有错误信息,可以尝试通过mysqld启动
- 端口被占用
- 参数名写错
- 参数在当前版本不支持
- 通过mysqld启动
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf &
如果依然无法定位,可以尝试通过以下以下方式启动
- 还是通过mysqld启动,但仅指定几个必要参数
/usr/local/mysql/bin/mysqld --no-defaults --basedir=/usr/local/mysql --datadir=/data/mysql/3306/data --user=mysql
为了避免读取默认位置配置文件,这里使用了 --no-defaults
参数
8.登陆实例
- 需要使用初始化过程中生成的随机密码
# cat /data/mysql/3306/data/mysqld.err |grep password
2025-03-09T19:22:40.147922+08:00 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: tx2z#XzrPW&I
- 使用mysql客户端登陆
/usr/local/mysql/bin/mysql -uroot -S /data/mysql/3306/data/mysql.sock -p'tx2z#XzrPW&I'
9.修改密码
- 登陆成功后无论执行什么命令,系统都会提示重置密码
mysql> select user();
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
- 修改密码
mysql> alter user user() identified by 'test123';
Query OK, 0 rows affected (0.01 sec)
三、基于源码包的安装
基于源码包的安装步骤与二进制的安装步骤基本一致,唯一的区别是源码包不能直接使用,而是必需要将他编译为二进制包, 本次测试基于 CentOS 7.9
,MySQL版本为8.0.41
1.安装依赖包
-
centos7系统中cmake预装版本较低,而编译8.0.41时需要更cmake3版本
-
对于gcc版本,MySQL8.0.40之前gcc11即可,8.0.41版本开始需要gcc12,如果可以yum方式直接安装比较方便,如果不能则需要临时调整到高版本yum源进行安装或下载安装包进行安装。本次使用的调整yum源的方式
-
添加SCLo-scl配置文件
vim /etc/yum.repos.d/CentOS-SCLo-scl.repo
添加如下内容
[centos-sclo-sclo]
name=CentOS-7 - SCLo sclo
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/$basearch/sclo/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-sclo-testing]
name=CentOS-7 - SCLo sclo Testing
baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/sclo/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-sclo-source]
name=CentOS-7 - SCLo sclo Sources
baseurl=http://vault.centos.org/centos/7/sclo/Source/sclo/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-sclo-debuginfo]
name=CentOS-7 - SCLo sclo Debuginfo
baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
- 添加SCLo-scl-rh配置文件
vim /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo
添加如下内容
# CentOS-SCLo-rh.repo
#
# Please see http://wiki.centos.org/SpecialInterestGroup/SCLo for more
# information
[centos-sclo-rh]
name=CentOS-7 - SCLo rh
baseurl=https://mirrors.aliyun.com/centos-vault/7.9.2009/sclo/$basearch/rh/
# mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=7&repo=sclo-rh
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-rh-testing]
name=CentOS-7 - SCLo rh Testing
baseurl=http://buildlogs.centos.org/centos/7/sclo/$basearch/rh/
gpgcheck=0
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-rh-source]
name=CentOS-7 - SCLo rh Sources
baseurl=http://vault.centos.org/centos/7/sclo/Source/rh/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
[centos-sclo-rh-debuginfo]
name=CentOS-7 - SCLo rh Debuginfo
baseurl=http://debuginfo.centos.org/centos/7/sclo/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-SCLo
- 重建yum源缓存
yum clean all
yum makecache
- 安装依赖包
yum -y install cmake3 make gcc gcc-c++ autoconf bison automake \
openssl openssl-devel zlib* fiex* libxml* \
ncurses-devel libmcrypt* libtool-ltdl-devel*
yum -y install centos-release-scl scl-utils-build
yum -y install gcc-toolset-12-gcc gcc-toolset-12-gcc-c++ gcc-toolset-12-binutils \
gcc-toolset-12-annobin-annocheck gcc-toolset-12-annobin-plugin-gcc
2.解压源码包
mv mysql-boost-8.0.41.tar.gz /usr/src/ && cd /usr/src/
tar -xvf mysql-boost-8.0.41.tar.gz
cd mysql-8.0.41 && mkdir build && cd build
3.编译参数文件
cmake3 /usr/src/mysql-8.0.41 \
-DWITH_BOOST=/usr/src/mysql-8.0.41/boost/boost_1_77_0 \
-DENABLE_DOWNLOADS=1 \
-DBUILD_CONFIG=mysql_release
参数 | 作用 |
---|---|
-DWITH_BOOST | 指定 boost库位置 |
-DENABLE_DOWNLOADS | 自动下载某此扩展文件,如 Googletest,如果在内网环境中,则可不指定 |
-DBUILD_CONFIG=mysql_release | 使用官方二进制包的编译选项 |
当然也可以指定其他选项,常用的编译选项如下:
参数 | 作用 |
---|---|
-DCMAKE_BUILD_TYPE | build的类型,如果要编译成debug 版本,需将该选项设置为Debug . |
-DWITH_DEBUG | 是否编译成debug版本。若设置为I,效果同-DCMAKE_.BUILD_.TYPE=Debug 一样。 |
-DCMAKE_INSTALL_PREFIX | 指定安装目录的位置,默认为/usr/locaL/mysql 。 |
-DMYSQL_DATADIR | 指定数据目录的默认位置。 |
-DDEFAULT_CHARSET | 指定默认字符集。 |
-DDEFAULT_.COLLATION | 指定字符集的默认校验规则。 |
-DMYSQL_TCP_PORT | 指定MySQL Server的监听端口,默认为3306。 |
-DMYSQL_UNIX_ADD | 指定套接字文件的位置,默认为/tmp/mysql.sock |
-WITHOUT_.xxx_STORAGE_ENGINE | 排除某些存储引擎的编译。比如不编译BLACKHOLE存储引擎,可指定以下选项:-DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1 |
-WITH_xxx_STORAGE_ENGINE | 指定某些存储引擎的编译。在二进制包中,默认不支持FEDERATED引擎。如果要开启,只能编译源码,且需指定以下选项:-DWITH_FEDERATED_STORAGE_ENGINE=1 |
-DWITHOUT_SERVER | 是否编译MySQL Server。.如果设置为1,则不会编译。 |
4.编译
make 会基于 Makefile中的规则将源码编译成可执行文件,命令中的-j
指定编译时的并行发度,可以根据自已的cpu
核数进行自行调整。
make -j 8
....
[100%] Building CXX object unittest/gunit/CMakeFiles/merge_large_tests-t.dir/log _event_status_size-t.cc.o
[100%] Building CXX object unittest/gunit/CMakeFiles/merge_large_tests-t.dir/__/ __/storage/example/ha_example.cc.o
[100%] Linking CXX executable ../../runtime_output_directory/merge_large_tests-t
[100%] Built target merge_large_tests-t
[100%] Linking CXX executable ../../../runtime_output_directory/merge_innodb_tes ts-t
[100%] Built target merge_innodb_tests-t
5.安装
make install
...
-- Installing: /usr/local/mysql/man/man1/zlib_decompress.1
-- Installing: /usr/local/mysql/man/man1/mysql.server.1
-- Installing: /usr/local/mysql/man/man1/mysqld_multi.1
-- Installing: /usr/local/mysql/man/man1/mysqld_safe.1
-- Installing: /usr/local/mysql/man/man8/mysqld.8
-- Installing: /usr/local/mysql/man/man1/mysqlrouter.1
-- Installing: /usr/local/mysql/man/man1/mysqlrouter_passwd.1
-- Installing: /usr/local/mysql/man/man1/mysqlrouter_plugin_info.1
make install 将可执行的二进制文件和第三方依赖库拷贝到指定的位置,我们编译时未指定安装路径,使用默认的安装位置/usr/local/mysql
目录下
ls -lrt /usr/local/mysql
total 656
-rw-r--r--. 1 root root 666 Dec 16 17:20 README-test
-rw-r--r--. 1 root root 679 Dec 16 17:20 README.router
-rw-r--r--. 1 root root 666 Dec 16 17:20 README
-rw-r--r--. 1 root root 258233 Dec 16 17:20 LICENSE-test
-rw-r--r--. 1 root root 116708 Dec 16 17:20 LICENSE.router
-rw-r--r--. 1 root root 258233 Dec 16 17:20 LICENSE
-rw-r--r--. 1 root root 1672 Mar 9 21:10 mysqlrouter-log-rotate
drwxr-xr-x. 3 root root 282 Mar 9 21:48 include
drwxr-xr-x. 6 root root 207 Mar 9 21:48 lib
drwxr-xr-x. 10 root root 4096 Mar 9 21:48 mysql-test
drwxr-xr-x. 28 root root 4096 Mar 9 21:48 share
drwxr-xr-x. 2 root root 77 Mar 9 21:48 support-files
drwxr-xr-x. 2 root root 69 Mar 9 21:48 docs
drwxrwxr-x. 2 root root 6 Mar 9 21:48 run
drwxr-xr-x. 3 root root 17 Mar 9 21:48 var
drwxr-xr-x. 2 root root 4096 Mar 9 21:48 bin
drwxr-xr-x. 4 root root 30 Mar 9 21:48 man
6.配置my.cnf文件
编辑/etc/my.cnf
配置文件,为了方便下面只给出几个主要参数
[client]
socket = /data/mysql/3306/data/mysql.sock
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system
7.初始化实例
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --initialize
其中 --defaults-file
是参数文件的路径,--initialize
是初始化实例,上面的初始化命令使用了-initialize
,其实也可使用-initialize-insecure
,两者唯一的区别是前者会为root@localhost
生成一个随机密码,而后者不会。线上一般建议使用-initialize
。
8.启动实例
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
最后谈谈,对于MySQL,二进制包安装和源码包安装孰优孰劣的问题。很多人喜欢用源码包安装,原因不外乎以下3个。
- 可自定义路径。
- 可自行指定编译选项。
- 源码编译的性能更好。
关于第一个原因,对于MySQL来说,意义其实不是很大,毕竟basedir和datadir都可自定义。唯一有区别的是配置文件的默认加载位置。
至于第二和第三个原因,我们不妨看看官方文档的说法:
在使用源码包进行安装之前,请检查Oracle是否为您的平台提供了预编译的二进制包,以及它是否适合您。为了实现最佳性能,我们投入了大量的精力来确保我们提供的二进制包是以最佳选项来构建的。
尤其对于第二个原因,官方文档甚至给出了“警告”:
使用非标准选项编译MySQL可能会导致功能性、性能或安全性下降。
不难看出,相对于源码包,官方更推荐使用二进制包来安装部署MySQL。