centos7 二进制安装Mysql5.7 多版本多实例

发布时间 2023-08-14 01:17:25作者: 应晚星

前言:

    Q:为什么开发人员写博客?

    A:因为:

1. 官方主页,文档都是英文。看起来吃力。很多软件不知道怎么安装,怎么使用。

2. Linux 系统太自由了,没有对安装包和安装位置作统一安装标准。(这个使用软件包管理器会好一点。类似手机的应用市场,windows11的store, 直接一键安装)

3. Unix/Linux 都是以二进制安装为主,每个安装包内部的配置,安装方式,启动指令,启动步骤,都不相同。(没有windows 的exe /msi 安装包,一路下一步这么简单)

     Q:然而就算中文网站上这么多教程博客。。。新人看了博客依然无从下手,Linux下软件都不会装,为什么?

     A:因为

1.  Unix/ Linux 系内,系统分为很多分发版。。。装软件要找到对应该系统的版本。。而且每个软件又分很多版本。。这就造成别人的博客的教程,和你的版本不同。你可能没法用。

2.  装软件需要很多依赖, 可能缺了某个依赖,就跑不起来。。更别说依赖的具体版本。

3.  Linux 系统和 命令不熟。  什么是 user, group, 权限?   怎么vi 改脚本和配置,  怎么启动进程,杀进程,端口占用怎么办。文件没有读写权限怎么办。出错了怎么找原因,怎么解决,日志在哪里。

4.  有些博客自身写的有漏洞,细节不全没法照搬。。更别说某论坛大量的重复博客,虽然有靠谱的可以参考。。但垃圾博客还是影响搜索。

所以。。学习Linux 才会让人感觉那么难,软件也不好装。。。不像 windows,找个软件exe双击下一步完事了。。

 

吐槽完了。。记录下自己学习  CentOS下,Mysql5.7 的二进制安装。

CentOS二进制安装Mysql5.7

原本目的:CentOS下, 安装多版本Mysql  5.7 和  8.0, 

这里先记录 独立安装Mysql5.7的过程。 

要求:

1.  要能在系统内安装 多个版本的Mysql,  所以data 文件夹, 配置,都要单独分开配置。

2.  使用二进制安装,不是用rpm  yum包管理器安装。

3.  多实例采用脚本启动, 不使用   mysql/support-files/mysql_multi   脚本

 

参考资料:(唉,资料多的,都不知道参考哪个好了)

bing 搜索关键字: “centos 多版本 mysql 安装”       “centos mysql 多版本”

