「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战」。
一. MySQL 在 CentOS7 的部署
系统环境说明:
# 内核
[root@cool ~]$ uname -r
3.10.0-1160.31.1.el7.x86_64
# 版本
[root@cool ~]$ cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
复制代码
首先,需要去官网找到 MySQL 的下载链接:downloads.mysql.com/archives/co… ,选择自己需要的版本。然后按照以下命令进行 mysql 的安装。
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
# 1. 解压
[root@cool ~]$ tar xf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
# 2. 创建软件目录与软链接
[root@cool ~]$ mkdir /mysql
[root@cool ~]$ mv mysql-5.7.35-linux-glibc2.12-x86_64 /mysql
[root@cool ~]$ ln -s /mysql/mysql-5.7.35-linux-glibc2.12-x86_64/ /usr/local/mysql
[root@cool ~]$ ll /usr/local/mysql
lrwxrwxrwx 1 root root 43 Oct 31 10:22 /usr/local/mysql -> /mysql/mysql-5.7.35-linux-glibc2.12-x86_64/
# 3. 创建 mysql 用户与数据目录并授权
[root@cool ~]$ useradd mysql -M -s /sbin/nologin
[root@cool ~]$ mkdir -p /data/3306/mysql
[root@cool ~]$ chown mysql. /data -R
# 4. 清理环境
[root@cool ~]$ rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
mariadb-5.5.68-1.el7.x86_64
[root@cool ~]$ yum remove mariadb-libs.x86_64 -y
[root@cool ~]$ rpm -qa | grep mariadb
# 5. 配置环境变量
[root@cool ~]$ vim /etc/profile
export PATH=/usr/local/mysql/bin:$PATH
[root@cool ~]$ . /etc/profile
[root@cool ~]$ mysql -V
mysql Ver 14.14 Distrib 5.7.35, for linux-glibc2.12 (x86_64) using EditLine wrapper
# 6. 初始化数据目录
[root@cool ~]$ mysqld --initialize-insecure --user=mysql --datadir=/data/3306/mysql --basedir=/usr/local/mysql
# 7. 编辑基础配置文件
[root@cool ~]$ vim /etc/my.cnf
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/mysql
socket=/tmp/mysql.sock
port=3306
[mysql]
socket=/tmp/mysql.sock
# 8. 启动 mysql
[root@cool ~]$ /usr/local/mysql/support-files/mysql.server start
Starting MySQL. SUCCESS!
[root@cool ~]$ netstat -lntup | grep 3306
tcp6 0 0 :::3306 :::* LISTEN 26781/mysqld
复制代码
如果在第六步初始化数据目录出现报错:
mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
解决方案:yum install libaio-devel -y
安装完成后,进行 MySQL 的启动,使用绝对路径启动太过麻烦,下面提供了几种 MySQL 的启动方式,可以选择其一进行使用:
# 1. 绝对路径启动/关闭
[root@cool ~]$ /usr/local/mysql/support-files/mysql.server start
Starting MySQL. SUCCESS!
# 2. service 方式启动/关闭
[root@cool ~]$ cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@cool ~]$ service mysqld start
Starting MySQL. SUCCESS!
# 3. /etc/init.d/ 方式启动/关闭
[root@cool ~]$ /etc/init.d/mysqld start
Starting MySQL. SUCCESS!
# 4. 使用 systemctl 方式启动/关闭
[root@cool ~]$ chkconfig --add mysqld
[root@cool ~]$ chkconfig --list
Note: This output shows SysV services only and does not include native
systemd services. SysV configuration data might be overridden by native
systemd configuration.
If you want to list systemd services use 'systemctl list-unit-files'.
To see services enabled on particular target use
'systemctl list-dependencies [target]'.
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@cool ~]$ systemctl start mysqld
[root@cool ~]$ systemctl status mysqld
● mysqld.service - LSB: start and stop MySQL
Loaded: loaded (/etc/rc.d/init.d/mysqld; bad; vendor preset: disabled)
Active: active (running) since Sun 2021-10-31 10:47:27 CST; 1s ago
Docs: man:systemd-sysv-generator(8)
Process: 27869 ExecStart=/etc/rc.d/init.d/mysqld start (code=exited, status=0/SUCCESS)
Tasks: 28
Memory: 169.4M
CGroup: /system.slice/mysqld.service
├─27880 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/3306/mysql --pid-file=/data/3306/mysql/cool.pid
└─28036 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/3306/mysql --plugin-dir=/usr/local/mysql/lib/pl...
Oct 31 10:47:26 cool systemd[1]: Starting LSB: start and stop MySQL...
Oct 31 10:47:27 cool mysqld[27869]: Starting MySQL. SUCCESS!
Oct 31 10:47:27 cool systemd[1]: Started LSB: start and stop MySQL.
复制代码
关于 systemctl 的管理方式,也可参照官网进行配置后使用(支持多实例管理):dev.mysql.com/doc/refman/…
至此,对于 MySQL 常规的单实例(二进制)安装完成。对于安装过程中初始化数据目录这一步骤,有以下几点需要注意:
① 5.7 版本之前的初始化命令为:/usr/local/mysql/scripts/mysql_install_db --user=管理用户 --basedir=软件路径 --datadir=数据目录
② 5.7 版本及其之后的版本,初始化命令为:mysqld --initialize-insecure --user=管理用户 --basedir=软件路径 --datadir=数据目录
③ 初始化参数--initialize:生成 12 位随机四种复杂度的密码,只能用来登录,不可以进行数据库管理,在第一次登陆后对其密码进行修改(alter user root@'localhost' identified by 'root';)。
④ 初始化参数 --initialize-insecure:初始化后管理员密码为空。
二. MySQL 配置文件初识
配置文件,即为了定制化 MySQL 。在 MySQL 中,通常情况下单节点的 MySQL 只有一个配置文件。且 MySQL 内置了一定的读取顺序,越往后文件的优先级越高,后续读取的参数信息会覆盖之前的配置,对于不重复的参数配置则是进行相加处理。我们可以使用以下命令来查看 MySQL 的配置文件读取顺序:
[root@cool ~]$ mysqld --help --verbose | grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
复制代码
以此我们可以确认 MySQL 配置文件的读取顺序为:/etc/my.cnf → /etc/mysql/my.cnf → /usr/local/mysql/etc/my.cnf → ~/.my.cnf,你可以将配置文件放在其中的任意一个位置。当然,我们也可以在启动的时候通过参数人为地指定配置文件,即--defaults-file=/tmp/my.cnf 。
需要注意的是,当你使用了--defaults-file参数时,该参数必须作为第一个参数出现,否则会出现报错。你可以通过mysqld --help --verbose | head -50查看一些常用的参数(或搭配grep使用)。
下面介绍下基础的配置文件,以此配置文件为例:
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3306/data
socket=/tmp/mysql.sock
port=3306
[mysql]
socket=/tmp/mysql.sock
复制代码
MySQL 的配置文件由配置项和标签项组成。配置项即key=value,标签项则分为服务端标签和客户端标签。常见的服务端标签有[server]、[mysqld]、[mysqld_safe],客户端标签有[client]、[msyql]、[mysqldump]。
三. MySQL 同版本多实例部署
多实例,即在一台主机上运行多个 MySQL 实例,在测试环境或者大型的集群环境中被广泛使用。从配置方式上来说,我们使用一个 MySQL Server,通过初始化多个不同的数据目录来实现多实例的效果。
下面为具体的同版本多实例部署过程:
# 1. 创建多个数据目录并修改属主属组(此处以两个为例)
[root@cool ~]$ mkdir /data/330{7,8}/mysql -p
[root@cool ~]$ chown mysql. /data/ -R
# 2. 准备多个配置文件
[root@cool ~]$ cat >/data/3307/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3307/mysql
socket=/tmp/mysql3307.sock
port=3307
EOF
[root@cool ~]$ cat >/data/3308/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3308/mysql
socket=/tmp/mysql3308.sock
port=3308
EOF
# 3. 初始化数据(假设已经配置好了MySQL Server)
[root@cool ~]$ mysqld --defaults-file=/data/3307/my.cnf --initialize-insecure
[root@cool ~]$ mysqld --defaults-file=/data/3308/my.cnf --initialize-insecure
# 4. 启动多个实例
[root@cool ~]$ mysqld_safe --defaults-file=/data/3307/my.cnf &
[root@cool ~]$ mysqld_safe --defaults-file=/data/3308/my.cnf &
# 5. 登录多个实例
[root@cool ~]$ mysql -S /tmp/mysql3307.sock
[root@cool ~]$ mysql -S /tmp/mysql3308.sock
# 6. 可配置为远程登录(仅为测试,生产应使用强密码)
mysql > create user root@'%' identified by 'root';
mysql> grant all on *.* to root@'%';
# 测试(其中ip为主机的ip地址)
[root@cool ~]$ mysql -uroot -proot -hip -P3307
[root@cool ~]$ mysql -uroot -proot -hip -P3308
复制代码
四. MySQL 不同版本多实例部署
之前我们讲解了 MySQL 同版本多实例的部署,生产中还会遇到 MySQL 不同版本多实例的部署,原理与同版本一致。具体的部署过程见下:
# 1. 准备不同版本的 MySQL 包(以5.6和5.7版本为例)
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz
[root@cool ~]$ wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
# 2. 解压并创建软链接
[root@cool ~]$ tar xf mysql-5.6.51-linux-glibc2.12-x86_64.tar.gz
[root@cool ~]$ tar xf mysql-5.7.35-linux-glibc2.12-x86_64.tar.gz
[root@cool ~]$ mv mysql-5.6.51-linux-glibc2.12-x86_64 /mysql/
[root@cool ~]$ mv mysql-5.7.35-linux-glibc2.12-x86_64 /mysql/
[root@cool ~]$ ln -s /mysql/mysql-5.6.51-linux-glibc2.12-x86_64/ /usr/local/mysql56
[root@cool ~]$ ln -s /mysql/mysql-5.7.35-linux-glibc2.12-x86_64/ /usr/local/mysql57
# 3. 创建 mysql 用户与数据目录并授权
[root@cool ~]$ useradd mysql -M -s /sbin/nologin
[root@cool ~]$ mkdir -p /data/33{09..10}/mysql
[root@cool ~]$ chown mysql. /data -R
# 4. 准备配置文件
[root@cool ~]$ cat >/data/3309/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3309/mysql
socket=/tmp/mysql3309.sock
port=3309
EOF
[root@cool ~]$ cat >/data/3310/my.cnf <<EOF
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/3310/mysql
socket=/tmp/mysql3310.sock
port=3310
EOF
# 5. 初始化数据
[root@cool ~]$ /usr/local/mysql56/scripts/mysql_install_db --user=mysql --datadir=/data/3309/mysql --basedir=/usr/local/mysql56
[root@cool ~]$ /usr/local/mysql57/bin/mysqld --user=mysql --datadir=/data/3310/mysql --basedir=/usr/local/mysql57 --initialize-insecure
# 6. 启动多实例
[root@cool ~]$ /usr/local/mysql56/bin/mysqld_safe --defaults-file=/data/3309/my.cnf &
[root@cool ~]$ /usr/local/mysql57/bin/mysqld_safe --defaults-file=/data/3310/my.cnf &
# 7. 连接测试
[root@cool ~]$ mysql -S /tmp/mysql3309.sock
[root@cool ~]$ mysql -S /tmp/mysql3310.sock
复制代码
5.6 初始化报错:
FATAL ERROR: please install the following Perl modules before executing /usr/local/mysql56/scripts/mysql_install_db:
Data::Dumper解决方案:yum install autoconf -y
至此,多实例部署完成。
五. 使用 Docker 快速部署 MySQL
如果你想要快速部署一个测试或个人使用的 MySQL ,那么使用 Docker 进行部署是极其便捷的。
首先,你需要打开 Docker 关于 MySQL 的官方镜像地址:hub.docker.com/_/mysql ,在其中找到自己需要的 Tag (版本),也可以直接使用默认的 laetst 最新版本进行部署使用。此处以 Tag=mysql:5.7.35 为例:
# 1. 安装 docker : 参照阿里云 → https://developer.aliyun.com/mirror/docker-ce
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# 2. 创建数据目录 → 方便数据迁移
[root@cool ~]$ mkdir /data/3311/mysql -p
# 3. 创建/启动容器
[root@cool ~]$ docker run \
--name mysql \
-v /data/3311/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD="root" \
-p 3311:3306 \
-d mysql:5.7.35
# 验证
[root@cool ~]$ docker ps -a
# 4. 进入 MySQL 数据库
[root@cool ~]$ docker exec -it mysql /bin/bash
root@f156e2f7ec15:/# mysql -uroot -proot
mysql> select user,host from mysql.user;
+---------------+---------------+
| user | host |
+---------------+---------------+
| root | % |
| mysql.session | localhost |
| mysql.sys | localhost |
| root | localhost |
+---------------+---------------+
4 rows in set (0.00 sec)
mysql> show grants for root@'%';
+-------------------------------------------------------------+
| Grants for root@% |
+-------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION |
+-------------------------------------------------------------+
1 row in set (0.00 sec)
复制代码
可以看到,通过 Docker 运行的 MySQL 默认已经创建了远程 root 用户,且授予了所有权限,所以可以直接远程连接使用。接下来对命令的一些参数进行说明:
① --name mysql 表示容器的名称为 mysql 。
② -v /data/3311/mysql:/var/lib/mysql 表示将本地的 /data/3311/mysql 目录挂载到容器的 /var/lib/mysql 中,可以简单理解为在容器中写入到 /var/lib/mysql 目录的数据,实际写入到了本地的 /data/3311/mysql 目录中。
③ -e MYSQL_ROOT_PASSWORD="root" 表示配置 MySQL 默认 root 用户的密码,此处配置为 root ,大家可以结合自己的实际进行强密码配置。
④ -p 3311:3306 表示将本地的 3311 端口映射到容器的 3306 端口,可以简单理解为访问本地的 3311 端口等同于访问容器的 3306 端口。
关于其他常见的配置参数,可以参照官方说明部分:hub.docker.com/_/mysql 。




近期评论