MySQL数据库搭建系列之多实例(3)

三. 采用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。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0ca0ea1fcb36b95b6eada9e88731fa35.html