centos7 mysql多实例

发布于:2023-01-15 ⋅ 阅读:(446) ⋅ 点赞:(0)

一般来说,我们生产环境的 MySQL 是安装在 RHEL/CentOS 7 下的,常见安装部署的方法有三种:

  • yum/rpm 安装
  • 二进制 安装
  • 源码 安装

生产环境建议使用二进制安装法,其优点是部署简单、快速、方便,并且相对"yum/rpm 安装" 方法能更方便地自定义文件存放的目录结构,方便用脚本批量部署,方便日后运维管理。

在生产上很少用到源码编译安装 MySQL, 最主要的原因,就是编译安装太慢了,二进制部署只需要几十秒。并且,源码编译安装容易遇到一些不好解决的编译问题。

那么什么时候需要用到编译安装呢?

当我们需要修改 MySQL 源代码以修复功能、修改功能、新增功能时,当我们想修改 MySQL 默认设定时,当我们需要对 MySQL 做 debug 时,我们就需要用到编译安装。

  • 改源码
  • 改默认设定
  • debug

话不多说,下面看看我们的实战步骤,如何编译安装 MySQL 的最新版本。

编译安装 MySQL8.0.22

我们的目标

1. 通过实验,在 CentOS 7.9 (minimal 安装版) 操作系统下,编译安装 MySQL 社区版的最新版本 8.0.22

2. 修改源代码,实现一个假的 MySQL 版本号。

3. 通过修改默认设定,禁用不常用的两个存储引擎,FEDERATED 和 ARCHIVE;修改默认设定,使默认读的是 my.cnf,取代 etc/my.cnf

4. 让 MySQL 可以 debug。

01 安装操作

# 安装 cmake

cd root

yum -y install wget

wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.tar.gz

tar zxvf cmake-3.8.2-Linux-x86_64.tar.gz

mv cmake-3.8.2-Linux-x86_64 /usr/local/cmake

echo -e "\nexport PATH=/usr/local/cmake/bin:\$PATH" >>/etc/profile

source /etc/profile

# 安装gcc

## 安装编译安装时需要用的工具包

yum -y install bzip2 gcc gcc-c++

gcc下载

正在上传…重新上传取消

wget http://mirror.hust.edu.cn/gnu/gcc/gcc-5.5.0/gcc-5.5.0.tar.gz

tar zxvf gcc-5.5.0.tar.gz

cd gcc-5.5.0

## 下载mpfr、gmp、mpc、isl等依赖包

./contrib/download_prerequisites

## 开始编译安装 gcc(1.5h)

mkdir build && cd build

../configure --prefix=/usr/ --enable-checking=release \

--enable-languages=c,c++ --disable-multilib

make -j4 && make install

## 注意了,上面那个 prefix 必须用 usr/,以便覆盖掉旧版的 gcc ,以免编译程序找不到新版 gcc

## 检查验证 gcc 版本

gcc -v

# 安装 ncurses-devel、bison、openssl-devel

yum -y install ncurses-devel bison openssl-devel

下载源代码

cd /root/

wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.22.tar.gz

编译安装

tar zxvf mysql-boost-8.0.22.tar.gz

cd mysql-8.0.22

# cmake(2h,如果提示没有这个命令,那么应该是要用绝对路径执行/usr/local/cmake/cmake-3.8.2-Linux-x86_64/bin/cmake)

cmake . \

-DWITH_BOOST=./boost/ \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/usr/local/mysql/data \

#-DMYSQL_DATADIR=/data/mysql/mysql3306/data \

#-DMYSQL_DATADIR=/data/mysql/mysql3307/data \

-DSYSCONFDIR=/ \

-DWITH_DEBUG=1 \

-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \

-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \

-DFORCE_INSOURCE_BUILD=1

##-DWITH_BOOST 编译指定boost

##-DCMAKE_INSTALL_PREFIX MYSQL安装环境目录

##-DMYSQL_DATADIR MYSQL数据存放路径

## SYSCONFDIR=/ # 修改读取 my.cnf 的路径

## WITH_DEBUG=1 # 可 debug 的版本

## WITHOUT_FEDERATED_STORAGE_ENGINE=1 \ # 摘掉 FEDERATED 存储引擎

## WITHOUT_ARCHIVE_STORAGE_ENGINE=1 \ # 摘掉 ARCHIVE 存储引擎

# 编译安装

make -j4 && make install

报错

这个报错是内存不足,需要扩大内存。增加内存 或者 先关闭占用内存大的服务

MySQL 的编译是有进度条的,等待吧。

完成编译安装了~

配置环境变量

echo -e "export PATH=/usr/local/mysql/bin:\$PATH" >>/etc/profile

source /etc/profile

验证

[root@localhost mysql-8.0.22]# mysql -V

mysql Ver 100.9.99 for Linux on x86_64 (Source distribution)

02 配置操作

建组建用户

groupadd mysql

useradd -M -g mysql -s /sbin/nologin -d /usr/local/mysql mysql

创建目录结构

mkdir -p /data/mysql/mysql3306/{data,logs,tmp}

mkdir -p /data/mysql/mysql3307/{data,logs,tmp}

