共计 11317 个字符,预计需要花费 29 分钟才能阅读完成。
版本选择
在企业生产场景下,数据库是重中之重,因此选择 MySQL 数据库一定要慎重。下面是给出的一些选择建议:
- 选稳定版版本,即选择开源的社区版的稳定版
- 建议选择第二条产品线中的 5.5 或 5.6 版本,目前互联网公司主流版本是 5.5 和 5.6
- 选择 MySOL 数据库至少发布半年以上的稳定版本
- 尽可能选择前后几个月没有大 BUG 修复的版本,而不是大量修复 BUG 的集中版本
- 最好选择向后较长时间没有更新发布的版本
- 要考虑开发人员开发程序使用的版本是否兼容你所选的版本
- 首先作为内部开发测试数据库环境,测试运行几个月的时间
- 优先对企业非核心业务采用新的数据库稳定版本
有二制安装、RPM 包安装和源码编译安装这几种安装方式。
Linux 操作系统
二进制安装(推荐)
使用二进制包安装 MySQL 是比较常用的一种方式,这种安装方式,解压即用,非常简单,下面部署 MySQL 多实例就是以这种方式安装的。
这里使用 Ubuntu 18.04 LTS 操作系统来运行 MySQL,主要分为六个步骤。
第一步:获取二进制安装包
到 MySQL 官网 下载二进制安装包,选择 8.0 GA 最新版本,当前 8.0 最新 GA 版本是 8.0.40(2024-11-22)。
操作系统选择“Linux – Generic”,操作系统版本要根据系统的 glibc 版本来选择,可使用一些方法来确定 glibc 版本,比如通过 ldd 命令:ldd --version
。
可先用浏览器下载安装包,再上传到服务器,也可直接在服务器上使用 wget、curl 等工具下载:wget https://cdn.mysql.com/Downloads/MySQL-8.0/mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz
安装包下载完成后使用 md5sum 工具检查文件校验码是否和官网提供的一致:md5sum mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz
如果一切正常,解压二进制包,将解压后的文件夹放到一个安装目录下,如 /opt
目录下,并创建一个软链接。
tar xvf mysql-8.0.40-linux-glibc2.28-x86_64.tar.xz
sudo mv mysql-8.0.40-linux-glibc2.28-x86_64 /opt/
sudo ln -s /opt/mysql-8.0.40-linux-glibc2.28-x86_64 /opt/mysql80
到此,MySQL 其实就已经安装好了。
第二步:创建运行 MySQL 的用户
出于安全考虑,需要创建一个单独的用户来运行 MySQL。
sudo groupadd mysql
sudo useradd mysql -g mysql
sudo passwd mysql
useradd -s /sbin/nologin -M mysql
,- s 指定用户登入后所使用的 Shell,这里指定不允许登录,- M 不创建家目录。
第三步:规划数据目录,准备 my.cnf 参数文件
规划数据目录,用来存放 MySQL 数据文件,以及各类日志文件。
sudo mkdir -p /data/mysql3306/{data,log,binlog,relaylog,run,tmp}
tree -d -L 2 /data
每个实例的所有文件,都放在同一个顶层目录中,以 mysql{$PORT} 的方式命名。配置文件 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
skip_name_resolve 参数,控制 MySQL 服务器是否解析主机名,配置该参数可提高连接速度。
第四步:初始化数据库
先安装依赖:sudo apt install libaio1
,再初始化 MySQL。
使用 mysqld 初始化数据库,第一个参数必须是 defaults-file,指向上一步准备好的 my.cnf 配置文件,第二个参数是 initialize,指示 mysqld 进行初始化操作。
# /opt/mysql80/bin/mysqld --defaults-file=/data/mysql3306/my.cnf --initialize
初始化成功后,可到错误日志最后一行查看 mysql root 账号临时密码,要用这个密码来登录数据库:tail -10 /data/mysql3306/log/alert.log
数据库初始化完成后,就可以启动了,不过在启动前,还需要做一件事情。如果初始化数据库时使用了 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 &
关闭数据库可以使用:mysqladmin -uroot -p shutdown
或者:mysql -uroot -p -e 'shutdown'
。
第六步:设置数据库初始密码
客户端连接 MySQL 前,先安装依赖:sudo apt install libncurses6
数据库初始化时设置了一个临时密码,可在错误日志中找到:grep password /data/mysql3306/log/alert.log
使用临时密码登录数据库:
/opt/mysql80/bin/mysql -uroot -p'ofo8A8M6q' -S /data/mysql3306/run/mysql.sock
- - u 指定用户名
- - p 指定密码,一般不在命令行写入密码,否则容易通过历史记录看到密码,不安全
- -S:本地 socket 文件位置
- -h:数据库 IP 地址
- -P:数据库端口号
- -e:免交互执行数据库命令
- <:导入 sql 脚本
登录数据库后,执行 SQL 语句会提示修改密码。使用 alter user 命令修改 mysql root 账号密码后,就可以正常使用数据库了。
alter user 'root'@'localhost' identified by 'root';
select now();
不要给 MySQL 用户设置过于简单的密码,可以通过密码验证组件来强制密码的复杂度。
INSTALL COMPONENT 'file://component_validate_password';
忘记密码处理:直接 kill mysqld 进程,然后启动 MySQL,加上 skip-grant-tables 选项后,不需要密码就能登录数据库。
mysqld_safe --defaults-file=/data/mysql3306/my.cnf \
--skip-grant-tables \
--skip-networking &
mysql -uroot -S /data/mysql3306/run/mysql.sock
登录后,先执行 flush privileges 命令,加载用户和权限相关的表,再执行 alter user 命令修改密码,然后重新启动 MySQL,就可以正常访问数据库了。
flush privileges;
alter user 'root'@'localhost' identified by 'root';
使用二进制方式安装 MySQL 并不复杂,其主要优点是可以很方便地部署多实例,在同一台服务器运行多个版本的 MySQL,也可以方便地规划磁盘路径。
RPM 安装
使用 Linux 的包管理器安装 MySQL 也是一种比较常用的方式,这里以 CentOS 7.9 为例来简单说明安装过程。RPM 安装须提前准备好 rpm 软件包,且无法满足定制化需求、编译参数、修改路径、依赖冲突问题,不建议使用。
第一步:下载 RPM 包
下载 Linux 版 MySQL 安装包:https://dev.mysql.com/downloads/mysql/
- Select Version: 8.0.40
- Select Operating System: Red Hat Enterprise Linux / Oracle Linux
- Select OS Version: Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit)
- RPM Bundle
下载 mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar,里面包含了安装 MySQL 需要的所有 rpm 包。下载完成后验证 md5,并解压 rpm。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar
md5sum mysql-8.0.40-1.el7.x86_64.rpm-bundle.tar
第二步:处理有冲突的包
如果服务器上已经安装了其他版本的 MySQL 或 MariaDB 的 RPM 包,就有可能会和待安装的 RPM 包发生冲突,需要先把这些 RPM 包卸载掉。
rpm -qa | egrep -i 'mysql|mariadb'
yum remove mariadb-libs -y
第三步:安装 RPM 包
这种包资源管理器是不会处理依赖关系的,所以安装有先后顺序。
rpm -ivh mysql-community-libs-8.0.40-1.el7.x86_64.rpm \
mysql-community-client-8.0.40-1.el7.x86_64.rpm \
mysql-community-libs-compat-8.0.40-1.el7.x86_64.rpm \
mysql-community-client-plugins-8.0.40-1.el7.x86_64.rpm \
mysql-community-server-8.0.40-1.el7.x86_64.rpm \
mysql-community-common-8.0.40-1.el7.x86_64.rpm \
mysql-community-icu-data-files-8.0.32-1.el7.x86_64.rpm
安装 community-libs 可能会报错,执行命令卸载 mysql-libs:yum remove mysql-libs
,然后重新安装 libs。
安装 community-devel 可能会报错,执行命令安装依赖:yum install openssl-devel -y
,然后重新安装 devel。
安装 server 可能会报错,执行命令安装依赖:yum install net-tools
,然后重新安装 server。
Bundle 包中各类 RPM 文件说明如下:
- libs 客户端应用程序共享库
- client 客户端应用程序和工具
- libs-compat 兼容老版本共享库
- client-plugins 客户端应用程序插件工具
- server 服务端应用程序和工具
- common 服务器和客户端通用库文件
- devel 客户端应用程序开发用的头文件和库文件
第四步:启动 MySQL 服务
RPM 包安装成功后,就可以启动 MySQL 服务了。
systemctl start mysqld
systemctl stop mysqld
systemctl restart mysqld
systemctl status mysqld
默认错误日志文件路径为 /var/log/mysqld.log。如果无法正常启动 MySQL 服务,可到错误日志中查看相关报错信息。
第五步:修改数据库默认密码
查看自动生成的 root 用户密码:grep password /var/log/mysqld.log
使用临时密码登录数据库,执行 alter user 命令修改密码。密码修改后,数据库就可以正常使用了。
set global validate_password.policy=0;
set global validate_password.length=4;
alter user 'root'@'localhost' identified by 'root';
使用 RPM 包安装的 MySQL,增加了数据库账号密码强度的验证。这里设置密码的复杂度为简单类型,密码长度为 4。
创建用户:create user 'root'@'%' identified with mysql_native_password by '1234';
给新创建的 root 分配权限:grant all on *.* to 'root'@'%';
源码编译安装
源码编译三部曲:
- 获取源码包,解压后,源码目录下有一个 Makefile 文件
- 进入源码目录下,执行 make 指令,自动读取 Makefile
- make 编译完成后,执行
make install
,安装到指定位置
cmake 也是一个编译命令,用于一些跨平台的编译设置,比 make 更高级,使用起来更方便。
第一步:准备 build 环境
编译 MySQL 8.0 需要以下几个基本工具:
-
- cmake3
- binutils
- gcc 7.1 以上版本
- openssl
- ncurse
安装 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
第二步:下载源码
- Select Version: 8.0.40
- Select Operating System: Source Code
- Select OS Version: All operating Systems (Generic) (Architecture Independent)
- 选择带 C ++ boost 库源码包
源码下载成后先验证 md5,没问题再解压文件。
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.40.tar.gz
md5sum mysql-boost-8.0.40.tar.gz
tar zxf mysql-boost-8.0.40.tar.gz
第三步:构建 MySQL 二进制
进入源码目录,这里使用 cmake3 来构建一个 Debug 版本的 MySQL。
cd mysql-8.0.40
cmake3 -DWITH_DEBUG=ON \
-DWITH_BOOST=boost/boost_1_77_0 \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql8.0
cmake 成功后,生成 Makefile 文件。使用 make 命令构建 MySQL,参数 - j 指定编译并发数,根据机器配置选择合适的并发数,以加快构建速度。
make -j 4
第四步:安装二进制
构建成功后,使用 make install
命令将 MySQL 安装到 CMAKE_INSTALL_PREFIX 指定路径下。
make install
构建出来的 mysqld 占用空间较大,可使用 strip 命令对可执行文件进行裁剪,去掉二进制文件中的一些符号和调试信息。
strip mysqld
二进制文件安装完成后,接下来步骤和“二进制安装”中步骤没有区别,这里就不再重复。
部署 MySQL 多实例
基于一个 MySQL 应用,初始化 3 次,生成 3 个独立的 MySQL 数据目录,即为三个 MySQL 独立实例。
先进行之前编译安装配置的环境清理,清空 PATH 有关的 MySQL,再停止之前启动的 MySQL:/etc/init.d/mysqld stop
- 准备 MySQL 多实例数据目录:
mkdir -p /data/330{7..9}/data
- 准备 MySQL 多实例日志目录:
mkdir -p /binlog/330{7..9}
- 设置权限:
chown -R mysql.mysql /data/* /binlog/*
- 可选:
mv /etc/my.cnf /etc/my.cnf.bak
- 分别创建多实例配置文件
cat > /data/3307/my.cnf <<EOF [mysqld] basedir=/app/database/mysql/ datadir=/data/3307/data/ socket=/tmp/mysql3307.sock log_error=/data/3307/mysql.error.log port=3307 server_id=7 log_bin=/binlog/3307/mysql-bin EOF
- 分别初始化数据:
mysqld --initialize-insecure --user=mysql --basedir=/app/database/mysql/ --datadir=/data/3307/data
准备启停脚本
cat > /etc/systemd/system/mysqld3307.service <<EOF
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/app/database/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf
LimitNOFILE = 5000
EOF
启动多实例
启动 MySQL 服务:systemctl start mysqld3307
登录 MySQL
本地可使用 Socket 套接字文件,通过内存数据共享进行登录:mysql -S /my_mysql/3306/mysql.sock
。
mysql.sock 是 MySQL 主机和客户机在同一 host 上的时候,使用 UNIX Domain Socket 做为通讯协议的载体,它比 TCP 快,在高并发场景下,效率更高。MySQL 进程存在,sock 文件就存在,pid 文件也存在,否则全部消失。
远程登录授权,例如,允许 root 用户在 192.168.1.x 网段内,使用密码 123456 进行远程连接:
grant all privileges on *.* to 'root'@'192.168.1.%' identified by '123456';
安全配置
MySQL 默认没有密码,很不安全,使用 mysqladmin 命令修改密码:mysqladmin -uroot -S /my_mysql/3306/mysql.sock password
使用套接字文件登录:mysql -p -S /my_mysql/3306/mysql.sock
。
Windows 版本
安装与配置
最新版 MySQL 下载地址:https://dev.mysql.com/downloads/mysql/,下载后解压到 D:\dev
目录下。
接着,将 D:\dev\mysql-8.0.36-winx64\bin 目录配置到环境变量 Path 当中:右键「此电脑」->「属性」->「高级系统设置」->「环境变量」->「系统变量」中的 Path ->「编辑」->「新建」,添加 MySQL 安装路径中 bin 文件夹所在路径(也可以在系统变量中新建 MYSQL_HOME,然后在系统变量 Path 新建 %MYSQL_HOME%\bin)。
- 初始化 data 目录
以管理员身份打开命令提示符窗口,执行mysqld --initialize --console
进行 data 目录初始化,此时会在控制台生成一个随机密码(–console 的作用),先将该密码保存起来。也可以使用mysqld --initialize-insecure
命令来初始化数据库,此时 root 用户没有密码,这意味着任何人都能以 root 用户身份登录并访问数据库。因此,在完成初始化后,应立即为 root 用户设置一个密码(修改默认账户密码:mysqladmin -u root password 123
,123 是指默认 root 账户密码,可以自行修改成自己喜欢的),以确保数据库的安全性。 - 注册 MySQL 服务
执行命令mysqld --install
,看 MySQL 服务名称:右键「此电脑」->「管理」->「服务和应用程序」->「服务」,找 MySQL 服务。 - 启停 MySQL 服务
启动 MySQL 服务命令net start mysql
,停止 MySQL 服务命令net stop mysql
。 - 登录 MySQL
输入mysql -uroot -p
回车,输入刚才的随机密码,然后回车。
登陆参数:mysql - u 用户名 - p 密码 - h 服务器 ip 地址(默认 127.0.0.1) - P 端口号(默认 3306)
退出 MySQL:exit 或 quit。
- 修改 MySQL 的 root 账户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';
,打开新的命令提示符窗口,重新登录 MySQL。
MySQL 卸载
停止 MySQL 服务net stop mysql
,删除 MySQL 服务mysqld --remove mysql
,删除 MySQL 目录及相关环境变量。
登录 MySQL
MySQL8 开放 root 账户远程登录权限(危险动作):
- 第一步:本地使用 root 账户登录 MySQL
- 第二步:
use mysql;
- 第三步:
update user set host = '%' where user = 'root';
- 第四步:
flush privileges;
MySQL 5.7 字符集设置
在 MySQL 8.0 版本之前,默认字符集为 latin1,utf8 字符集指向的是 utf8mb3。从 MySQL 8.0 开始,数据库的默认编码改为 utf8mb4,从而避免了乱码问题。
修改 MySQL 数据目录下的 my.ini 配置文件:
[mysql] #大概在 63 行左右,在其下添加
...
default-character-set=utf8 #默认字符集
[mysqld] # 大概在 76 行左右,在其下添加
...
character-set-server=utf8
collation-server=utf8_general_ci
重启服务后,查看编码命令:
show variables like 'character_%';
show variables like 'collation_%';
命名管道和共享内存
命名管道和共享内存是 Windows 操作系统中的两种进程间通信方式,客户端进程和服务器进程之间可以考虑使用命名管道或共享内存进行通信。
使用 命名管道 来进行进程间通信:需要在启动服务器程序的命令中加上 –enable-named-pipe 参数,然后在启动客户端程序的命令中加入 –pipe 或者 –protocol=pipe 参数。
使用 共享内存 来进行进程间通信:需要在启动服务器程序的命令中加上 –shared-memory 参数,在成功启动服务器后,共享内存便成为本地客户端程序的默认连接方式,不过也可以在启动客户端程序的命令中加入 –protocol=memory 参数来显式的指定使用共享内存进行通信。
软件卸载
在“控制面板”选择“卸载程序”,并在程序列表中找到 MySQL8.0 服务器程序,直接双击卸载即可。这种方式删除,数据目录下的数据不会跟着删除。
残余文件清理
- 服务目录:MySQL 服务的安装目录
- 数据目录:默认在 C:ProgramDataMySQL
如果自己单独指定过数据目录,就找到自己的数据目录进行删除即可。
注意:请在卸载前做好数据备份。
在操作完以后,需要重启计算机,然后进行安装即可。如果仍然安装失败,需要继续操作如下步骤。
清理注册表(选做)
在系统搜索框中输入 regedit:
HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesEventlogApplicationMySQL 服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet001ServicesMySQL 服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesEventlogApplicationMySQL 服务 目录删除
HKEY_LOCAL_MACHINESYSTEMControlSet002ServicesMySQL 服务 目录删除
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesEventlogApplicationMySQL 服务 目录
删除
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesMySQL 服务删除
注册表中的 ControlSet001、ControlSet002 不一定是 001 和 002,可能是 ControlSet005、006。
删除环境变量配置
找到 path 环境变量,将其中关于 MySQL 的环境变量删除,切记不要全部删除。
MySQL 图形化管理工具
有些图形界面工具,特别是旧版本的图形界面工具,在连接 MySQL8 时出现“Authentication plugin ‘caching_sha2_password’ cannot be loaded”错误。
出现这个原因是 MySQL8 之前的版本中加密规则是 mysql_native_password,而在 MySQL8 之后,加密规则是 caching_sha2_password。
解决问题方法有两种,第一种是升级图形界面工具版本,第二种是把 MySQL8 用户登录密码加密规则还原成 mysql_native_password。
第二种解决方案如下,用命令行登录 MySQL 数据库之后,执行如下命令修改用户密码加密规则并更新用户密码:
# 使用 mysql 数据库
USE mysql;
# 修改 'root'@'localhost' 用户的密码规则和密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'abc123';
# 刷新权限
FLUSH PRIVILEGES;
服务器程序
⽤来启动 MySQL 服务器程序的可执⾏⽂件有很多,⼤多在 MySQL 安装⽬录的 bin ⽬录下。
- mysqld:这个可执⾏⽂件代表 MySQL 服务器程序,运⾏这个⽂件就可以直接启动⼀个服务器进程
- mysqld_safe:是⼀个启动脚本,它会间接调⽤ mysqld,⽽且还顺便启动了另外⼀个监控进程,这个监控进程在服务器进程挂了的时候,可以帮助重启它。另外,使⽤ mysqld_safe 启动服务器程序时,它会将服务器程序的出错信息和其他诊断信息重定向到某个⽂件中,产⽣出错⽇志,这样可以⽅便我们找出发⽣错误的原因
- mysql.server:也是⼀个启动脚本,它会间接调⽤ mysqld_safe,在调⽤ mysql.server 时在后边指定 start 参数启动服务器程序,指定 stop 参数关闭服务器程序