1)准备工作
首先去MariaDB官网下载安装包
官网下载链接
因为这里是编译安装,所以暂时不针对某一系统的二进制包进行下载,这里下载源码包mariadb-10.2.29.tar.gz,下载之后上传至服务器
查看是否为纯净的系统
[root@centos7K ~]#rpm -qa mariadb*
mariadb-libs-5.5.60-1.el7_5.x86_64
安装相关依赖包
yum install bison bison-devel zlib-devel libcurl-devel
libarchive-devel boostdevel gcc gcc-c++ cmake ncurses-devel
gnutls-devel libxml2-devel openssldevel libevent-devel libaio-devel openssl-devel -y
[root@centos7K ~]#yum install -y bison bison-devel zlib-devel libcurl-devel libarchive-devel boostdevel
gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssldevel libevent-devel libaio-devel openssl-devel
做准备用户和数据目录
useradd –r –s /sbin/nologin –d /data/mysql/ mysql
[root@centos7K ~]#useradd -r -s /sbin/nologin mysql
家目录后面会自动生成。所以在这里指不指定都行
下载并解压缩源码包
源码解压缩习惯放在/usr/local/src/这个文件夹下面,临时用的一个目录,源码编译完了就没有用了
[root@centos7K ~]#tar xvf mariadb-10.2.29.tar.gz -C /usr/local/src/
[root@centos7K ~]#cd /usr/local/src/
[root@centos7K src]#ls
mariadb-10.2.29
[root@centos7K src]#du -sh mariadb-10.2.29/
512M mariadb-10.2.29/
解压缩之后从原来的70多M到了512M.
2)编译过程
进入到解压好的文件夹中,执行cmake 其中 \ 表示一行没有写完,另起一行继续写的意思
模拟八核开始编译
查看对应的目录是否生成了相关的文件
之后和二进制安装编译之后的操作步骤差不多
3)配置相关启动数据库文件
修改bin下的应用程序PATH路径
添加配置文件
在这里编译的时候就已经指定路径了,所以这里不需要修改 /etc/my.cnf 中的内容
配置启动服务脚本
在这里我们用的是源码编译,所以没有systemd 只有mysql.server
创建数据库配置
只需要执行自带的mysql_install_db 就会自动生成,这里执行的时候最好用绝对路径
[root@centos7K mysql]#/app/mysql/scripts/mysql_install_db --datadir=/data/mysql --user=mysql
生成之后所属组和所有者都已经自动设置好,对应权限也是700,较为安全
最后启动
安全加固
[root@centos7K mysql]#mysql_secure_installation
这里以centos密码为例。
实现Mysql多实例
实验目的
CentOS 7.6 yum安装mariadb并实现三个实例
物理机性能强大,单个项目无法把资源使用完
资源隔离,减少相互影响
分担连接数 MySQL随着连接数上升,性能会出现下降
更充分的利用资源 不同的业务错高峰混跑
环境要求
一台主机
系统:CentOS 7.X
前提准备
关闭SElinux
关闭防火墙
时间同步
安装二进制编译数据库
实验步骤
首先去MariaDB官网下载安装包
官网下载链接
准备好一键安装脚本以及对应的配置文件
[root@centos7K data]#cd /data/
[root@centos7K data]#ls
mariadb-10.2.29-linux-x86_64.tar.gz mariadb-install.sh my.cnf
一共三个文件,一个是我们下载的二进制安装包mariadb-10.2.29-linux-x86_64.tar.gz,一个是我们自己写的一键安装脚本mariadb-install.sh,一个是服务端的配置文件my.cnf
[root@centos7K data]#cat my.cnf
[mysqld]
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0
datadir=/data/mysql
innodb_file_per_table=1
[client]
port=3306
socket=/var/lib/mysql/mysql.sock
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/tmp/mysql.pid
[root@centos7K data]#cat mariadb-install.sh
#!/bin/bash
#mysql-install.sh
DIR=`pwd`
NAME="mariadb-10.2.29-linux-x86_64.tar.gz"
FULL_NAME=${DIR}/${NAME}
DATA_DIR="/data/mysql"
yum install vim gcc gcc-c++ wget autoconf net-tools lrzsz iotop lsof iotop bash-completion -y
yum install curl policycoreutils openssh-server openssh-clients postfix libaio-devel -y
if [ -f ${FULL_NAME} ];then
echo "安装文件存在"
else
echo "安装文件不存在"
exit 3
fi
if [ -h /usr/local/mysql ];then
echo "Mysql 已经安装"
exit 3
else
tar xvf ${FULL_NAME} -C /usr/local/
cd /usr/local/
ln -sv mariadb-10.2.29-linux-x86_64 mysql
if id mysql;then
echo "mysql 用户已经存在,跳过创建用户过程"
else
useradd -r -s /sbin/nologin mysql
fi
if id mysql;then
chown -R mysql.mysql /usr/local/mysql/
if [ ! -d /data/mysql ];then
mkdir -pv /data/mysql && chown -R mysql.mysql /data -R
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod a+x /etc/init.d/mysqld
cp ${DIR}/my.cnf /etc/my.cnf
ln -sv /usr/local/mysql/bin/mysql /usr/bin/mysql
/etc/init.d/mysqld start
else
echo "MySQL数据目录已经存在,"
exit 3
fi
fi
fi
echo 'PATH=/usr/local/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
给一键安装脚本mariadb-install.sh加执行权限直接一键安装
[root@centos7K data]#chmod +x mariadb-install.sh
[root@centos7K data]#bash -n mariadb-install.sh #检查脚本语法
[root@centos7K data]#bash mariadb-install.sh #运行一键安装脚本
查看端口3306是否打开,打开则说明数据库服务以及成功安装并且启动
实现多实例
现在在这个基础之上实现多实例
计划把多实例的服务跑到不同的端口3306 3307 3308
分别创建各自的子目录
查看是否mysql用户已经存在,不存在则需要创建
[root@centos7K data]#id mysql #查看是否mysql用户已经存在,不存在则需要创建
uid=998(mysql) gid=996(mysql) groups=996(mysql)
[root@centos7K data]#chown -R mysql.mysql /mysql #修改所有者和属组
生成数据库文件
[root@centos7K data]#ll /usr/local/mysql/scripts/
total 20
-rwxr-xr-x 1 mysql mysql 19486 Nov 6 19:22 mysql_install_db
[root@centos7K data]#/usr/local/mysql/scripts/mysql_install_db --datadir=/mysql/3306/data --user=mysql
[root@centos7K data]#/usr/local/mysql/scripts/mysql_install_db --datadir=/mysql/3307/data --user=mysql
[root@centos7K data]#/usr/local/mysql/scripts/mysql_install_db --datadir=/mysql/3308/data --user=mysql
随便找一个数据库查看是否生成数据库文件以及所属组,所有者是否都是指定的mysql
配置文件
[root@centos7K data]#cp /etc/my.cnf /mysql/3306/etc/
[root@centos7K data]#vim /mysql/3306/etc/my.cnf
[mysqld]
port=3306
socket=/mysql/3306/socket/mysqld.sock
datadir=/mysql/3306/data
innodb_file_per_table=1
[mysqld_safe]
log-error=/mysql/3306/log/mysqld.log
pid-file=/mysql/3306/pid/mysqld.pid
复制参考3306来进行其他数据库的修改
[root@centos7K data]#cp /mysql/3306/etc/my.cnf /mysql/3307/etc/
[root@centos7K data]#cp /mysql/3306/etc/my.cnf /mysql/3308/etc/
[root@centos7K data]#sed -i 's/3306/3307/' /mysql/3307/etc/my.cnf
[root@centos7K data]#sed -i 's/3306/3308/' /mysql/3308/etc/my.cnf
[root@centos7K data]#cat /mysql/3307/etc/my.cnf
[mysqld]
port=3307
socket=/mysql/3307/socket/mysqld.sock
datadir=/mysql/3307/data
innodb_file_per_table=1
[mysqld_safe]
log-error=/mysql/3307/log/mysqld.log
pid-file=/mysql/3307/pid/mysqld.pid
[root@centos7K data]#cat /mysql/3308/etc/my.cnf
[mysqld]
port=3308
socket=/mysql/3308/socket/mysqld.sock
datadir=/mysql/3308/data
innodb_file_per_table=1
[mysqld_safe]
log-error=/mysql/3308/log/mysqld.log
pid-file=/mysql/3308/pid/mysqld.pid
准备启动脚本程序
启动脚本需要自己准备好
注意:启动脚本需要放在对应bin文件夹下面
[root@centos7K data]#cd /mysql/3306/bin/
[root@centos7K bin]#ls
mysqld
[root@centos7K bin]#vim mysqld
[root@centos7K bin]#cat mysqld
#!/bin/bash
port=3306
mysql_user="root"
mysql_pwd=""
cmd_path="/usr/local/mysql/bin"
mysql_basedir="/mysql"
mysql_sock="${mysql_basedir}/${port}/socket/mysqld.sock"
function_start_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "Starting MySQL...\n"
${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null &
else
printf "MySQL is running...\n"
exit
fi
}
function_stop_mysql()
{
if [ ! -e "$mysql_sock" ];then
printf "MySQL is stopped...\n"
exit
else
printf "Stoping MySQL...\n"
${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown
fi
}
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: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n"
esac
把之前开启的数据库关闭,查看3306端口是否打开来确认是否开启或者关闭来确认数据库是否提供服务
[root@centos7K bin]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 80 :::3306 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@centos7K bin]#service mysqld stop
Stopping mysqld (via systemctl): [ OK ]
[root@centos7K bin]#ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
LISTEN 0 128 :::22 :::*
LISTEN 0 100 ::1:25 :::*
[root@centos7K bin]#chmod +x mysqld
[root@centos7K bin]#bash -n mysqld
加对应的执行权限,检查一下启动安装脚本语法
[root@centos7K bin]#bash mysqld start #这里脚本文件绝对路径是/mysql/3306/bin/mysqld start
这里尝试是否能够让3306,如果能够成功,直接拷贝启动脚本mysqld到其他实例中实现多实例
尝试连接一下数据库3306
[root@centos7K bin]#mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
这里我们默认的套接字连接不在这里,需要自己指定
[root@centos7K bin]#mysql -S /mysql/3306/socket/mysqld.sock
这里需要重复一句,启动服务脚本是放在/mysql/3306/bin/下的mysqld
用sed命令修改文件对应的不同端口号
[root@centos7K bin]#cp mysqld /mysql/3307/bin/
[root@centos7K bin]#cp mysqld /mysql/3308/bin/
[root@centos7K bin]#sed -i 's/3306/3307/' /mysql/3307/bin/mysqld
[root@centos7K bin]#sed -i 's/3306/3308/' /mysql/3308/bin/mysqld
启动其他多实例数据库
[root@centos7K bin]#cd
[root@centos7K ~]#/mysql/3307/bin/mysqld start
Starting MySQL...
[root@centos7K ~]#/mysql/3308/bin/mysqld start
Starting MySQL...
[root@centos7K ~]#ss -ntl
尝试连接,但是需要指定每一个不同的多实例的socket路径
[root@centos7K ~]#mysql -S /mysql/3307/socket/mysqld.sock
[root@centos7K ~]#mysql -S /mysql/3308/socket/mysqld.sock
数据库停机服务
停用数据库可以用mysql/330x/bin/mysqld 脚本
其中听用的时候需要输入密码,这个密码来自于这个脚本中mysql_pwd=" ",默认是空,可以自己对其进行配置。
[root@centos7K bin]#/mysql/3306/bin/mysqld stop
[root@centos7K bin]#/mysql/3307/bin/mysqld stop
[root@centos7K bin]#/mysql/3308/bin/mysqld stop
[root@centos7K bin]#ss -ntl
扩展:修改多实例的密码
改不同的多实例密码用mysqladmin ,区分不同的实例用套接字
因为在之前的二进制一键安装配置脚本最后加入了PATH变量如下,所以直接可以用命令不用写其路径
echo ‘PATH=/usr/local/mysql/bin:$PATH’ > /etc/profile.d/mysql.sh
[root@centos7K ~]#mysqladmin -S /mysql/3306/socket/mysqld.sock password centos3306
[root@centos7K ~]#mysqladmin -S /mysql/3307/socket/mysqld.sock password centos3307
[root@centos7K ~]#mysqladmin -S /mysql/3308/socket/mysqld.sock password centos3308
在这里安全脚本跑不了,路径不一致。需要手工改。