CentOS7.7下二进制部署MySQL多版本多实例实战   (https://www.cnblogs.com/centlnx/p/12763775.html ) 参考一:讲的很细致了

CentOs服务器下安装两个个MySql数据库踩坑日记    (https://blog.csdn.net/u010898329/article/details/83064373) 参考二:配图很细致

linux 上安装多个不同版本的mysql 踩的坑  (https://www.cnblogs.com/suiyueqiannian/p/10337935.html)  参考三,启动配置的原理,加了讲解。

google搜索 “centos mysql 多版本   安装”

centos安装多版本mysql  (https://www.jianshu.com/p/ac389d939891)

 

环境准备:

参考:https://www.cnblogs.com/centlnx/p/12763775.html

部分指令为直接拷贝,请根据实际 下载文件更改。。。主要关注流程

1.虚拟机环境

 

~  cat /etc/redhat-release                       
CentOS Linux release 7.9.2009 (Core)
 ~  cat /proc/version  
 Linux version 3.10.0-1160.71.1.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Tue Jun 28 15:37:28 UTC 2022

 

2.虚拟机优化(略)

3.清理环境

卸载已安装的mysql

$ rpm -qa | grep mysql


# 如果有,可以使用以下命令依次删除上面的程序
$ yum remove mysql-xxx-xxx-

②删除mysql的配置文件

$ find / -name mysql|xargs rm -fr
有些删不掉的也没关系
 

③删除MariaDB的文件

$ rpm -qa | grep mariadb
$ rpm -e mariadb-xxx --nodeps
 

④删除my.cnf

$ rm -fr /etc/my.cnf

 这个可以先备个份再删除。。而且这个清除很关键!! 因为默认会读这个文件

  

⑤检查端口是否被占用

$ which mysql
$ pkill mysqld
$ netstat -lntup|egrep '3306|3307|3308|3309|3316|3326|13306'

  

4.准备软件包

MySQL官方下载地址
下载二进制包略。

 

 ~   mkdir -p /opt/software 
 ~  cd /opt/software  
 ~  wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.42-el7-x86_64.tar.gz

 

5.准备目录(端口根据自己规划修改)

$ rm -rf /data/*

# MySQL安装目录
$ mkdir -p /data/app

# MySQL数据目录
$ mkdir -p /data/13306/data
$ mkdir -p /data/330{7,8,9}/data
$ mkdir -p /data/33{16,26}/data

# Scoket目录
$ mkdir -p /data/socket

 

 

第三章 部署MySQL5.7实例

1.解压软件包并制作软连接

$ cd /opt/software
$ tar xf mysql-5.7.43-el7-x86_64.tar.gz
$ mv mysql-5.7.43-el7-x86_64  /data/app/mysql-5.7.32
$ ln -s /data/app/mysql-5.7.32 /data/app/mysql5732

 

2.创建MySQL多实例配置(这里用13306端口)

# 13306实例配置
$ cat > /data/13306/my.cnf <<EOF 
[mysqld]                    
user=mysql                  
basedir=/data/app/mysql5743    
datadir=/data/13306/data     
socket=/data/socket/mysql13306.sock      
port=13306                   
server_id=6                  
EOF

  

3.创建MySQL傀儡用户并授权

$ sudo useradd -s /sbin/nologin -M mysql
$ id mysql
$ sudo chown -R mysql.mysql /data

 (这个至关重要!!!   如果不想把 /data 所属用户改为 mysql,免得影响其他已有的软件

那至少 /data   给他任意用户可读写权限  sudo chmod 777 /data   

然后/data/app 也是同理。 可以不把所属改为mysql , 但最好给任意用户可读写  sudo chmod 777 /data/app

/data/app/  下的mysql安装文件,最好全部改为mysql 所有!!    sudo chown -R mysql.mysql  /data/app/mysql* ) 

$ sudo chmod 777 /data
 $ sudo chmod 777 /data/app
 $ sudo chown -R mysql.mysql /data/13306
 $ sudo chown -R mysql.mysql /data/socket
 $ sudo chown -R mysql.mysql /data/app/mysql*
 $ sudo chmod -R 755 /data/13306
 $ sudo chmod -R 755 /data/socket
 $ sudo chmod -R 755 /data/app/mysql*

  

4.初始化

$ /data/app/mysql5743/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql5743 --datadir=/data/13306/data
$ echo $?

 这里如果提示

mysqld: Can't create/write to file '/data/13306/data/is_writable' (Errcode: 13 - Permission denied)
2023-08-13T15:28:01.307785Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-08-13T15:28:01.309533Z 0 [ERROR] --initialize specified but the data directory exists and is not writable. Aborting.
2023-08-13T15:28:01.309553Z 0 [ERROR] Aborting

那可能是  /data/13306/data  已经把所有人  改为mysql 了。 而当前运行的终端用户,可能没有写权限。执行 sudo chmod -R 777 /data/13306 即可。。(注意这里给后面挖了个坑,启动失败时会说)

正常会输出:
 

 /data/13306  /data/app/mysql5743/bin/mysqld --initialize-insecure --user=mysql --basedir=/data/app/mysql5743 --datadir=/data/13306/data
2023-08-13T15:31:13.485426Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-08-13T15:31:13.487450Z 0 [Warning] One can only use the --user switch if running as root

2023-08-13T15:31:13.856423Z 0 [Warning] InnoDB: New log files created, LSN=45790
2023-08-13T15:31:13.942112Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2023-08-13T15:31:14.018854Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 70106d0d-39ee-11ee-bde3-525400be1630.
2023-08-13T15:31:14.030490Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2023-08-13T15:31:15.288789Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2023-08-13T15:31:15.288809Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2023-08-13T15:31:15.291694Z 0 [Warning] CA certificate ca.pem is self signed.
2023-08-13T15:31:15.539377Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

因为使用了 --initialize-insecure  所以目前mysql 的root 用户是没有设密码的。

 

 

5.编写systemd启动脚本

# 13306实例启动的服务脚本
$ sudo vim /etc/systemd/system/mysqld13306.service 
# 按i 键位 进入插入模式,输入如下配置
[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=/data/app/mysql5743/bin/mysqld --defaults-file=/data/13306/my.cnf
LimitNOFILE = 5000
# 然后按 :wq   回车, 保存退出
 
 

6.启动多实例

方法一: 按原教程启动服务。  但这个需要以root 身份启动。。否则要输入 root用户的密码

$ systemctl start mysqld13306

$ netstat -lntup|grep mysqld
  tcp6   0   0  :::13306    :::*     LISTEN   2093/mysqld

 

 方法二:使用mysqld  加参数启动

  $ sudo /data/app/mysql5743/bin/mysqld --defaults-file=/data/13306/my.cnf --basedir=/data/app/mysql5743 --datadir=/data/13306/data --user=mysql &

正常的话会输出:

查看代码
 2023-08-13T16:04:20.299526Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2023-08-13T16:04:20.299649Z 0 [Note] --secure-file-priv is set to NULL. Operations related to importing and exporting data are disabled
2023-08-13T16:04:20.299695Z 0 [Note] /data/app/mysql5743/bin/mysqld (mysqld 5.7.43) starting as process 3730 ...
……
2023-08-13T16:04:20.397353Z 0 [Note] InnoDB: Waiting for purge to start
2023-08-13T16:04:20.447535Z 0 [Note] InnoDB: 5.7.43 started; log sequence number 2767592
2023-08-13T16:04:20.447711Z 0 [Note] InnoDB: Loading buffer pool(s) from /data/13306/data/ib_buffer_pool
2023-08-13T16:04:20.447942Z 0 [Note] Plugin 'FEDERATED' is disabled.
2023-08-13T16:04:20.451859Z 0 [Note] InnoDB: Buffer pool(s) load completed at 230814  0:04:20
2023-08-13T16:04:20.454366Z 0 [Note] Found ca.pem, server-cert.pem and server-key.pem in data directory. Trying to enable SSL support using them.
2023-08-13T16:04:20.454379Z 0 [Note] Skipping generation of SSL certificates as certificate files are present in data directory.
2023-08-13T16:04:20.454384Z 0 [Warning] A deprecated TLS version TLSv1 is enabled. Please use TLSv1.2 or higher.
2023-08-13T16:04:20.454387Z 0 [Warning] A deprecated TLS version TLSv1.1 is enabled. Please use TLSv1.2 or higher.
2023-08-13T16:04:20.460165Z 0 [Warning] CA certificate ca.pem is self signed.
2023-08-13T16:04:20.460241Z 0 [Note] Skipping generation of RSA key pair as key files are present in data directory.
2023-08-13T16:04:20.461510Z 0 [Note] Server hostname (bind-address): '*'; port: 13306
2023-08-13T16:04:20.461554Z 0 [Note] IPv6 is available.
2023-08-13T16:04:20.461565Z 0 [Note]   - '::' resolves to '::';
2023-08-13T16:04:20.461587Z 0 [Note] Server socket created on IP: '::'.
2023-08-13T16:04:20.466169Z 0 [Warning] Insecure configuration for --pid-file: Location '/data/13306' in the path is accessible to all OS users. Consider choosing a different directory.
2023-08-13T16:04:20.469754Z 0 [Note] Failed to start slave threads for channel ''
2023-08-13T16:04:20.475776Z 0 [Note] Event Scheduler: Loaded 0 events
2023-08-13T16:04:20.476023Z 0 [Note] /data/app/mysql5743/bin/mysqld: ready for connections.
Version: '5.7.43'  socket: '/data/socket/mysql13306.sock'  port: 13306  MySQL Community Server (GPL)

 

 

这里有好几个注意点:

1. 这个要用sudo  或者root 启动。。。 其他用户启动会失败,并提示没有访问数据库的权限。而且提示了  --user 只能root 才能用

查看代码
 2023-08-13T16:02:17.725021Z 0 [Warning] Can't create test file /data/13306/data/VM-4-15-centos.lower-test
2023-08-13T16:02:17.725040Z 0 [Warning] Can't create test file /data/13306/data/VM-4-15-centos.lower-test
2023-08-13T16:02:17.725302Z 0 [Warning] One can only use the --user switch if running as root

2023-08-13T16:02:17.727401Z 0 [Note] InnoDB: PUNCH HOLE support available
2023-08-13T16:02:17.727454Z 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
2023-08-13T16:02:17.727463Z 0 [Note] InnoDB: Uses event mutexes
2023-08-13T16:02:17.727471Z 0 [Note] InnoDB: GCC builtin __atomic_thread_fence() is used for memory barrier
2023-08-13T16:02:17.727477Z 0 [Note] InnoDB: Compressed tables use zlib 1.2.13
2023-08-13T16:02:17.727483Z 0 [Note] InnoDB: Using Linux native AIO
2023-08-13T16:02:17.727864Z 0 [Note] InnoDB: Number of pools: 1
2023-08-13T16:02:17.728017Z 0 [Note] InnoDB: Using CPU crc32 instructions
2023-08-13T16:02:17.730142Z 0 [Note] InnoDB: Initializing buffer pool, total size = 128M, instances = 1, chunk size = 128M
2023-08-13T16:02:17.739758Z 0 [Note] InnoDB: Completed initialization of buffer pool
2023-08-13T16:02:17.742299Z 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
2023-08-13T16:02:17.752343Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2023-08-13T16:02:17.752466Z 0 [ERROR] InnoDB: The innodb_system data file 'ibdata1' must be writable
2023-08-13T16:02:17.752481Z 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
2023-08-13T16:02:18.353012Z 0 [ERROR] Plugin 'InnoDB' init function returned error.
2023-08-13T16:02:18.353040Z 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
2023-08-13T16:02:18.353047Z 0 [ERROR] Failed to initialize builtin plugins.
2023-08-13T16:02:18.353052Z 0 [ERROR] Aborting

 

2. 报错提示没有  /data/13306/data  没有写入权限。。 所以检查 /data/13306/data  下创建的文件,是否属于mysql 用户,如果不是的话,再刷一下他们的所属用户组:

保证  /data/13306/data 是属于mysql 的, 下面文件也是 mysql 用户创建的。

$ sudo chown -R mysql.mysql /data/13306/data
$ sudo chmod -R 755 /data/13306/data

检查一下:

查看代码
 $ cd /data                                                                           
$ ll                                                                                      
total 16K
drwxrwxrwx 3 mysql mysql 4.0K Aug 13 23:06 13306
drwxrwxrwx 3 root  root  4.0K Aug 13 22:56 app
drwxrwxrwx 2 mysql mysql 4.0K Aug 14 00:04 socket
$ cd 13306
$ ll
total 8.0K
drwxr-xr-x 5 mysql mysql 4.0K Aug 14 00:04 data
-rwxr-xr-x 1 mysql mysql  202 Aug 13 23:06 my.cnf
$ cd data
$ ll
total 121M
-rw-r----- 1 mysql mysql    5 Aug 14 00:04 VM-4-15-centos.pid
-rw-r----- 1 mysql mysql   56 Aug 13 23:31 auto.cnf
-rw------- 1 mysql mysql 1.7K Aug 13 23:31 ca-key.pem
-rw-r--r-- 1 mysql mysql 1.1K Aug 13 23:31 ca.pem
-rw-r--r-- 1 mysql mysql 1.1K Aug 13 23:31 client-cert.pem
-rw------- 1 mysql mysql 1.7K Aug 13 23:31 client-key.pem
-rw-r----- 1 mysql mysql  350 Aug 13 23:56 ib_buffer_pool
-rw-r----- 1 mysql mysql  48M Aug 14 00:04 ib_logfile0
-rw-r----- 1 mysql mysql  48M Aug 13 23:31 ib_logfile1
-rw-r----- 1 mysql mysql  12M Aug 14 00:04 ibdata1
-rw-r----- 1 mysql mysql  12M Aug 14 00:04 ibtmp1
drwxr-x--- 2 mysql mysql 4.0K Aug 13 23:31 mysql
drwxr-x--- 2 mysql mysql 4.0K Aug 13 23:31 performance_schema
-rw------- 1 mysql mysql 1.7K Aug 13 23:31 private_key.pem
-rw-r--r-- 1 mysql mysql  452 Aug 13 23:31 public_key.pem
-rw-r--r-- 1 mysql mysql 1.1K Aug 13 23:31 server-cert.pem
-rw------- 1 mysql mysql 1.7K Aug 13 23:31 server-key.pem
drwxr-x--- 2 mysql mysql  12K Aug 13 23:31 sys

 3. 另外, my.cnf 需要是 755, 而不能是777 权限。不然启动时第一行会输出以下警告,说明这个配置被无视掉:

mysqld: [Warning] World-writable config file '/data/13306/my.cnf' is ignored.

$ sudo chmod -R 755 /data/13306/my.cnf

 

4. 还有。。启动参数, mysqld 后面要紧跟 --defaults-file。  并且 这里是两根横杠。。。不要被有些博客误导了。

比如这篇:https://www.cnblogs.com/suiyueqiannian/p/10337935.html  

里面用了 ./bin/mysqld_safe –defaults-file=/usr/local/mysql-5.7.24/my.cnf   这样的写法是有问题的。。。起码在我的mysql-5.7.43会提示 

sed: -e expression #1, char 32: unknown option to `s'
/data/app/mysql5743/bin/mysqld_safe: line 626: /usr/local/mysql/data/VM-4-15-centos.err: No such file or directory
Logging to '/usr/local/mysql/data/VM-4-15-centos.err'.
2023-08-13T16:24:20.933703Z mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
/data/app/mysql5743/bin/mysqld_safe: line 144: /usr/local/mysql/data/VM-4-15-centos.err: No such file or directory
/data/app/mysql5743/bin/mysqld_safe: line 198: /usr/local/mysql/data/VM-4-15-centos.err: No such file or directory
/data/app/mysql5743/bin/mysqld_safe: line 885: /usr/local/mysql/data/VM-4-15-centos.err: No such file or directory
2023-08-13T16:24:20.942681Z mysqld_safe mysqld from pid file /usr/local/mysql/data/VM-4-15-centos.pid ended
/data/app/mysql5743/bin/mysqld_safe: line 144: /usr/local/mysql/data/VM-4-15-centos.err: No such file or directory

 

mysqld_safe 比 mysqld  会多启动一个守护进程,使用更安全。。。这里先用基本的 mysqld 启动起来再说。 

 

6.5 检查是否启动成功

$ sudo netstat -lntup|egrep 'mysql' 
tcp6       0      0 :::13306                :::*                    LISTEN      3730/mysqld   

 

 

7.绝对路径登录MySQL多实例(注意要以root 登录,或者加sudo)

$ /data/app/mysql5743/bin/mysql -S /data/socket/mysql13306.sock                            
2023-08-13T16:34:52.099239Z 2 [Note] Access denied for user 'tidus'@'localhost' (using password: NO)
ERROR 1045 (28000): Access denied for user 'tidus'@'localhost' (using password: NO)

$ sudo /data/app/mysql5743/bin/mysql -S /data/socket/mysql13306.sock                                                         1 ✘    tidus@VM-4-15-centos 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.43 MySQL Community Server (GPL)
……
mysql>

 

 参考 https://blog.csdn.net/u010898329/article/details/83064373

或者 :https://www.cnblogs.com/fivedays/p/12638969.html

设置 mysql 的root 密码: 

 #这里重设mysql 的root 密码
 mysql>alter user 'root'@'localhost'  identified by '123456';
 mysql> use mysql;
 mysql> update user set user.Host='%' where user.User='root';
 mysql> flush privileges;
 mysql> quit

  

8.设置mysql 的启动关闭脚本

$ cd /data/app
$ vim startMysql57.sh
# 按i 进入插入模式, 输入
sudo  /data/app/mysql5743/bin/mysqld_safe --defaults-file=/data/13306/my.cnf --basedir=/data/app/mysql5743 --datadir=/data/13306/data --user=mysql & 
#  按 :wq  保存退出
$  chmod +x ./startMysql57.sh

$  vim stopMysql57.sh
# 按i 进入插入模式, 输入
/data/app/mysql5743/bin/mysqladmin -u root  --socket=/data/socket/mysql13306.sock --port=13306 -p shutdown
#  按 :wq  保存退出
$  chmod +x ./stopMysql57.sh

但这个退出脚本, 需要交互式输入mysql 的root 用户密码。。回头改进下