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

  • 相关阅读:
    《让未来的你,感谢现在的自己》——自己努力
    老罗——《我的奋斗》
    1. opencv的初体验
    opencv初体验
    opencv的初体验
    python学习2——数据类型
    卷积的意义
    C#学习笔记一
    C++知识点
    二维数组作为参数传递
  • 原文地址:https://www.cnblogs.com/diege/p/3355885.html
Copyright © 2011-2022 走看看