zoukankan      html  css  js  c++  java
  • MySQL多实例应用与实战

    MySQL多实例安装配置

    什么是MySQL多实例?

           多实例就是在一台机器上开启多个不同服务端口,运行多个MySQL服务进程,这些服务通过进程通过不同饿socket监听不同的服务端口来提供各自的服务

           这些MySQL多实例是公用一套MySQL安装程序,使用不同的my.conf配置文件,启动文件,数据文件。在提供服务同时,多实例MySQL在逻辑上看来就是各自独立的。但是他们是公用资源,所以会有影响。

    多实例的作用与问题

    1、 有效的利用服务器资源

    当单个服务器资源有剩余时,可以充分利用剩余资源提供更多服务。

    2、 节约服务器资源

    当资金紧张但是数据库又需要各自尽量独立提供给服务,而且需要主从同步等技术时,多实例就很适合

    3、 资源互相抢占问题

    当某个服务实例并发很高或者有慢查询时,整个实例就会消耗更多的内存、CPU、磁盘io资源,导致服务器上其他实例提供服务的质量下降。这就相当于大家住在一个房子里,做一件事,其他人就需要等待

    MySQL配置方案

           多配置文件部署方案

           通过配置多个配置文件及多个启动程序来实现多实例的方案;

           以端口形式划分,3306,3307端口创建实例目录,每个目录下都有各自的实例的数据文件(data),实例的配置文件(my.conf),实例的启动文件(mysql)

           单一配置文件部署方案

           mysqld_multi

           缺点,耦合性太高

    安装多实例的数据库

           创建MySQL多实例的数据文件目录

           一般情况下我们采用/data目录作为MySQL多实例总的根目录然后规划不同的MySQL实例端口来作为/data下的二级目录,不同的端口号就是不同的实例目录,用来区别不同的实例

           这里以cmake为例子安装多实例

           安装MySQL依赖包

    yum install -y ncurses-devel
    yum install -y libaio-deve

      建立MySQL账号

        group mysql
        useradd -s /sbin/nologin -g mysql -M mysql

           创建相关MySQL多实例的目录如下

    [root@localhost ~]# mkdir -pv /data/{3306,3307}/data
    mkdir: created directory ‘/data’
    mkdir: created directory ‘/data/3306mkdir: created directory ‘/data/3306/data’
    mkdir: created directory ‘/data/3307mkdir: created directory ‘/data/3307/data’

    先将我们单实例的MySQL给kill掉

    [root@localhost ~]# pkill mysqld
    [root@localhost ~]# ps -ef | grep mysqld
    root       3314   2827  0 09:03 pts/0    00:00:00 grep --color=auto mysqld
    [root@localhost ~]# ps -ef | grep mysql
    root       3316   2827  0 09:03 pts/0    00:00:00 grep --color=auto mysql
    [root@localhost ~]# rm -f /etc/init.d/mysqld
    这个操作相当于沃恩前面做实验中初始化之后的操作就不做了
    [root@localhost ~]# tree /data/
    /data/                总的多实例根目录
    ├── 3306            3306实例的目录
    │   └── data        3306实例的数据文件目录
    └── 3307            3307实例目录
        └── data        3307实例的数据文件目录
    
    4 directories, 0 files

    MySQL数据库多实例的配置文件

           MySQL数据库默认用户提供了多个配置文件模板,用户可以根据硬件配置大小来选择

    my.cnf

    port            =3306
    socket          =/data/3306/mysql.sock
    port    =3306
    socket  =/data/3306/mysql.sock
    datadir =/data/3306/data
    long_query_time = 1
    #log-error= /data/3306/error.log
    #log-slow-queries = /data/3306/slow.log
    pid-file = /data/3306/mysql.pid
    log-bin = /data/3306/mysql-bin
    relay-log = /data/3306/relay-bin
    relay-log-info-file = /data/3306/relay-log.info
    server-id = 1
    log-error = /data/3306/mysql_oldboy3306.err
    pid-file = /data/3306/mysql.pid
    3307
    port            =3307
    socket          =/data/3307/mysql.sock
    port    =3307
    socket  =/data/3307/mysql.sock
    datadir =/data/3307/data
    #long_query_time = 1
    #log-error= /data/3307/error.log
    #log-slow-queries = /data/3307/slow.log
    pid-file = /data/3307/mysql.pid
    #log-bin = /data/3307/mysql-bin
    relay-log = /data/3307/relay-bin
    relay-log-info-file = /data/3307/relay-log.info
    server-id = 3
    log-error = /data/3307/mysql_oldboy3307.err
    pid-file = /data/3307/mysql.pid
    [root@localhost ~]# tree /data/
    /data/
    ├── 3306
    │   ├── data
    │   └── my.cnf        这就是3306实例的配置文件
    └── 3307
        ├── data
        └── my.cnf        这就是3307实例的配置文件
    
    4 directories, 2 files

    然后创建多实例的启动文件

    #!/bin/sh
    port=3306
    mysql_user="root"
    mysql_pwd="oldboy"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    #startup function
    function_start_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
          printf "Starting MySQL...
    "
          /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
        else
          printf "MySQL is running...
    "
          exit
        fi
    }
    
    #stop function
    function_stop_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
           printf "MySQL is stopped...
    "
           exit
        else
           printf "Stoping MySQL...
    "
           ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdo
    wn
       fi
    }
    
    #restart function
    function_restart_mysql()
    {
        printf "Restarting MySQL...
    "
        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/${port}/mysql {start|stop|restart}
    "
    esac
    3307
    #!/bin/sh
    port=3307
    mysql_user="root"
    mysql_pwd="oldboy"
    CmdPath="/application/mysql/bin"
    mysql_sock="/data/${port}/mysql.sock"
    #startup function
    function_start_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
          printf "Starting MySQL...
    "
          /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null &
        else
          printf "MySQL is running...
    "
          exit
        fi
    }
    
    #stop function
    function_stop_mysql()
    {
        if [ ! -e "$mysql_sock" ];then
           printf "MySQL is stopped...
    "
           exit
        else
           printf "Stoping MySQL...
    "
           ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdo
    wn
       fi
    }
    
    #restart function
    function_restart_mysql()
    {
        printf "Restarting MySQL...
    "
        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/${port}/mysql {start|stop|restart}
    "
    esac
    多实例启动文件的启动MySQL服务实质
           mysql_safe –defaults-file=/data/3306/my.cnf 2>&1 > /dev/nul &
            mysql_safe –defaults-file=/data/3307/my.cnf 2>&1 > /dev/nul &
    
    多实例启动文件的停止MySQL服务实质
            mysqladmin -u root -p123456 -S /data/3306/mysql.sock shutdown
            mysqladmin -u root -p123456 -S /data/3307/mysql.sock shutdown
    [root@localhost ~]# tree /data/
    /data/
    ├── 3306
    │   ├── data
    │   ├── my.cnf
    │   └── mysql
    └── 3307
        ├── data
        ├── my.cnf
        └── mysql
    
    4 directories, 4 files

    配置MySQL多实例文件的权限

    [root@localhost ~]# chown -R mysql.mysql /data
    [root@localhost ~]# find /data/ -type f -name "mysql" | xargs ls -l
    -rw-r--r--. 1 mysql mysql 1307 Oct 23 09:44 /data/3306/mysql
    -rw-r--r--. 1 mysql mysql 1307 Oct 23 09:44 /data/3307/mysql
    [root@localhost ~]# find /data/ -type f -name "mysql" | xargs chmod +x
    [root@localhost ~]# find /data/ -type f -name "mysql" | xargs ls -l
    -rwxr-xr-x. 1 mysql mysql 1307 Oct 23 09:44 /data/3306/mysql
    -rwxr-xr-x. 1 mysql mysql 1307 Oct 23 09:44 /data/3307/mysql

    配置MySQL全局使用路径

    [root@localhost ~]# tail -1 /etc/profile
    export PATH=/application/mysql/bin:$PATH

    第二种办法

        就是把/usr/local/mysql/bin下的命令拷贝到全局命令路径下/usr/local/sbin下
        /bin/cp /usr/local/mysql/bin/* /usr/local/sbin

    初始化数据库

    cd /application/mysql/scripts/
    ./mysql_install_db –basedir=/application/mysql –datadir=/data/3306/data –user=mysql
    ./mysql_install_db –basedir=/application/mysql –datadir=/data/3307/data –user=mysql

    为什么要初始化,就是创建基础的数据库文件

    最直接的结果就是在你data目录下放了库表的数据了

    这个时候就可以启动数据库了

    [root@root scripts]# /data/3306/mysql start
    Starting MySQL...
    [root@root scripts]# /data/3307/mysql start
    Starting MySQL...

    此时服务已经启动了

    如果出错,检查自己的错误日志,这里里面会告诉你

    多实例的登录

    [root@root scripts]# mysql -S /data/3306/mysql.sock 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 1
    Server version: 5.5.32-log Source distribution
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql>
    mysql> create database d3306;
    Query OK, 1 row affected (0.00 sec)
    
    mysql>

    对于多实例的登录可以指定sock登录

    [root@root ~]# mysql -S /data/3307/mysql.sock 
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 1
    Server version: 5.5.32 Source distribution
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    4 rows in set (0.00 sec)
    
    mysql> create database d3307;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | d3307              |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> system ls
    2019         data.zip   Downloads        Music      Templates    zhangsan__01
    anaconda-ks.cfg  Desktop    install.log        Pictures  Videos    zhangsan__02
    data         Documents  install.log.syslog    Public      zhangsan__00
    mysql> system mysql -S /data/3306/mysql.sock
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 2
    Server version: 5.5.32-log Source distribution
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | d3306              |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql> exit
    Bye
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | d3307              |
    | mysql              |
    | performance_schema |
    | test               |
    +--------------------+
    5 rows in set (0.00 sec)
    
    mysql>

    登录数据库

    mysql -S /data/3306/mysql.sock
    mysql -S /data/3306/mysql.sock

    重启数据库

    /data/3306/mysql stop
    /data/3307/mysql stop
    /data/3306/mysql start
    /data/3307/mysql start

    此时可以发现,MySQL无法停止,这是因为你的MySQL没有密码

    [root@root 3306]# /data/3306/mysql stop
    Stoping MySQL...
    /application/mysql/bin/mysqladmin: connect to server at 'localhost' failed
    error: 'Access denied for user 'root'@'localhost' (using password: YES)'

    MySQL安全配置

    为root增加密码

    mysqladmin -u root -S /data/3306/mysql.sock password ‘123456’
    mysqladmin -u root -S /data/3307/mysql.sock password '123456'

    此时会发现无法登录了

    [root@root 3306]# mysql -S /data/3306/mysql.sock
    ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
    [root@root 3306]# vim /data/3306/mysql
    [root@root 3306]# vim /data/3307/mysql

    修改其中mysql_pwd为自己设置的密码

    但是由于密码是在脚本文件中的,我们出与安全的考虑需要设置一下他的权限

    [root@root 3306]# find /data/ -type f -name "mysql" -exec chmod 700 {} ;
    [root@root 3306]# find /data/ -type f -name "mysql" -exec chown root.root {} ;
    [root@root 3306]# find /data/ -type f -name "mysql" -exec ls -l {} ;
    -rwx------. 1 root root 1307 Oct 23 21:28 /data/3306/mysql
    -rwx------. 1 root root 1307 Oct 23 21:28 /data/3307/mysql

    此时我们将mysqldpkill掉

    [root@root 3306]# pkill mysqld
    [root@root 3306]# pkill mysqld
    [root@root 3306]# netstat -lntup | grep 330

    重新启动mysql

    [root@root 3306]# /data/3306/mysql start
    Starting MySQL...
    [root@root 3306]# /data/3307/mysql start
    Starting MySQL...

    也可以停止mysql服务了

    [root@root 3306]# /data/3306/mysql stop
    Stoping MySQL...
    [root@root 3306]# /data/3307/mysql stop
    Stoping MySQL...

    删除多余的mysql用户

    mysql> select user,host from mysql.user;
    mysql> delete from mysql.user where user="";

    如何再增加一个MySQL实例

    以3308端口为例

    [root@root ~]# mkdir /data/3308/data -p
    [root@root ~]# cp /data/3306/my.cnf /data/3308/
    [root@root ~]# cp /data/3306/mysql /data/3308/
    [root@root ~]# chown -R mysql.mysql /data/

    Vim对内容做一个替换g/3306/s//3307/g或者:%s/3306/3307/g

    [root@root scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/

    [root@root ~]# /data/3308/mysql start
    Starting MySQL...
    [root@root ~]# ss -tnl | grep --color=auto 330
    LISTEN     0      128                       *:3306                     *:*     
    LISTEN     0      128                       *:3307                     *:*     
    LISTEN     0      128                       *:3308                     *:*    
    修改密码
    [root@root ~]# mysqladmin -u root -S /data/3308/mysql.sock password '123456'
    登录3308端口的mysql
    [root@root ~]# mysql -S /data/3308/mysql.sock -u root -p123456
    Welcome to the MySQL monitor.  Commands end with ; or g.
    Your MySQL connection id is 3
    Server version: 5.5.32-log Source distribution
    
    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
    
    mysql> select user,host from mysql.user
        -> ;
    +------+-----------+
    | user | host      |
    +------+-----------+
    | root | 127.0.0.1 |
    | root | ::1       |
    |      | localhost |
    | root | localhost |
    |      | root      |
    | root | root      |
    +------+-----------+
    6 rows in set (0.00 sec)
    
    mysql>
    mysql本地登录指定sock
    远程登录mysql -uroot -p123456 -P3308 -h 192.168.17.13

    至此,MySQL多实例结束

  • 相关阅读:
    保持URL不变和数字验证
    centOS ftp key?
    本地环境测试二级域名
    linux 解决You don't have permission to access 问题
    php smarty section loop
    php header Cannot modify header information headers already sent by ... 解决办法
    linux部分命令
    Linux 里面的文件操作权限说明
    用IT网络和安全专业人士视角来裁剪云的定义
    SQL Server 2008 R2炫酷报表"智"作有方
  • 原文地址:https://www.cnblogs.com/huangchuan/p/11755710.html
Copyright © 2011-2022 走看看