chown mysql:mysql /data/mysql/mysql3306/ -R

chown mysql:mysql /data/mysql/mysql3307/ -R

初始化实例

cd /data/mysql/mysql3306/data/

#如果两个实例那么就是以下区分开来的初始化

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/mysql3306/data/

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql/ --datadir=/data/mysql/mysql3307/data/

#以下初始化为通用,不区分实例的初始化

mysqld --initialize-insecure

准备配置文件(3306改为3307即可,3307的server_id=3)

vi my.cnf

[client]

port=3306

#客户端连接socket,必须与服务端的socket使用同一个

socket=/data/mysql/mysql3306/mysql.sock

[mysqld]

user = mysql

port = 3306

server-id = 1

basedir = /usr/local/mysql

datadir = /data/mysql/mysql3306/data

tmpdir = /data/mysql/mysql3306/tmp

socket = /data/mysql/mysql3306/mysql.sock

log_error = /data/mysql/mysql3306/error.logvi

给权限:

chown mysql:mysql my.cnf

启动 MySQL双实例

mysqld_safe --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &

mysqld_safe --defaults-file=/data/mysql/mysql3307/data/my.cnf 2>&1 >/dev/null &

******************************************************************************************************************

(1)报错

按照下面操作会报错:

mysqld --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &

mysqld --defaults-file=/data/mysql/mysql3307/data/my.cnf 2>&1 >/dev/null &

启动3307实例报错:

解决:

这个文件存在,应该是因为存在了sock的锁文件,导致启动的时候不能创建该文件导致的失败,删除或改名备份后,再次启动正常。(每次都需要删除,很烦人)

cd /tmp/

rm -rf mysql.sock.lock

(2)报错

2022-03-31T01:33:48.899180Z mysqld_safe error: log-error set to '/data/mysql/mysql3309/error.logvi', however file don't exists. Create writable for user 'mysql'.

解决:

意思是/data/mysql/mysql3309没有error.logvi文件,创建给权限即可:

touch /data/mysql/mysql3309/error.logvi

chown mysql.mysql /data/mysql/mysql3309/error.logvi

*****************************************************************************************************************

登录进入mysql数据库内

mysql -S /data/mysql/mysql3306/mysql.sock

mysql -S /data/mysql/mysql3307/mysql.sock

为mysql设置密码(需要进行设置密码后后续才可以把服务快速关停:以下后面两个命令后直接加入password '123123')

mysqladmin -u root -S /data/mysql/mysql3306/mysql.sock

mysqladmin -u root -S /data/mysql/mysql3307/mysql.sock

带密码登录不同实例数据库的方法

mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock

mysql -uroot -p123123 -S /data/mysql/mysql3307/mysql.sock

************************************************************************

停止MySQL不同实例服务的实质命令。

停止3306实例的命令如下:mysqladmin -uroot -p123123 -S /data/3306/mysql.sock shutdown

停止3307实例的命令如下:mysqladmin -uroot -p123123 -S /data/3307/mysql.sock shutdown

************************************************************************

脚本编辑:

vi /data/mysql/mysql3306/mysql(chown mysql:mysql mysql && chmod 700 mysql)

#!/bin/bash

###############################################

#this scripts is created by Mr.wu at 2022-03-27

port=3306

mysql_user="root"

mysql_pwd="123123" #这里需要修改为用户的实际密码

CmdPath="/usr/local/mysql/bin"

mysql_sock="/data/mysql/mysql${port}/mysql.sock"

#startup function

function_start_mysql(){

if [ ! -e "$mysql_sock" ];then

printf "Starting MySQL....\n"

/bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/mysql/mysql${port}/data/my.cnf 2>&1 >/dev/null &

else

printf "MySQL is running...\n"

exit

fi

}

#stop function

function_stop_mysql(){

if [ ! -e "$mysql_sock" ];then

printf "MySQL is stopped...\n"

exit

else

printf "Stoping MySQL...\n"

${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/mysql/mysql${port}/mysql.sock shutdown

fi

}

#restart function

function_restart_mysql(){

printf "Restarting MySQL...\n"

function_stop_mysql

sleep 2

function_start_mysql

}

case $1 in

start)

function_start_mysql

;;

stop)

function_stop_mysql

;;

restart)

function_restart_mysql

;;

*)

printf "Usage: /data/mysql/mysql${port}/mysql{start|stop|restart}\n"

esac

启动方式:(备注:脚本直接运行了双实例这个步骤:mysqld_safe --defaults-file=/data/mysql/mysql3306/data/my.cnf 2>&1 >/dev/null &)(然后进入数据库内使用命令:mysql -uroot -p123123 -S /data/mysql/mysql3306/mysql.sock)

/data/mysql/mysql3306/mysql start

/data/mysql/mysql3306/mysql stop

配置MySQL多实例数据库开机自启动

echo "#mysql multi instances" >> /etc/rc.local

echo "/data/mysql/mysql3306/mysql start" >> /etc/rc.local

echo "/data/mysql/mysql3307/mysql start" >> /etc/rc.local


网站公告

今日签到

点亮在社区的每一天
去签到