文章目录
  1. 1. CentOS 下安装 MySQL
    1. 1.1 安装与启动
      1. 1.1.1 自动方法(10min)
      2. 1.1.2 手动方法(自动方法慢时才用)
    2. 1.2 日志文件时间格式
    3. 1.3 启动 MySQL 服务进程
    4. 1.4 修改密码
      1. 1.4.1 已知 root 密码时
      2. 1.4.2 忘记密码时
    5. 1.5 防火墙放行【跨机访问时才需要】
    6. 1.6 验证连接
    7. 1.7 卸载 MySQL
  2. 2. Linux 单机启动多个 MySQL 实例
    1. 2.1 关于 mysqld_multi 命令
    2. 2.2 关闭 SELinux 模式
    3. 2.3 MySQL 配置文件中增加实例配置
    4. 2.4 启动新实例
    5. 2.5 【重要】强制本机客户端以 TCP 连接
    6. 2.6 修改密码
    7. 2.7 防火墙放行
    8. 2.8 验证连接

数据库是绝大多数企业应用必需的,而 MySQL 是最流行的开源数据库。本文以最新的 MySQL Community Server 5.7.17 为例,总结了 CentOS 下 MySQL 服务器的安装和必要配置,并演示了 MySQL 单机多实例的部署方法。

作者:王克锋
出处:https://kefeng.wang/2016/12/20/mysql-deploy/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1. CentOS 下安装 MySQL

Oracle 收购 MySQL 后,CentOS 为避免 MySQL 闭源的风险,改用 MySQL 的分支 MariaDB;
MariaDB 完全兼容 MySQL,包括API和命令行,但还是有些地方不一样(比如命令行提示符);
要想使用传统的官方版本 MySQL Community,需要手工下载并安装。

1.1 安装与启动

1.1.1 自动方法(10min)

1
2
3
4
5
6
7
## https://dev.mysql.com/downloads/repo/yum/
## cat /etc/redhat-release ## CentOS Linux release 7.4.1708
## 找到 "Red Hat Enterprise Linux 7" 的 RPM 包
wget --tries=0 --retry-connrefused https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
## https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
sudo yum -y install mysql57-community-release-el7-11.noarch.rpm
sudo yum -y install mysql-server

1.1.2 手动方法(自动方法慢时才用)

使用迅雷等多线程下载工具,下载各安装包至 PC,再上传至 Linux 主机:

然后按下面顺序安装(有依赖关系):

1
2
3
4
5
sudo yum -y remove mariadb-libs
sudo yum -y install mysql-community-common-5.7.17-1.el7.x86_64.rpm
sudo yum -y install mysql-community-libs-5.7.17-1.el7.x86_64.rpm
sudo yum -y install mysql-community-client-5.7.17-1.el7.x86_64.rpm
sudo yum -y install mysql-community-server-5.7.17-1.el7.x86_64.rpm

1.2 日志文件时间格式

查看日志文件 /var/log/mysqld.log,发现时间格式为 2016-12-21T13:15:11.097632Z,为 UTC 格式,与北京时间相差 8 小时;

1
2
3
4
5
6
### sudo vim /etc/my.cnf
[mysqld]
log_timestamps=SYSTEM # log time zone
explicit_defaults_for_timestamp=true

lower_case_table_names=1 ## 表名不区分大小写

调整后重启 mysqld,日志中变为北京时间,形如“2016-12-22T11:52:12.499593+08:00”,但格式非预期,没能找到解决办法,但尚能授受。

1.3 启动 MySQL 服务进程

1
2
3
sudo systemctl enable mysqld # 加入开机启动
sudo systemctl start mysqld # 立即启动
sudo netstat -natp | grep mysqld ## 检测监听端口

1.4 修改密码

1.4.1 已知 root 密码时

