视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL多实例的配置和管理详细
2020-11-09 08:44:08 责编:小采
文档

mysql的多实例有两种方式可以实现,两种方式各有利弊。

  • 第一种是使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。

  • 第二种是通过官方自带的mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方面,优点是管理起来很方便,集中管理。

  • 下面就分别来实战这两种多实例的安装和管理

    先来学习第一种使用多个配置文件启动多个不同进程的情况:

    环境介绍:

    mysql 版本:5.1.50

    操作系统:SUSE 11

    mysql实例数:3个

    实例占用端口分别为:3306、3307、3308

    创建mysql用户:

    /usr/sbin/groupadd mysql
    /usr/sbin/useradd -g mysql mysql

    编译安装mysql:

    tar xzvf mysql-5.1.50.tar.gz
    cd mysql-5.1.50
    ./configure '--prefix=/usr/local/mysql' '--with-charset=utf8' '--with-extra-charsets=complex' '--with-pthread' '--enable-thread-safe-client' '--with-ssl' '--with-client-ldflags=-all-static' '--with-mysqld-ldflags=-all-static' '--with-plugins=partition,innobase,blackhole,myisam,innodb_plugin,heap,archive' '--enable-shared' '--enable-assembler'
    make
    make install

    初始化数据库:

    /usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/dbdata_3306 --user=mysql
    /usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/dbdata_3307 --user=mysql
    /usr/local/mysql/bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/dbdata_3308 --user=mysql

    创建配置文件

    vim /data/dbdata_3306/my.cnf

    3306的配置文件如下:

    [client]
    port = 3306
    socket = /data/dbdata_3306/mysql.sock
    [mysqld]
    datadir=/data/dbdata_3306/
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    port = 3306
    socket = /data/dbdata_3306/mysql.sock
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    [mysqldump]
    quick
    max_allowed_packet = 256M
    [mysql]
    no-auto-rehash
    prompt=\\u@\\d \\R:\\m>
    [myisamchk]
    key_buffer_size = 512M
    sort_buffer_size = 512M
    read_buffer = 8M
    write_buffer = 8M
    [mysqlhotcopy]
    interactive-timeout
    [mysqld_safe]
    open-files-limit = 8192

    vim /data/dbdata_3307/my.cnf

    3307的配置文件如下:

    [client]
    port = 3307
    socket = /data/dbdata_3307/mysql.sock
    [mysqld]
    datadir=/data/dbdata_3307/
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    port = 3307
    socket = /data/dbdata_3307/mysql.sock
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    [mysqldump]
    quick
    max_allowed_packet = 256M
    [mysql]
    no-auto-rehash
    prompt=\\u@\\d \\R:\\m>
    [myisamchk]
    key_buffer_size = 512M
    sort_buffer_size = 512M
    read_buffer = 8M
    write_buffer = 8M
    [mysqlhotcopy]
    interactive-timeout
    [mysqld_safe]
    open-files-limit = 8192

    vim /data/dbdata_3308/my.cnf

    3308的配置文件如下:

    [client]
    port = 3308
    socket = /data/dbdata_3308/mysql.sock
    [mysqld]
    datadir=/data/dbdata_3308/
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    port = 3308
    socket = /data/dbdata_3308/mysql.sock
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    [mysqldump]
    quick
    max_allowed_packet = 256M
    [mysql]
    no-auto-rehash
    prompt=\\u@\\d \\R:\\m>
    [myisamchk]
    key_buffer_size = 512M
    sort_buffer_size = 512M
    read_buffer = 8M
    write_buffer = 8M
    [mysqlhotcopy]
    interactive-timeout
    [mysqld_safe]
    open-files-limit = 8192

    创建自动启动文件

    vim /data/dbdata_3306/mysqld

    3306的启动文件如下:

    #!/bin/bash
    mysql_port=3306
    mysql_username="admin"
    mysql_password="password"
    function_start_mysql()
    {
    printf "Starting MySQL...\n"
    /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_${mysql_port}/my.cnf 2>&1 > /dev/null &
    }
    function_stop_mysql()
    {
    printf "Stoping MySQL...\n"
    /usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /data/dbdata_${mysql_port}/mysql.sock shutdown
    }
    function_restart_mysql()
    {
    printf "Restarting MySQL...\n"
    function_stop_mysql
    function_start_mysql
    }
    function_kill_mysql()
    {
    kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')
    kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')
    }
    case $1 in
    start)
    function_start_mysql;;
    stop)
    function_stop_mysql;;
    kill)
    function_kill_mysql;;
    restart)
    function_stop_mysql
    function_start_mysql;;
    *)
    echo "Usage: /data/dbdata_${mysql_port}/mysqld {start|stop|restart|kill}";;
    esac

    vim /data/dbdata_3307/mysqld

    3307的启动文件如下:

    #!/bin/bash
    mysql_port=3307
    mysql_username="admin"
    mysql_password="password"
    function_start_mysql()
    {
    printf "Starting MySQL...\n"
    /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_${mysql_port}/my.cnf 2>&1 > /dev/null &
    }
    function_stop_mysql()
    {
    printf "Stoping MySQL...\n"
    /usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /data/dbdata_${mysql_port}/mysql.sock shutdown
    }
    function_restart_mysql()
    {
    printf "Restarting MySQL...\n"
    function_stop_mysql
    function_start_mysql
    }
    function_kill_mysql()
    {
    kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')
    kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')
    }
    case $1 in
    start)
    function_start_mysql;;
    stop)
    function_stop_mysql;;
    kill)
    function_kill_mysql;;
    restart)
    function_stop_mysql
    function_start_mysql;;
    *)
    echo "Usage: /data/dbdata_${mysql_port}/mysqld {start|stop|restart|kill}";;
    esac

    vim /data/dbdata_3308/mysqld

    3308的启动文件如下:

    #!/bin/bash
    mysql_port=3308
    mysql_username="admin"
    mysql_password="password"
    function_start_mysql()
    {
    printf "Starting MySQL...\n"
    /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/data/dbdata_${mysql_port}/my.cnf 2>&1 > /dev/null &
    }
    function_stop_mysql()
    {
    printf "Stoping MySQL...\n"
    /usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -S /data/dbdata_${mysql_port}/mysql.sock shutdown
    }
    function_restart_mysql()
    {
    printf "Restarting MySQL...\n"
    function_stop_mysql
    function_start_mysql
    }
    function_kill_mysql()
    {
    kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')
    kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')
    }
    case $1 in
    start)
    function_start_mysql;;
    stop)
    function_stop_mysql;;
    kill)
    function_kill_mysql;;
    restart)
    function_stop_mysql
    function_start_mysql;;
    *)
    echo "Usage: /data/dbdata_${mysql_port}/mysqld {start|stop|restart|kill}";;
    esac

    启动3306、3307、3308的mysql

    /data/dbdata_3306/mysqld start
    /data/dbdata_3307/mysqld start
    /data/dbdata_3308/mysqld start

    更改原来密码(处于安全考虑,还需要删除系统中没有密码的帐号,这里省略了):

    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3306/mysql.sock
    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3307/mysql.sock
    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3308/mysql.sock

    登录测试并创建关闭mysql的帐号权限,mysqld脚本要用到!

    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;
    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;
    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;

    创建了admin帐号以后脚本的stop功能和restart功能就正常了!

    更改环境变量

    vim /etc/profile 添加下面一行内容
    PATH=${PATH}:/usr/local/mysql/bin/
    source /etc/profile

    添加到自动启动

    vim /etc/init.d/boot.local
    /data/dbdata_3306/mysqld start
    /data/dbdata_3307/mysqld start
    /data/dbdata_3308/mysqld start

    如果是rhel或者centos系统的话自启动文件/etc/rc.local

    管理的话,在本地都是采用 -S /data/dbdata_3308/mysql.sock,如果在远程可以通过不同的端口连接上去坐管理操作。其他的和单实例的管理没什么区别!

    再来看第二种通过官方自带的mysqld_multi来实现多实例实战:

    这里的mysql安装以及数据库的初始化和前面的步骤一样,就不再赘述。

    mysqld_multi的配置

    vim /etc/my.cnf

    [mysqld_multi]
    mysqld = /usr/local/mysql/bin/mysqld_safe
    mysqladmin = /usr/local/mysql/bin/mysqladmin
    user = admin
    password = password
    
    [mysqld1]
    socket = /data/dbdata_3306/mysql.sock
    port = 3306
    pid-file = /data/dbdata_3306/3306.pid
    datadir = /data/dbdata_3306
    user = mysql
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    
    [mysqld2]
    socket = /data/dbdata_3307/mysql.sock
    port = 3307
    pid-file = /data/dbdata_3307/3307.pid
    datadir = /data/dbdata_3307
    user = mysql
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    
    [mysqld3]
    socket = /data/dbdata_3308/mysql.sock
    port = 3308
    pid-file = /data/dbdata_3308/3308.pid
    datadir = /data/dbdata_3308
    user = mysql
    skip-name-resolve
    lower_case_table_names=1
    innodb_file_per_table=1
    back_log = 50
    max_connections = 300
    max_connect_errors = 1000
    table_open_cache = 2048
    max_allowed_packet = 16M
    binlog_cache_size = 2M
    max_heap_table_size = M
    sort_buffer_size = 2M
    join_buffer_size = 2M
    thread_cache_size = 
    thread_concurrency = 8
    query_cache_size = M
    query_cache_limit = 2M
    ft_min_word_len = 4
    default-storage-engine = innodb
    thread_stack = 192K
    transaction_isolation = REPEATABLE-READ
    tmp_table_size = M
    log-bin=mysql-bin
    binlog_format=mixed
    slow_query_log
    long_query_time = 1
    server-id = 1
    key_buffer_size = 8M
    read_buffer_size = 2M
    read_rnd_buffer_size = 2M
    bulk_insert_buffer_size = M
    myisam_sort_buffer_size = 128M
    myisam_max_sort_file_size = 10G
    myisam_repair_threads = 1
    myisam_recover
    innodb_additional_mem_pool_size = 16M
    innodb_buffer_pool_size = 200M
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_file_io_threads = 8
    innodb_thread_concurrency = 16
    innodb_flush_log_at_trx_commit = 1
    innodb_log_buffer_size = 16M
    innodb_log_file_size = 512M
    innodb_log_files_in_group = 3
    innodb_max_dirty_pages_pct = 60
    innodb_lock_wait_timeout = 120
    
    [mysqldump]
    quick
    max_allowed_packet = 256M
    [mysql]
    no-auto-rehash
    prompt=\\u@\\d \\R:\\m>
    [myisamchk]
    key_buffer_size = 512M
    sort_buffer_size = 512M
    read_buffer = 8M
    write_buffer = 8M
    [mysqlhotcopy]
    interactive-timeout
    [mysqld_safe]
    open-files-limit = 8192

    mysqld_multi启动

    /usr/local/mysql/bin/mysqld_multi start 1
    /usr/local/mysql/bin/mysqld_multi start 2
    /usr/local/mysql/bin/mysqld_multi start 3

    或者采用一条命令的形式:

    /usr/local/mysql/bin/mysqld_multi start 1-3

    更改原来密码(处于安全考虑,还需要删除系统中没有密码的帐号,这里省略了):

    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3306/mysql.sock
    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3307/mysql.sock
    /usr/local/mysql/bin/mysqladmin -uroot password 'password' -S /data/dbdata_3308/mysql.sock

    登录测试并创建admin密码(停止mysql的时候需要使用到)

    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;
    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;
    /usr/local/mysql/bin/mysql -uroot -ppassword -S /data/dbdata_3308/mysql.sock
    GRANT SHUTDOWN ON *.* TO 'admin'@'localhost' IDENTIFIED BY 'password';
    flush privileges;

    更改环境变量

    vim /etc/profile
    PATH=${PATH}:/usr/local/mysql/bin/
    source /etc/profile

    添加到自动启动

    vim /etc/init.d/boot.local
    /usr/local/mysql/bin/mysqld_multi start 1-3

    如果是rhel或者centos系统的话自启动文件/etc/rc.local

    管理的话,在本地都是采用 -S /data/dbdata_3308/mysql.sock,如果在远程可以通过不同的端口连接上去坐管理操作。其他的和单实例的管理没什么区别!

    大家在管理多实例的话可以使用mysqlmanager实例管理器,管理器来会比较方面,限于篇幅,这里就不在多做介绍!

    相关推荐:

    Linux下安装Mysql多实例作为数据备份服务器实现多主到一从多实例

    由于第一次接触LINUX,花了三天时间才算有所成就,发出来希望可以给大伙带来方便......

    MySQL多实例讲解

    mysql多实例,每个MySQL多实例讲解实例的datadir,pid,port,socket应该是不同的,在Unix中,在你启动客户端之前......

    下载本文
    显示全文
    专题