zoukankan      html  css  js  c++  java
  • 6. MySQL

    MySQL下载地址:https://downloads.mysql.com/archives/community/

    MySQL单实例 - 多实例安装配置: https://www.cnblogs.com/Neeo/articles/13527500.html

    MySQL多实例的本质
    在一台机器上开启多个不同的MySQL实例,也就是各实例监听不同的端口,提供不同的服务。
    多个实例公用一套MySQL安装程序,启动程序和配置文件可以是一个也可以是多个(推荐多个);各自的数据文件隔离;逻辑上各实例彼此隔离。

    为什么要使用多实例?优缺点?

    • 物理机性能强大,单个实例无法充分利用硬件资源
    • 资源隔离,减少相互影响
    • 分担连接数,MySQL随着连接数的上升,性能会下降
    • 更充分的利用资源,不同业务错高峰混跑
    • 有优点,也有缺点,比如多个实例会存在资源相互抢占的问题,当某个实例的并发较高或者存在慢查询时,它会消耗更多的硬件资源,这就可能影响到别的实例的性能

    多实例的应用场景

    • 资金比较紧张的公司
    • 并发访问不大的业务

    MySQL多实例常见配置方案

    • (推荐)通过多个配置文件及多个启动程序来实现多实例。
    • 单一配置文件方案,即一个配置文件中写多个实例的配置。

    必要的准备:

    目录规划:

    /opt/software/mysql   # MySQL的安装目录
    /data/mysql/    # 所有的MySQL实例的数据目录、备份目录、日志目录,都在该目录下,各个实例以端口号命名
    /etc/my.conf    # MySQL 3306实例的默认配置文件
    

    依赖下载:

    # 如果你的系统曾经安装过mariadb,请先卸载
    yum remove -y mariadb* 
    yum install -y epel-release
    yum update -y
    yum install -y cmake gcc-c++ ncurses-devel perl-Data-Dumper boost-doc boost-devel libaio-devel
    yum install -y net-tools tree bash-completion lrzsz
    
    
    # 友情提示:如果是小白初次在虚拟机上搞,记得现在就拍个快照!!!!
    

    1.单实例配置

    注意,后续的实例都基于该实例,所以,我们的一些操作要细致

    MySQL安装

    # 创建目录
    [root@cs ~]# mkdir -p /opt/software && cd /opt/software
    [root@cs software]# pwd
    /opt/software
    
    # 下载或上传MySQL安装包
    [root@cs software]# wget https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
    [root@cs software]# rz
    
    # 安装解压MySQL安装包
    [root@cs software]# tar -xvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
    # 改安装目录名称
    [root@cs software]# mv mysql-5.7.20-linux-glibc2.12-x86_64 mysql
    # 删除安装包
    [root@cs software]# rm -rf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz && ls
    

    添加环境变量

    # path是安装目录下的bin目录
    [root@cs software]# vim /etc/profile
    
    export PATH=/opt/software/mysql/bin:$PATH
    
    [root@cs software]# source /etc/profile
    

    创建相关目录和MySQL用户

    MySQL服务运行在非root用户环境,所以,我们先创建一个mysql用户,然后在创建相关的数据目录:

    # 添加普通用户mysql
    [root@cs software]# useradd mysql
    # 创建联级数据目录
    [root@cs software]# mkdir -p /data/mysql/330{6,7,8,9}/{data,logs,backup}
    # 查看目录结构
    [root@cs software]# tree /data/mysql/330*
    
    # 修改安装目录和储存目录的权限
    [root@cs software]# chown -R mysql:mysql /opt/software/mysql/*
    [root@cs software]# chown -R mysql:mysql /data/mysql/*
    

    初始化数据库

    # 保证存放数据的目录是空的,避免不必要的问题
    [root@cs software]# rm -rf /data/mysql/3306/data/*
    
    # 初始化--initialize-insecure 不安全的初始化过程
    [root@cs software]# mysqld --initialize-insecure  --user=mysql --basedir=/opt/software/mysql --datadir=/data/mysql/3306/data
    
    # 一堆"Warning",不要管它。
    

    添加配置文件

    cat  > /etc/my.cnf <<EOF
    [mysqld]
    user=mysql
    basedir=/opt/software/mysql
    datadir=/data/mysql/3306/data
    server_id=6
    port=3306
    socket=/tmp/mysql.sock
    log_error=/data/mysql/3306/logs/mysql.log
    [mysql]
    socket=/tmp/mysql.sock
    EOF
    
    # 使用/opt/software/mysql/support-files/mysql.server启动服务
    [root@cs software]# cd /opt/software/mysql/support-files/
    
    
    

    使用systemctl管理MySQL服务

    cat  > /etc/systemd/system/mysqld.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/etc/my.cnf
    LimitNOFILE = 5000
    EOF
    
    # 你可以使用systemctl命令来管理MySQL服务了:
    # 启动 - 重启 - 停止 - 状态 - 开机自启 - 关闭开机自启
    [root@cs ~]# systemctl start/restart/stop/status/enable/disable mysqld
    

    测试 : 创建远程用户和创建密码再配置相关权限:

    # 启动
    [root@cs software]# systemctl start mysqld
    # 查找
    [root@cs software]# find / -name mysql.sock
    /tmp/mysql.sock
    # 通过端口查看启动情况
    [root@cs software]# netstat -lnp|grep 330
    
    # 创建远程用户和创建密码再配置相关权限:
    [root@cs software]# mysql -uroot -p
    
    mysql> grant all on *.* to root@'localhost' identified by '123';
    mysql> grant all on *.* to root@'%' identified by '123';
    mysql> flush privileges;
    
    # 查看mysql用户
    mysql> select user,host from mysql.user
    
    

    连接数据库

    # 1.本地文件连接
    [root@cs software]# mysql -uroot -p123 -S /tmp/mysql.sock
    # 2.远程连接
    [root@cs software]# mysql -uroot -p123 -h 192.168.189.135 P3306
    
    

    2.单机多实例配置

    必要的准备
    停止单实例的运行,并且备份单实例的配置文件(防止多实例初始化时读取这个单实例配置文件),后续多实例配置完事后,再重新还原这个配置文件:

    [root@cs software]# systemctl stop mysqld
    [root@cs software]# mv /etc/my.cnf /etc/my.cnf.bak
    
    

    准备多实例的数据目录
    由于多实例的数据目录已经在单实例那里创建成功了,这一步就可以略过:3307,3308,3309
    每台实例以端口命名,端口名目录下存放配置文件,其中的data目录存放各自的数据。

    为每个实例创建配置文件

    # 配置文件放在不同的数据端口文件里,
    # 修改不同的端口port,服务id,本地启动文件socket路径
    
    cat > /data/mysql/3307/my.cnf <<EOF
    [mysqld]
    basedir=/opt/software/mysql
    datadir=/data/mysql/3307/data
    socket=/data/mysql/3307/mysql.sock
    log_error=/data/mysql/3307/logs/mysql.log
    port=3307
    server_id=7
    [client]
    socket=/data/mysql/3307/mysql.sock
    EOF
    
    cat > /data/mysql/3308/my.cnf <<EOF
    [mysqld]
    basedir=/opt/software/mysql
    datadir=/data/mysql/3308/data
    socket=/data/mysql/3308/mysql.sock
    log_error=/data/mysql/3308/logs/mysql.log
    port=3308
    server_id=8
    [client]
    socket=/data/mysql/3308/mysql.sock
    EOF
    
    cat > /data/mysql/3309/my.cnf <<EOF
    [mysqld]
    basedir=/opt/software/mysql
    datadir=/data/mysql/3309/data
    socket=/data/mysql/3309/mysql.sock
    log_error=/data/mysql/3309/logs/mysql.log
    port=3309
    server_id=9
    [client]
    socket=/data/mysql/3309/mysql.sock
    EOF
    
    

    完事之后,各自的数据目录下就有了配置文件了,别忘了再授权下:

    [root@cs software]# chown -R mysql.mysql /data/mysql/*
    
    

    多实例的初始化

    与单实例一下,修改一下不同实例的数据目录,安装目录一样

    mysqld --initialize-insecure  --user=mysql --datadir=/data/mysql/3307/data --basedir=/opt/software/mysql
    mysqld --initialize-insecure  --user=mysql --datadir=/data/mysql/3308/data --basedir=/opt/software/mysql
    mysqld --initialize-insecure  --user=mysql --datadir=/data/mysql/3309/data --basedir=/opt/software/mysql
    
    

    使用systemctl管理多实例

    下面这几个配置文件内容都是来自于mysqld.service文件,然后修改了各自实例的配置文件路径:--defaults-file

    cat  > /etc/systemd/system/mysqld3307.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3307/my.cnf
    LimitNOFILE = 5000
    EOF
    
    cat  > /etc/systemd/system/mysqld3308.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3308/my.cnf
    LimitNOFILE = 5000
    EOF
    
    cat  > /etc/systemd/system/mysqld3309.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3309/my.cnf
    LimitNOFILE = 5000
    EOF
    
    

    启动测试

    [root@cs software]# systemctl start mysqld3307.service
    [root@cs software]# systemctl start mysqld3308.service
    [root@cs software]# systemctl start mysqld3309.service
    
    # 查看
    [root@cs software]# find / -name mysql.sock
    /data/mysql/3307/mysql.sock
    /data/mysql/3308/mysql.sock
    /data/mysql/3309/mysql.sock
    [root@cs software]# netstat -lnp|grep 330
    
    # 恢复单实例的配置文件,启动3306服务
    [root@cs software]# mv /etc/my.cnf.bak /etc/my.cnf
    [root@cs software]# systemctl start mysqld.service
    
    

    连接数据库

    # 1.本地连接
    # 注意,此时的登录密码都为空,直接回车即可
    # 3306端口服务
    [root@cs software]# mysql -uroot -p -S /tmp/mysql.sock -e "select @@server_id"
    # 3307端口服务
    [root@cs software]# mysql -uroot -p -S /data/mysql/3307/mysql.sock -e "select @@server_id"
    
    # 2.远程连接
    # 首先,这里我们创建远程用户和创建密码再配置相关权限
    # 分别登录到各自的实例中,此时密码还未空,直接回车,然后执行下面命令,进行创建用户并授权
    grant all on *.* to root@'localhost' identified by '123';
    grant all on *.* to root@'%' identified by '123';
    flush privileges;
    
    # 注意,上面的创建用户和授权命令仅适用于MySQL8.0一下,因为从MySQL8.0开始,创建用户和授权分为两步操作,这点需要注意。
    # 创建完成后,就可以通过密码进行登录了:
    [root@cs software]# mysql -uroot -p123 -h192.168.189.135 -P3306
    [root@cs software]# mysql -uroot -p123 -h192.168.189.135 -P3307
    [root@cs software]# mysql -uroot -p123 -h192.168.189.135 -P3308
    [root@cs software]# mysql -uroot -p123 -h192.168.189.135 -P3309
    
    
    cat  > /etc/systemd/system/mysqld3307.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3307/my.cnf
    LimitNOFILE = 5000
    EOF
    
    cat  > /etc/systemd/system/mysqld3308.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3308/my.cnf
    LimitNOFILE = 5000
    EOF
    
    cat  > /etc/systemd/system/mysqld3309.service <<EOF
    [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=/opt/software/mysql/bin/mysqld --defaults-file=/data/mysql/3309/my.cnf
    LimitNOFILE = 5000
    EOF
    
    
  • 相关阅读:
    loj6145. 「2017 山东三轮集训 Day7」Easy
    CF1019E Raining season
    CF1261F Xor-Set
    Python笔试——递归算法学习
    Python笔试——贪心算法
    Python笔试——万万没想到抓捕孔连顺
    Python笔试——雀魂启动
    Python学习——正则表达式
    Python笔试——毕业旅行问题
    Python笔试——Stern-Brocot tree
  • 原文地址:https://www.cnblogs.com/jia-shu/p/14805507.html
Copyright © 2011-2022 走看看