zoukankan      html  css  js  c++  java
  • MYSQL5上运行多个实例

    date 20131005
    参考
    http://chenzehe.iteye.com/blog/1266260
    官方文档

    http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#multiple-servers
    5.12. 在同一台机器上运行多个MySQL服务器
    http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#mysqld-multi
    5.1.5. mysqld_multi:管理多个MySQL服务器的程序

    注意:mysqld_multi 是perl写的脚本 需要安装perl

    mysqld_multi 配置MySQL多实例

    工作中吸取的
    关闭时候 需要密码

    一、配置说明
    1、至少下面选项对每个服务器必须不同的
    --port=port_num
    -port控制着TCP/IP连接的端口号
    --socket=path
    --socket控制Unix中的Unix套接字文件路径和在Windows中的命名管道名称。
    --pid-file=path
    该选项只在Unix中使用。它指出服务器在其中写入进程ID的文件名。
    如果你使用下面的日志文件选项,对于每个服务器来说,它们必须是不同的:
    如果你使用下面的日志文件选项,对于每个服务器来说,它们必须是不同的:
    --log=path
    --log-bin=path
    --log-update=path
    --log-error=path
    --bdb-logdir=path

    为了提高性能,你可以为每个服务器指定下面选项的不同的值,以便在物理磁盘之间平均分配负荷:
    --tmpdir=path
    --bdb-tmpdir=path

    一般情况,每个服务器应还使用不同的数据目录,可以通过--datadir=path选项来指定。

    如果在不同的位置有多个MySQL的安装,一般情况可以用--basedir=path选项为每个服务器指定基本安装目录


    指定不同Socket和Port的方式
    1)编译时指定
    shell> ./configure --with-tcp-port=port_number
    --with-unix-socket-path=file_name
    --prefix=/usr/local/mysql-5.1.2-alpha
    shell> mysqladmin --host=host_name --port=port_number variables

    2)启动时指定端口和套接字文件
    如果只是用一个不同的Unix套接字文件和TCP/IP端口号启动,不必编译新的MySQL服务器。还可以在运行时指定这些值。这样做的一个方法是使用命令行选项:
    shell> mysqld_safe --socket=file_name --port=port_number
    要启动第二个服务器,提供不同的--socket和--port选项值,并且传递一个--datadir=path选项给mysqld_safe,以便服务器使用一个不同的数据目录。
    达到相似效果的另一个方法是使用环境变量来设置 Unix套接字文件名和TCP/IP端口号:
    shell> MYSQL_UNIX_PORT=/tmp/mysqld-new.sock
    shell> MYSQL_TCP_PORT=3307
    shell> export MYSQL_UNIX_PORT MYSQL_TCP_PORT
    shell> mysql_install_db --user=mysql
    shell> mysqld_safe --datadir=/path/to/datadir &
    这是一个快速启动第二个服务器以用于测试的方法。该方法的最大好处是环境变量设定值适用于你从相同的shell调用的任何客户端程序。因而,那些客户端连接自动指向第二个服务器!


    二、配置文件范例
    通过# mysqld_multi --example 可以获得范例
    [mysqld_multi]
    mysqld = /usr/local/bin/mysqld_safe
    mysqladmin = /usr/local/bin/mysqladmin
    user = multi_admin
    password = multipass

    #确保停止mysqld服务器(用mysqladmin程序)的MySQL账户在各个服务器中的用户名和密码相同。并且应确保账户具有SHUTDOWN权限。
    #如果你想要管理的服务器的管理账户有许多不同的用户名或密码,你需要在每个服务器上创建一个账户,并具有相同的用户名和密码。
    #例如,你可以执行下面的命令为每个服务器设置一个普通multi_admin账户:
    #shell> mysql -u root -S /tmp/mysql.sock -proot_password
    #mysql> GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';


    [mysqld2]
    socket = /tmp/mysql.sock2
    port = 3307
    pid-file = /usr/local/mysql/var2/hostname.pid2
    datadir = /usr/local/mysql/var2
    language = /usr/local/share/mysql/english
    user = john

    [mysqld3]
    socket = /tmp/mysql.sock3
    port = 3308
    pid-file = /usr/local/mysql/var3/hostname.pid3
    datadir = /usr/local/mysql/var3
    language = /usr/local/share/mysql/swedish
    user = monty

    [mysqld4]
    socket = /tmp/mysql.sock4
    port = 3309
    pid-file = /usr/local/mysql/var4/hostname.pid4
    datadir = /usr/local/mysql/var4
    language = /usr/local/share/mysql/estonia
    user = tonu

    [mysqld6]
    socket = /tmp/mysql.sock6
    port = 3311
    pid-file = /usr/local/mysql/var6/hostname.pid6
    datadir = /usr/local/mysql/var6
    language = /usr/local/share/mysql/japanese
    user = jani


    三、在多服务器环境中使用客户端程序
    1、指定port方式
    -P port
    2、指定socket文件
    -S 文件路径

    四、实际操作
    (一)使用同一个mysql-server版本的多个实例

    1、安装软件
    yum -y install mysql-server perl

    2、规划多个实例
    数据存放目录
    开发
    mkdir -p /mysql/dev/data02
    mkdir -p /mysql/dev/data12
    对应端口 3302 3312
    mkdir -p /mysql/dev/data03
    mkdir -p /mysql/dev/data13
    对应端口 3303 3313
    测试
    mkdir -p /mysql/beta/data07
    mkdir -p /mysql/beta/data17
    mkdir -p /mysql/beta/data08
    mkdir -p /mysql/beta/data18

    LOG存放目录
    mkdir -p /data/logs/mysql/dev
    mkdir -p /data/logs/mysql/beta


    2、修改配置文件
    # cp /etc/my.cnf /etc/my_bak_20131015.cnf

    测试只配置dev2个实例
    # /usr/bin/mysqld_multi --example > /etc/my.cnf
    产生例子文件,再修改

    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    user = multi_admin
    password = my_password


    [mysqld2]
    bind-address = 192.168.168.105
    port = 3302
    server-id = 33302
    datadir = /mysql/dev/data02

    log-error = /data/logs/mysql/dev/mysql_error_3302.log
    long_query_time = 1
    slow-query-log-file = /data/logs/mysql/dev/mysql_slow_3302.log
    pid-file = /mysql/dev/data02/mysql.pid
    socket = /mysql/dev/data02/mysql.sock

    [mysqld12]
    bind-address = 192.168.168.105
    port = 3312
    server-id = 33312
    datadir = /mysql/dev/data12

    log-error = /data/logs/mysql/dev/mysql_error_3312.log
    long_query_time = 1
    slow-query-log-file = /data/logs/mysql/dev/mysql_slow_3312.log
    pid-file = /mysql/dev/data12/mysql.pid
    socket = /mysql/dev/data12/mysql.sock

    3、初始化
    mysql_install_db --datadir=/mysql/dev/data02 --user=mysql
    mysql_install_db --datadir=/mysql/dev/data12 --user=mysql

    [root@teplate dev]# mysql_install_db --datadir=/mysql/dev/data02 --user=mysql
    Neither host 'teplate.localdomain' nor 'localhost' could be looked up with
    /usr/bin/resolveip
    Please configure the 'hostname' command to return a correct
    hostname.
    If you want to solve this at a later stage, restart this script
    with the --force option
    # vim /etc/hosts
    192.168.168.105 teplate.localdomai
    添加了也不行
    使用--skip-name-resolve也不行

    --force Causes mysql_install_db to run even if DNS does not
    work. In that case, grant table entries that normally
    use hostnames will use IP addresses.
    # mysql_install_db --datadir=/mysql/dev/data02 --user=mysql --force
    Installing MySQL system tables...
    OK
    Filling help tables...
    OK

    4、启动
    # mysqld_multi start 2
    # ps xua|grep mysql
    root 2136 0.8 0.1 5036 1332 pts/0 S 00:49 0:00 /bin/sh /usr/bin/mysqld_safe --bind-address=192.168.168.105 --port=3302 --server-id=33302 --datadir=/mysql/dev/data02 --log-error=/data/logs/mysql/dev/mysql_error_3302.log --long_query_time=1 --slow-query-log-file=/data/logs/mysql/dev/mysql_slow_3302.log --pid-file=/mysql/dev/data02/mysql.pid --socket=/mysql/dev/data02/mysql.sock --skip-name-resolve
    mysql 2249 4.0 1.5 124992 16144 pts/0 Sl 00:49 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/mysql/dev/data02 --user=mysql --bind-address=192.168.168.105 --server-id=33302 --long_query_time=1 --slow-query-log-file=/data/logs/mysql/dev/mysql_slow_3302.log --skip-name-resolve --log-error=/data/logs/mysql/dev/mysql_error_3302.log --pid-file=/mysql/dev/data02/mysql.pid --socket=/mysql/dev/data02/mysql.sock --port=3302

    [root@teplate dev]# ll /mysql/dev/data02 -h
    total 21M
    -rw-rw----. 1 mysql mysql 10M Oct 6 00:49 ibdata1
    -rw-rw----. 1 mysql mysql 5.0M Oct 6 00:49 ib_logfile0
    -rw-rw----. 1 mysql mysql 5.0M Oct 6 00:49 ib_logfile1
    drwx------. 2 mysql root 4.0K Oct 6 00:48 mysql
    -rw-rw----. 1 mysql mysql 5 Oct 6 00:49 mysql.pid
    srwxrwxrwx. 1 mysql mysql 0 Oct 6 00:49 mysql.sock
    drwx------. 2 mysql root 4.0K Oct 6 00:48 test
    另外一个实例
    # mysqld_multi start 12
    # ps xua|grep mysql |grep 3312
    root 2273 0.5 0.1 5036 1332 pts/0 S 00:50 0:00 /bin/sh /usr/bin/mysqld_safe --bind-address=192.168.168.105 --port=3312 --server-id=33312 --datadir=/mysql/dev/data12 --log-error=/data/logs/mysql/dev/mysql_error_3312.log --long_query_time=1 --slow-query-log-file=/data/logs/mysql/dev/mysql_slow_3312.log --pid-file=/mysql/dev/data12/mysql.pid --socket=/mysql/dev/data12/mysql.sock --skip-name-resolve
    mysql 2386 2.2 1.5 124992 16148 pts/0 Sl 00:50 0:00 /usr/libexec/mysqld --basedir=/usr --datadir=/mysql/dev/data12 --user=mysql --bind-address=192.168.168.105 --server-id=33312 --long_query_time=1 --slow-query-log-file=/data/logs/mysql/dev/mysql_slow_3312.log --skip-name-resolve --log-error=/data/logs/mysql/dev/mysql_error_3312.log --pid-file=/mysql/dev/data12/mysql.pid --socket=/mysql/dev/data12/mysql.sock --port=3312
    # ll /mysql/dev/data12 -h
    total 21M
    drwxr-xr-x. 2 mysql mysql 4.0K Oct 5 19:35 binlogs
    -rw-rw----. 1 mysql mysql 10M Oct 6 00:50 ibdata1
    -rw-rw----. 1 mysql mysql 5.0M Oct 6 00:50 ib_logfile0
    -rw-rw----. 1 mysql mysql 5.0M Oct 6 00:50 ib_logfile1
    drwx------. 2 mysql root 4.0K Oct 6 00:48 mysql
    -rw-rw----. 1 mysql mysql 5 Oct 6 00:50 mysql.pid
    srwxrwxrwx. 1 mysql mysql 0 Oct 6 00:50 mysql.sock
    drwx------. 2 mysql root 4.0K Oct 6 00:48 test

    5、客户端链接

    1)socket文件方式
    设置root密码
    # mysqladmin -S /mysql/dev/data02/mysql.sock password 'mysqlmulti' -uroot -p
    # mysqladmin -S /mysql/dev/data12/mysql.sock password 'mysqlmulti' -uroot -p

    # mysql -S /mysql/dev/data02/mysql.sock -uroot -pmsyqlmulti

    2)ip+port
    # netstat -antlp |grep 33
    tcp 0 0 192.168.168.105:3312 0.0.0.0:* LISTEN 2386/mysqld
    tcp 0 0 192.168.168.105:3302 0.0.0.0:* LISTEN 2249/mysqld
    # mysql -h192.168.168.105 -P3302 -uroot -pmysqlmulti
    ERROR 1130 (HY000): Host '192.168.168.105' is not allowed to connect to this MySQL server
    没有想明白

    原因
    因为--skip-name-resolve 所以在服务器里默认teplate.localdomain和localhost不会解析,解释解析也是127.0.0.1
    授权给192.168.168.105即可
    mysql> grant all on *.* to 'root'@'192.168.168.105' identified by 'mysqlmulti'
    # mysql -h192.168.168.105 -P3302 -uroot -pmysqlmulti -e"show databases;"

    6 设置关闭服务密码
    关闭服务需要有权限的密码,开启服务不需要
    1)创建账号
    mysql -S /mysql/dev/data02/mysql.sock -uroot -pmysqlmulti -e"GRANT SHUTDOWN ON *.* TO 'multi_admin'@'localhost' IDENTIFIED BY 'multipass';"
    因为服务绑定了ip,所以用localhost权限不能关闭,实验验证确实不能关闭
    mysql -S /mysql/dev/data02/mysql.sock -uroot -pmysqlmulti -e"GRANT SHUTDOWN ON *.* TO 'multi_admin'@'192.168.168.105' IDENTIFIED BY 'multipass';"
    使用关闭的账号密码
    使用
    每次关闭输入使用
    # mysqld_multi stop --user=multi_admin --password=my_password
    放入配置文件使用
    # vim /etc/my.cnf
    [mysqld_multi]
    下添加
    user = multi_admin
    password = my_password
    上面创建的账号,关闭服务没成功 原因权限

    如果不想单独建账号直接使用root也可以
    # mysqld_multi stop 2 --password=mysqlmulti
    root账号放入配置

    [mysqld_multi]
    mysqld = /usr/bin/mysqld_safe
    mysqladmin = /usr/bin/mysqladmin
    user = root
    password = mysqlmulti

    # mysqld_multi stop 2
    # mysqld_multi stop 12
    # ps xua|grep mysql

    这样不用命令行每次都输密码了

    7、全局参数和局部实例参数
    放入[mysqld_multi] [mysqld]的参数是全局参数 每个实例可以继承和重载。
    1)、全局测试
    比如user和password 全局
    测试几个参数,增加
    [mysqld]
    skip-name-resolve
    log-bin = mysql-bin
    relay-log = mysql-relay-bin
    innodb_data_file_path = ibdata1:100M;ibdata2:100M:autoextend
    innodb_log_file_size = 50M
    innodb_lock_wait_timeout = 500

    清除前面的数据重新初始化
    # mysql_install_db --datadir=/mysql/dev/data02 --user=mysql --force
    # mysql_install_db --datadir=/mysql/dev/data12 --user=mysql --force
    # mysqld_multi start 2
    # mysqld_multi start 12

    [root@teplate dev]# ll /mysql/dev/data02 -h
    total 301M
    -rw-rw----. 1 mysql mysql 100M Oct 6 01:53 ibdata1
    -rw-rw----. 1 mysql mysql 100M Oct 6 01:53 ibdata2
    -rw-rw----. 1 mysql mysql 50M Oct 6 01:53 ib_logfile0
    -rw-rw----. 1 mysql mysql 50M Oct 6 01:53 ib_logfile1
    drwx------. 2 mysql root 4.0K Oct 6 01:51 mysql
    -rw-rw----. 1 mysql mysql 20K Oct 6 01:51 mysql-bin.000001
    -rw-rw----. 1 mysql mysql 740K Oct 6 01:51 mysql-bin.000002
    -rw-rw----. 1 mysql mysql 106 Oct 6 01:53 mysql-bin.000003
    -rw-rw----. 1 mysql mysql 57 Oct 6 01:53 mysql-bin.index
    -rw-rw----. 1 mysql mysql 5 Oct 6 01:53 mysql.pid
    srwxrwxrwx. 1 mysql mysql 0 Oct 6 01:53 mysql.sock
    drwx------. 2 mysql root 4.0K Oct 6 01:51 test

    # ll /mysql/dev/data12 -h
    total 301M
    -rw-rw----. 1 mysql mysql 100M Oct 6 01:53 ibdata1
    -rw-rw----. 1 mysql mysql 100M Oct 6 01:53 ibdata2
    -rw-rw----. 1 mysql mysql 50M Oct 6 01:53 ib_logfile0
    -rw-rw----. 1 mysql mysql 50M Oct 6 01:53 ib_logfile1
    drwx------. 2 mysql root 4.0K Oct 6 01:51 mysql
    -rw-rw----. 1 mysql mysql 20K Oct 6 01:51 mysql-bin.000001
    -rw-rw----. 1 mysql mysql 740K Oct 6 01:51 mysql-bin.000002
    -rw-rw----. 1 mysql mysql 106 Oct 6 01:53 mysql-bin.000003
    -rw-rw----. 1 mysql mysql 57 Oct 6 01:53 mysql-bin.index
    -rw-rw----. 1 mysql mysql 5 Oct 6 01:53 mysql.pid
    srwxrwxrwx. 1 mysql mysql 0 Oct 6 01:53 mysql.sock
    drwx------. 2 mysql root 4.0K Oct 6 01:51 test

    文件大小和全局设置的一样

    查看其他设置
    ## mysqladmin -S /mysql/dev/data12/mysql.sock -uroot variables |grep innodb_lock_wait_timeout
    | innodb_lock_wait_timeout | 500
    # mysqladmin -S /mysql/dev/data02/mysql.sock -uroot variables |grep innodb_lock_wait_timeout
    | innodb_lock_wait_timeout | 500
    也和全局设置的一样

    2)针对特定实例的专门设置
    # mysqld_multi stop 2
    # ps xua|grep 3302
    root 4156 0.0 0.0 4328 740 pts/0 S+ 02:03 0:00 grep 3302
    先修改参数测试
    # vim /etc/my.cnf
    [mysqld2] 下添加
    innodb_lock_wait_timeout = 1000
    # mysqld_multi start 2
    # mysqladmin -S /mysql/dev/data02/mysql.sock -uroot -pmysqlmulti variables |grep innodb_lock_wait_timeout
    | innodb_lock_wait_timeout | 1000
    已经修改了

    修改idbdata和binlogs等
    mysqld_multi stop 2
    删除原来的数据文件
    # rm /mysql/dev/data02/* -rf
    # vim /etc/my.cnf
    增加
    #Files
    log-bin = binlogs/mysql-bin
    relay-log = binglogs/mysql-relay-bin
    innodb_data_file_path = ibdata1:200M;ibdata2:200M:autoextend
    innodb_log_file_size = 100M
    注意binlogs文件夹需要预先创建好并且mysql有权限
    /usr/libexec/mysqld: File 'binlogs/mysql-bin.index' not found (Errcode: 2)


    # mysql_install_db --datadir=/mysql/dev/data02 --user=mysql --force
    # mkdir /mysql/dev/data02/binlogs/ && chown mysql.mysql /mysql/dev/data02/binlogs/

    [root@teplate dev]# ll /mysql/dev/data02/ -h
    total 601M
    drwxr-xr-x. 2 mysql mysql 4.0K Oct 6 02:27 binlogs
    -rw-rw----. 1 mysql mysql 200M Oct 6 02:27 ibdata1
    -rw-rw----. 1 mysql mysql 200M Oct 6 02:27 ibdata2
    -rw-rw----. 1 mysql mysql 100M Oct 6 02:27 ib_logfile0
    -rw-rw----. 1 mysql mysql 100M Oct 6 02:27 ib_logfile1
    drwx------. 2 mysql root 4.0K Oct 6 02:23 mysql
    -rw-rw----. 1 mysql mysql 20K Oct 6 02:23 mysql-bin.000001
    -rw-rw----. 1 mysql mysql 740K Oct 6 02:23 mysql-bin.000002
    -rw-rw----. 1 mysql mysql 38 Oct 6 02:23 mysql-bin.index
    -rw-rw----. 1 mysql mysql 5 Oct 6 02:27 mysql.pid
    srwxrwxrwx. 1 mysql mysql 0 Oct 6 02:27 mysql.sock
    drwx------. 2 mysql root 4.0K Oct 6 02:23 test
    [root@teplate dev]# ll /mysql/dev/data02/binlogs/ -h
    total 8.0K
    -rw-rw----. 1 mysql mysql 106 Oct 6 02:27 mysql-bin.000001
    -rw-rw----. 1 mysql mysql 25 Oct 6 02:27 mysql-bin.index
    和全局不一样了


    其他一些常用参数
    innodb_use_native_aio = 0
    net_buffer_length = 8K
    key_buffer_size = 128M
    max_heap_table_size = 2G
    tmp_table_size = 2G
    max_tmp_tables = 128
    table_open_cache = 512
    sort_buffer_size = 8M
    read_buffer_size = 8M
    read_rnd_buffer_size = 8M
    thread_cache_size = 8
    query_cache_size = 32M
    thread_concurrency = 8
    back_log = 200
    max_connections = 5000
    max_connect_errors = 10000
    connect_timeout = 15
    character-set-server = utf8
    interactive_timeout = 600
    expire_logs_days = 3
    long_query_time = 5
    max_allowed_packet = 16M
    max_binlog_size = 1G
    myisam_sort_buffer_size = 128M
    key_buffer = 128M
    thread_cache = 128
    table_cache = 512
    slave-skip-errors = all
    slow_query_log = 1
    skip-name-resolve
    skip-federated
    skip-external-locking
    wait_timeout = 600


    注意:
    log-bin = binlogs/mysql-bin
    relay-log = binglogs/mysql-relay-bin
    innodb_data_file_path = ibdata1:200M;ibdata2:200M:autoextend
    innodb_log_file_size = 100M
    这几个参数 涉及到数据文件的 最好默认里设置以后 每一个实例都单独设置 防止一些意外

    (二)使用多个mysql-server版本的多个实例
    多一个版本唯一的不同就是在具体的实例中指定
    [mysqld3]
    mysqld = /path/to/mysqld_safe
    ledir = /path/to/mysqld-binary/
    mysqladmin = /path/to/mysqladmin

  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/diege/p/3355885.html
Copyright © 2011-2022 走看看