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