在Docker CentOS7.x镜像中通过源码方式安装MySQL

1,095 阅读3分钟

最近需要将三台腾讯云服务器的应用全部迁移到一个Docker CentOS7.x的镜像中。其他应用迁移都比较顺利,唯安装MySQL遇到了一些问题。因为在容器中使用systemctl/service命令会出现下图的错误:

image.png

虽然找到一些解决方案,但是需要在宿主机上操作,于是找了容器平台运营方,很遗憾他们回答:“无法解决”。这就无法使用我一贯安装MySQL的yum源方式,改成使用源码安装MySQL。以下记录我通过源码方式安装MySQL的过程。

1. 下载MySQL

wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.34.tar.gz

版本说明(通过以上链接下载的MySQL的版本说明):

  • 版本 MySQL Community Server 5.7.34
  • Source Code
  • Generic Linux (Architecture Independent)
  • 带boost版本

2. 环境依赖

源码方式安装MySQL所需的环境依赖:

  • cmake
  • make
  • gcc
  • gcc-c++
  • bison
  • ncurses
  • ncurses-devel(devel是开发版本)
yum -y install cmake make gcc gcc-c++ bison ncurses ncurses-devel

3. 安装MySQL

3.1. 解压

tar -zxvf mysql-boost-5.7.34.tar.gz
cd mysql-5.7.34/  

3.2. 创建编译目录

mkdir configure
cd configure

3.3. 生成编译环境

cmake .. -DWITH_BOOST=../boost/boost_1_59_0/ -DWITH_EMBEDDED_SERVER=OFF

3.4. 安装编译

make && make install

3.5. 创建mysql用户组和用户

groupadd mysql
useradd -g mysql mysql

3.6. 设置权限

MySQL通过3.4. 安装编译步骤完成后所在的目录为 /usr/local/mysql

chown -R mysql:mysql /usr/local/mysql

3.7. 创建my.cnf

vim /etc/my.cnf

my.cnf里面的内容为如下:

 For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html

[client]
default-character-set=utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
datadir=/usr/local/mysql/data
socket=/usr/local/mysql/mysql.sock

character-set-client-handshake=FALSE
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

explicit_defaults_for_timestamp=true

以上内容也可自行调整

3.8. 初始化数据库

cd /usr/local/mysql/bin
./mysqld --initialize --user=mysql

我这边没有显示初始化密码,需要成功启动数据库跳过密码进入MySQL再修改密码。

3.9. 启动数据库

cd /usr/local/mysql/support-files
./mysql.server start

由于文章开始说过我这边的容器中无法使用systemctl/service命令,所以我没有把MySQL加入系统服务,有需要的读者可自行加入。

3.10. 设置登录MySQL

通过一下命令创建软连接,可直接在命令行使用mysql命令。

ln -s /usr/local/mysql/bin/mysql /usr/local/bin

创建软链接到/tmp/mysql.sock

ln -s /usr/local/mysql/mysql.sock /tmp/mysql.sock

3.11. 免密登录

修改/etc/my.cnf,添加skip-grant-tables

重启MySQL

cd /usr/local/mysql/support-files
./mysql.server restart

免密进入MySQL命令行

mysql

修改登录密码

use mysql;
update user set authentication_string=password('PASSWORD') where user='root';
flush privileges;

最后,退出MySQL命令行,将/etc/my.cnf中的skip-grant-tables删除或注释掉,再次重启MySQL就可以使用新修改的密码登录。

4. 总结

遇到问题不要慌,要去看日志(日志的路径在my.cnf的log-error配置可查看)。通过日志无法直接解决的,将日志报错的关键字在网上多搜下资料,然后结合自身实际情况分析(因为每篇资料的机器环境都不一样相同),这样就能解决大部分问题了。最后将我参考的几篇文章的链接放出来,在上面步骤中可能出现的错误或许能通过这些链接看到。

参考资料:

  1. CentOS7源码编译安装MySQL5.7:segmentfault.com/a/119000001…

  2. Docker with mysql: The error means mysqld does not have the access rights to the directory:stackoverflow.com/questions/3…

  3. Can't open and lock privilege tables: Table 'mysql.user' doesn't exist:stackoverflow.com/questions/3…

  4. initialize specified but the data directory has files in it. Aborting:www.cnblogs.com/ming-4/p/11…