1
2
3
4
5
6
7
8
## MySQL 首次启动时随机生成 root 密码,要求修改后才能继续使用
## MySQL 5.7 密码要求: 8位以上、大小写、数字、字符
sudo grep "temporary password" /var/log/mysqld.log | awk -F'root@localhost: ' '{print $2}' # 查询初始密码
mysql -uroot -p # 粘贴查到的密码
MySQL> SET PASSWORD = 'MySQL5.7';
MySQL> SHOW VARIABLES LIKE 'validate_password%'; ## 查看密码要求
MySQL> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.%' IDENTIFIED BY 'MySQL5.7' WITH GRANT OPTION;
MySQL> SHOW GRANTS FOR 'root'@'192.168.%'; ## 查看授权结果

1.4.2 忘记密码时

首先,修改 MySQL 配置,跳过授权验证,安全起见同时关闭网络防止外部主机连接:

1
2
3
4
## sudo vim /etc/my.cnf
[mysqld]
skip-networking
skip-grant-tables

重启 MySQL 服务:

1
sudo systemctl restart mysqld

重新设置 root 密码:

1
2
3
mysql -uroot # 此时可无密码登录
MySQL> UPDATE mysql.user SET authentication_string=password('MySQL5.7') WHERE user='root';
MySQL> FLUSH PRIVILEGES; EXIT;

恢复之前的 MySQL 配置,并重启服务,操作完毕:

1
2
3
sudo vim /etc/my.cnf # 撤消刚刚的修改
sudo systemctl restart mysqld
mysql -uroot -p # 此时指定新设密码登录

1.5 防火墙放行【跨机访问时才需要】

1
2
3
### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -j ACCEPT
### 重启生效: sudo systemctl restart iptables

1.6 验证连接

1
2
3
4
## sudo vim /home/admin/bin/mysql.sh
## sudo chmod +x /home/admin/bin/mysql.sh
## SELECT version(), @@port, user(), now();
mysql -uroot -hlocalhost -pMySQL5.7 -P3306

1.7 卸载 MySQL

若要重新安装 MySQL 服务,需要先卸载:

1
2
3
4
5
# 注意:如果重装版本号不变,则可以不卸载 mysql57-community-release
sudo systemctl stop mysqld
sudo systemctl disable mysqld
sudo yum -y remove mysql-server mysql-client mysql-common mysql-libs
sudo rm -rf /var/lib/mysql /usr/share/mysql /etc/my.cnf /var/log/mysqld.log

执行完毕后,检查卸载是否彻底:

1
2
rpm -qa | grep -i mysql
sudo find / -name "mysql*"

2. Linux 单机启动多个 MySQL 实例

单机多实例是指,单个 Linux 的单个 MySQL 安装,启动多个 MySQL 服务进程,监听多个端口提供多个数据库服务。
早期版本只能使用 mysqld_multi 实现多实例,从 MySQL 5.7.13 开始,只能使用 systemd 实现。
下面的多实例实现单机主从库,把原实例作为 master 库,新增实例作为 slave 库。

2.1 关于 mysqld_multi 命令

mysqld_multi 用来管理多个 mysqld 进程,各个进程以 GNR(Group Number) 标识。
命令格式为:mysqld_multi [options] {start|stop|reload|report} [GNR[,GNR] ...]
[options]: 对应于 my.cnf 中的 [mysqld_multi] 段;
可以执行的命令包括 start(启动), stop(停止), reload(重启), report(报告)
GNR 必须为正整数,对应于 /etc/my.cnf 中 [mysqld{GNR}] 的 {GNR}
可以指定单个或多个 GNR(逗号分隔),不指定 GNR 时,表示所有 GNR;

下面是使用 systemd 实例单机多实例,关于 mysqld_multi 的实现请参考官方资料:
http://dev.mysql.com/doc/refman/5.7/en/mysqld-multi.html

2.2 关闭 SELinux 模式

1
2
3
4
# sudo vim /etc/selinux/config
# mode of SELinux: enforcing=enable, permissive=disable
# SELINUX=enforcing
SELINUX=permissive

