三. 采用RPM包安装MySQL实现多实例
RPM包的文件布局是固定的,无法修改,因此一台服务器通常只能安装一个MySQL实例。但我们知道,无论何种方式,MySQL实例都是通过调用mysqld_safe命令来启动的,而mysqld_safe命令可通过--defaults-file参数来显式指定一个参数文件,因此同样可在一台服务器安装、运行多个MySQL实例,只不过要对服务启动文件做一些调整,下面就来尝试一下这个方法。
1. 安装MySQL
――安装server及client包
# rpm -ivh MySQL-server-5.5.17-1.rhel5.x86_64.rpm
# rpm -ivh MySQL-client-5.5.17-1.rhel5.x86_64.rpm
――启动服务
# service mysql start
Starting MySQL.. [ OK ]
――查看basedir和datadir参数值
# mysql
mysql> show variables like 'basedir';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| basedir |/usr |
+---------------+-------+
1 row in set (0.00 sec)
mysql> show variables like 'datadir';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| datadir |/var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.01 sec)
从中可以看出basedir缺省为/usr,datadir缺省为/var/lib/mysql。
2. 创建系统数据库
缺省情况下,RPM包已创建了系统数据库,位于/var/lib/mysql目录下,拷贝这个目录到/data/lib目录下,并分别命名为mysqla、mysqlb,以此来创建两个实例的系统数据库。
# service mysql stop
Shutting down MySQL. [ OK ]
# cp -r /var/lib/mysql/ /data/lib/mysqla
# cp -r /var/lib/mysql/ /data/lib/mysqlb
当然,也可通过mysql_install_db工具来创建,它位于/usr/bin目录下,如下:
# /usr/bin/mysql_install_db --user=mysql--datadir=/data/lib/mysqla
# /usr/bin/mysql_install_db --user=mysql--datadir=/data/lib/mysqlb
3. 配置参数文件
配置两个参数文件,分别命名为mya.cnf、myb.cnf,存放到/etc/目录下;端口号分别为3306、3307,datadir路径分别为/data/lib/mysqla、/data/lib/mysqlb。
4. 启动实例
同二进制包多实例一样,此时启动、关闭实例时只能通过--defaults-file指定参数文件,如下:
# /usr/bin/mysqld_safe --defaults-file=/etc/mya.cnf &
# /usr/bin/mysqld_safe --defaults-file=/etc/myb.cnf &
# /usr/bin/mysqladmin --defaults-file=/etc/mya.cnf shutdown
# /usr/bin/mysqladmin --defaults-file=/etc/myb.cnf shutdown
5. 修改服务管理方式
为了方便,还是要将其修改为服务管理方式,执行如下修改操作。
――创建服务启动文件
根据服务启动文件mysql,创建两个对应服务启动文件mysqla、mysqlb
# cd /etc/rc.d/init.d/
# cp mysql mysqla
# cp mysql mysqlb
――添加服务
# chkconfig --add mysqla
# chkconfig --add mysqlb
――删除原来的服务启动文件及服务(避免误启动)
# chkconfig --del mysql
# rm /etc/rc.d/init.d/mysql
――修改服务启动文件
编辑服务启动文件,进行如下调整,主要有以下几个地方:
# vi /etc/rc.d/init.d/mysqla
l 1:添加一个变量,设置为参数文件
my_cnf=/etc/mya.cnf
l 2:修改extra_args参数值,目的是让parse_server_arguments函数从中解析出datadir等参数值
(红色字体为添加部分)
extra_args=""
if test -r "$basedir/my.cnf"
then
extra_args="-e$basedir/my.cnf"
else
if test -r"$datadir/my.cnf"
then
extra_args="-e$datadir/my.cnf"
else
extra_args="-e $my_cnf"
fi
fi
l 3:在mysqld_safe命令中使用--defaults-file以便显式指定一个参数文件
$bindir/mysqld_safe --defaults-file=$my_cnf--datadir="$datadir" --pid-file="$mysqld_pid_file_path"$other_args >/dev/null 2>&1 &
注意:一定要将--defaults-file参数紧跟mysqld_safe,中间不能有其他参数,否则启动失败。
l 4:修改lock_file_path,若未修改,虽还不清楚有啥影响,但以防万一,还是修改之
lock_file_path="$lockdir/mysqla"
l 5:找到'status',将获取mysqld进程的命令pidof替换为ps
#mysqld_pid=`pidof $libexecdir/mysqld`
mysqld_pid=`ps --user=mysql -f|grep "$libexecdir/mysqld--defaults-file=$my_cnf"|awk '{print $2}'`
说明:pidof命令用于获取$libexecdir/mysqld的进程号,进而判断MySQL实例的状态,由于路径及名称都是固定的,所以无法区分每个实例对应的进程,导致Status混乱;用ps命令的过滤功能可实现这个需求,针对每个实例找到其对应的进程。
按照同样的方法,为第二个MySQL实例调整服务启动文件。
――启动服务
[root@db mysqla]# service mysqla start
Starting MySQL.. [ OK ]
[root@db mysqla]# service mysqlb start
Starting MySQL.. [ OK ]
至此,我们通过RPM包在一台服务器上安装了两个MySQL实例。
四. 采用mysqld_multi工具实现多实例
mysqld_multi是MySQL自带的一个统一管理多个MySQL实例的服务脚本,它会从MySQL的参数文件中搜索[mysqld#]段序列(#即GNR,可以是任意的正整数),作为自己的参数,以此来区分不同的段,进而控制特定的mysqld进程(MySQL实例)的启动、停止或者获取报告信息。
下面我们采用来了解一下它是如何管理多个MySQL实例的。
1. 配置参数文件
mysqld_multi与安装包类型无关,所以无论是源码包、二进制包,还是RPM包都自带了这个程序脚本,假设MySQL已成功安装。
鉴于mysqld_multi的工作机制,要求MySQL的参数文件中配置[mysqld_multi]项,及多个[mysqld#]段,每个[mysqld]段对应一个MySQL实例,使用不同的端口及unix socket监听文件。
本例配置两个[mysqld#]段,如下:
# vi /etc/my.cnf
[mysqld_multi]
mysqld =/usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
[mysqld1]
port = 3306
server-id = 3306
datadir =/data/lib/mysqla
socket =/data/lib/mysqla/mysql.sock
pid-file =/data/lib/mysqla/mysql.pid
character-set-server =utf8
default_storage_engine = InnoDB
log-bin =/data/lib/mysqla/mysql-bin
binlog_format = row
sync-binlog = 1
slow-query-log = on
slow-query-log-file = /data/lib/mysqla/mysql-slow.log
log_error =/data/lib/mysqla/mysql.err
max_connections =2000
back_log =50
skip-external-locking
skip-name-resolve
#skip-networking
key_buffer_size =256M
max_allowed_packet =1M
table_open_cache = 2000
sort_buffer_size =1M
read_buffer_size =1M
read_rnd_buffer_size =4M
myisam_sort_buffer_size = 64M
thread_cache_size =8
query_cache_size =16M
thread_concurrency =8
innodb_data_home_dir = /data/lib/mysqla
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/lib/mysqla
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysql2]
port = 3307
server-id = 3307
datadir =/data/lib/mysqlb
socket =/data/lib/mysqlb/mysql.sock
pid-file =/data/lib/mysqlb/mysql.pid
character-set-server =utf8
default_storage_engine = InnoDB
log-bin =/data/lib/mysqlb/mysql-bin
binlog_format = row
sync-binlog = 1
slow-query-log = on
slow-query-log-file = /data/lib/mysqlb/mysql-slow.log
log_error =/data/lib/mysqlb/mysql.err
max_connections =2000
back_log =50
skip-external-locking
skip-name-resolve
#skip-networking
key_buffer_size =256M
max_allowed_packet =1M
table_open_cache = 2000
sort_buffer_size =1M
read_buffer_size =1M
read_rnd_buffer_size =4M
myisam_sort_buffer_size = 64M
thread_cache_size =8
query_cache_size =16M
thread_concurrency =8
innodb_data_home_dir = /data/lib/mysqlb
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /data/lib/mysqlb
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 20M
innodb_log_file_size = 64M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqld_multi]项指定了mysqld_safe及mysqladmin命令工具,mysqld_multi也就是通过这两个工具来管理MySQL实例的。两个[mysqld#]段,分别对应两个MySQL实例,端口分别为3306、3307,datadir分别为/data/lib/mysqla、/data/lib/mysqlb。