美文网首页
MySQL启动多实例

MySQL启动多实例

作者: 攻城狮_正 | 来源:发表于2021-03-27 00:40 被阅读0次

    MySQL是一款流行的开源数据库。我们在开发过程中常常会用到读写分离,分库分表,区分开发环境与预生产环境。如果只有一台机器能用,在做预演时就需要用到多实例。

    多实例启动数据库有三种方式:

    1. 在不同虚拟机中运行,隔离运行环境。这种方式的缺点是开销大。
    2. 在Docker中运行MySQL镜像。和虚拟机类似,运行环境隔离,但开销比虚拟机小很多。
    3. 如果使用源或编译的方式安装的数据库,就需要配置MySQL多实例。

    在生产环境下,数据库建议运行在物理机中。本章主要介绍第三种方式,配置MySQL多实例。

    初始化数据库

    数据库安装完成后,使用mysqld命令初始化数据库。

    mysqld --initialize-insecure --datadir=/home/mysql/3307/data --user=mysql;
    mysqld --initialize-insecure --datadir=/home/mysql/3308/data --user=mysql;
    mysqld --initialize-insecure --datadir=/home/mysql/3309/data --user=mysql;
    

    参数说明:

    --initialize-insecure
    对于Mysql 5.7.6以后的5.7系列版本,Mysql使用mysqld –initialize或mysqld –initialize-insecure命令来初始化数据库。前者会生成一个随机密码,在error.log的输出日志查找“A temporary password is generated for”可以看到。后者使用空密码。但是安装Mysql时默认使用的是前一个命令,这个命令也会生成一个随机密码,该密码保存在了Mysql的日志文件中。

    --datadir
    指定数据库存储目录

    --user
    指定数据库用户,注意该用户应对datadir目录有读写权限

    在Ubuntu Server中可能会初始化失败,提示:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 17 – File exists)

    这是因为Ubuntu Server从18.04开始引入AppArmor。

    AppArmor是一个Linux系统安全应用程序,类似于Selinux,AppArmor默认安全策略定义个别应用程序可以访问系统资源和各自的特权,如果不设置服务的执行程序,即使你改了属主属组并0777权限,也是对服务起不到作用。

    编辑AppArmor配置文件:

    vi /etc/apparmor.d/usr.sbin.mysqld
    

    找到“Allow data dir access”,把自己要指定的MySQL数据库目录加到列表就可以了。

    Allow data dir access

    重启AppArmor服务:systemctl restart apparmor

    再执行初始化数据库命令。

    配置多实例

    MySQL自带了mysqld_multi工具运行多个实例。

    新建文件 /etc/mysql/mysql.conf.d/mysqld_multi.cnf ,内容如下:

    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    user = root
    #password = 
    
    # nextcloud
    [mysqld3307]
    user        = mysql
    pid-file    = /home/mysql/3307/mysqld.pid
    socket      = /home/mysql/3307/mysqld.sock
    port        = 3307
    datadir     = /home/mysql/3307/data
    lc-messages-dir = /usr/share/mysql
    skip-external-locking
    bind-address        = 0.0.0.0
    key_buffer_size     = 16M
    max_allowed_packet  = 16M
    thread_stack        = 192K
    thread_cache_size       = 8
    myisam-recover-options  = BACKUP
    query_cache_limit   = 1M
    query_cache_size        = 16M
    expire_logs_days    = 10
    max_binlog_size   = 100M
    innodb_buffer_pool_size = 1G
    innodb_io_capacity = 4000
    
    # wordpress
    [mysqld3308]
    user        = mysql
    pid-file    = /home/mysql/3308/mysqld.pid
    socket      = /home/mysql/3308/mysqld.sock
    port        = 3308
    datadir     = /home/mysql/3308/data
    lc-messages-dir = /usr/share/mysql
    skip-external-locking
    bind-address        = 0.0.0.0
    key_buffer_size     = 16M
    max_allowed_packet  = 16M
    thread_stack        = 192K
    thread_cache_size       = 8
    myisam-recover-options  = BACKUP
    query_cache_limit   = 1M
    query_cache_size        = 16M
    expire_logs_days    = 10
    max_binlog_size   = 100M
    innodb_buffer_pool_size = 1G
    innodb_io_capacity = 4000
    innodb_io_capacity = 4000
    
    [mysqld3309]
    user        = mysql
    pid-file    = /home/mysql/3309/mysqld.pid
    socket      = /home/mysql/3309/mysqld.sock
    port        = 3309
    datadir     = /home/mysql/3309/data
    lc-messages-dir = /usr/share/mysql
    skip-external-locking
    bind-address        = 0.0.0.0
    key_buffer_size     = 16M
    max_allowed_packet  = 16M
    thread_stack        = 192K
    thread_cache_size       = 8
    myisam-recover-options  = BACKUP
    query_cache_limit   = 1M
    query_cache_size        = 16M
    expire_logs_days    = 10
    max_binlog_size   = 100M
    innodb_buffer_pool_size = 1G
    innodb_io_capacity = 4000
    

    配置多实例,每个实例命名为mysqld*,这里我三个实例配置分别对应[mysql3307],[mysql3308],[mysql3309]。

    • 启动实例

    执行:

    mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start
    

    如果需要启动指定的实例,可以在start后面跟上参数,使用实例名,如:

    mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307
    

    或,启动指定多个实例:

    mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307,3308
    
    • 查看状态
    mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql report
    
    mysql multi report
    • 关闭实例

    执行(也可以关闭指定实例,和start用法一样):

    mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql stop
    

    我在执行stop命令时,实例未关闭。网上遇到该问题的人有改mysqld_multi.cnf脚本的,我试过,加上参数-s后直接报错。有说是因为权限问题,需要授权:grant shutdown on . to ‘username’@’localhost’ identified by ‘password’。我用的root用户启动,试过用mysqladmin去执行关闭,是可以成功的。

    mysqladmin -h127.0.0.1 -P3309 -uroot shutdown
    
    mysql multi close

    除非注明,否则均为"攻城狮·正"原创文章,转载请注明出处。
    本文链接:https://engr-z.com/375.html

    相关文章

      网友评论

          本文标题:MySQL启动多实例

          本文链接:https://www.haomeiwen.com/subject/bvlehltx.html