Linux sudo reboot 之后生效。

如果漏掉此操作,启动实例时会报错:

1
2
3
4
[ERROR] InnoDB: Operating system error number 13 in a file operation.
[ERROR] InnoDB: The error means mysqld does not have the access right s to the directory.
[ERROR] InnoDB: os_file_get_status() failed on './ibdata1'. Can~t determine file permissions
[ERROR] InnoDB: Plugin initialization aborted with error Generic error

参考资料: http://stackoverflow.com/questions/26474222/mariadb-10-centos-7-moving-datadir-woes

2.3 MySQL 配置文件中增加实例配置

1
2
3
4
5
6
7
8
## sudo vim /etc/my.cnf
[mysqld@slave]
port=33061
datadir=/var/lib/mysql-slave
socket=/var/lib/mysql-slave/mysql.sock
log-error=/var/log/mysqld-slave.log
explicit_defaults_for_timestamp=true
log_timestamps=SYSTEM

参考资料: http://dev.mysql.com/doc/refman/5.7/en/using-systemd.html#systemd-multiple-mysql-instances

2.4 启动新实例

1
2
sudo systemctl enable mysqld@slave # 加入开机启动
sudo systemctl start mysqld@slave # 立即启动

2.5 【重要】强制本机客户端以 TCP 连接

这里有个大坑,Linux 上使用 mysql -uroot -P33061 -p 连接时,即使指定了 slave 端口号,仍然连接到 master 库,百思不得其解;
原来有个隐规则:当以 localhost 连接时(不指定-h时默认为localhost),MySQL 是通过 Unix Socket(而不是 TCP) 连接。此时指定的端口被忽略。
解决办法(mysqld 无需重启,立即生效):

1
2
3
## sudo vim /etc/my.cnf
[client]
protocol = TCP

相关资料: http://dev.mysql.com/doc/refman/5.7/en/connecting.html#option_general_protocol

2.6 修改密码

1
2
3
4
5
sudo grep "temporary password" /var/log/mysqld-slave.log | awk -F'root@localhost: ' '{print $2}' # 查询初始密码
mysql -uroot -P33061 -p # tBXQh60y<Hen
MySQL> SET PASSWORD = 'MySQL5.7';
MySQL> GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.%' IDENTIFIED BY 'MySQL5.7' WITH GRANT OPTION;
MySQL> SHOW GRANTS FOR 'root'@'192.168.%'; ## 查看授权结果

2.7 防火墙放行

1
2
3
### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 33061 -j ACCEPT
### 重启生效: sudo systemctl restart iptables

2.8 验证连接

在 Windows 上连接 MySQL 来验证:
DOS> mysql -uroot -hcentos -pMySQL5.7 -P33061 -e “SELECT user(), @@port”
输出 root@192.168.214.1 | 33061, 验证通过。

文章目录
  1. 1. CentOS 下安装 MySQL
    1. 1.1 安装与启动
      1. 1.1.1 自动方法(10min)
      2. 1.1.2 手动方法(自动方法慢时才用)
    2. 1.2 日志文件时间格式
    3. 1.3 启动 MySQL 服务进程
    4. 1.4 修改密码
      1. 1.4.1 已知 root 密码时
      2. 1.4.2 忘记密码时
    5. 1.5 防火墙放行【跨机访问时才需要】
    6. 1.6 验证连接
    7. 1.7 卸载 MySQL
  2. 2. Linux 单机启动多个 MySQL 实例
    1. 2.1 关于 mysqld_multi 命令
    2. 2.2 关闭 SELinux 模式
    3. 2.3 MySQL 配置文件中增加实例配置
    4. 2.4 启动新实例
    5. 2.5 【重要】强制本机客户端以 TCP 连接
    6. 2.6 修改密码
    7. 2.7 防火墙放行
    8. 2.8 验证连接