MySQL数据库的集中化运维,可以通过在一台MySQL数据库服务器上,部署多个MySQL实例。该功能是通过mysqld_multi来实现。mysqld_multi用于管理多个mysqld的服务进程,这些mysqld服务进程程序可以用不同的socket或是监听于不同的端口,同时将数据文件分布到不同的磁盘以分散IO。mysqld_multi提供简单的命令用于启动,关闭和报告所管理的服务器的状态。从而减少生产环境的维护成本,方便后续的迁移和清理等工作,借助多实例绑定的方式提高服务器的整体资源利用率.对于多实例的配置有2种方式,一种是在my.cnf为所有实例提供配置,一种是使用每一个实例一个配置文件。本文主要描述第二种方式。

  第一种多实例配置方式请参考:MySQL多实例配置(一)

  有关MySQL单实例的安装请参考:Linux 下MySQL源码安装完整版



1、各数据库多实例的差异

  MSSQL

    MSSQL中的实例指的是一个SQL server服务器上仅有一个缺省实例。缺省实例名即为机器名ServerName(或IP)。

       如果在同一台机器上再安装SQL server,我们可以对实例命名如ServerName/InstanceName。

       即一台SQL server服务器上可以存在多个不同的实例。一个实例下可以存在多个不同的数据库。

       对于不同实例下的数据库的访问,使用ServerName/InstanceName:PortNo即可实现访问,缺省实例为ServerName:PortNo。

       对不同的实例配置IP地址,相关的访问协议,端口等等。

       实例的可访问性需要启动该实例对应的相关服务。此处需要注意的是实例名和实例的服务名并不是相同的。

       缺省的实例的服务名为MSSQLSERVER,而命名实例的服务名为MSSQL$INSTANCE_NAME。


  Oracle 

     一个Oracle Server由一个Oracle实例和一个Oracle数据库组成。即:Oracle Server = Oracle Instance + Oracle Database

     在Oracle的实例主要是由SGA,PGA以及一堆的后台进程来组成,此称之为实例。

     一系列物理文件的集合包括控制文件、数据文件、联机日志文件、参数文件、密码文件等称之为数据库。

     一个实例只能访问一个数据库,一个数据库可以被多个实例访问。


  MySQL

     MySQL实例的概念与MSSQL差不多,一个MySQL实例下可以存在或访问N个数据库。

     不同的实例间可以用不同的端口号来区分,各个实例的数据可以使用不同的磁盘目录。

     MySQL多实例通过mysqld_multi工具来进行管理。




2、现有的环境

  mysql安装路径: /u01/app/mysql

  mysql数据路径: /u01/app/mysqldata/data3306

  mysql端口号: 3306

  mysql  版本:5.6.12 Source distribution

  OS     环境:SUSE Linux Enterprise Server 11 SP3  (x86_64)




3、初始化实例

  #为新实例创建数据目录并赋权

  suse11:~ # mkdir -p /u01/app/mysqldata/data3606  

  suse11:~ # mkdir -p /u01/app/mysqldata/data3706

  suse11:~ # chown mysql:mysql -R /u01/app/mysqldata/data3606

  suse11:~ # chown mysql:mysql -R /u01/app/mysqldata/data3706


  #初始化实例

  suse11:~ # cd /u01/app/mysql

  suse11:/u01/app/mysql # ./scripts/mysql_install_db --user=mysql --ldata=/u01/app/mysqldata/data3606/

  suse11:/u01/app/mysql # ./scripts/mysql_install_db --user=mysql --ldata=/u01/app/mysqldata/data3706/

  # Author : Leshami

  # Blog   : http://blog.csdn.net/leshami




4、配置各实例的my.cnf文件

  # vi /u01/app/mysqldata/data3606/my3606.cnf


  [mysqld]

  socket = /tmp/mysql3606.sock 

  port = 3606

  pid-file = /u01/app/mysqldata/data3606/mysql3606.pid

  datadir = /u01/app/mysqldata/data3606

  basedir = /u01/app/mysql

  user = mysql

  server-id=3606

  [client]

  port = 3606

  socket = /tmp/mysql3606.sock 


  [mysql]

  no-auto-rehash

  socket = /tmp/mysql3606.sock 

  prompt=\\u@\\h[\\d]> \\


  # vi /u01/app/mysqldata/data3706/my3706.cnf


  [mysqld]

  socket = /tmp/mysql3706.sock 

  port = 3706

  pid-file = /u01/app/mysqldata/data3706/mysql3706.pid

  datadir = /u01/app/mysqldata/data3706

  basedir = /u01/app/mysql

  user = mysql

  server-id=3706

  [client]

  port = 3706

  socket = /tmp/mysql3706.sock 


  [mysql]

  no-auto-rehash

  socket = /tmp/mysql3706.sock

  prompt=\\u@\\h[\\d]> \\


  suse11:~ # chown -R mysql:mysql /u01/app/mysqldata/data3606/my3606.cnf

  suse11:~ # chown -R mysql:mysql /u01/app/mysqldata/data3706/my3706.cnf




5、启动关闭多实例

  suse11:~ # mysqld_safe --defaults-file=/u01/app/mysqldata/data3606/my3606.cnf &

  suse11:~ # mysqld_safe --defaults-file=/u01/app/mysqldata/data3706/my3706.cnf &  

  suse11:~ # netstat -nltp|grep mysql

  tcp        0      0 :::3606                 :::*                    LISTEN      64277/mysqld       

  tcp        0      0 :::3706                 :::*                    LISTEN      64597/mysqld 


  suse11:~ # mysqladmin -uroot password 'xxx' -S /tmp/mysql3606.sock

  suse11:~ # mysqladmin -uroot password 'xxx' -S /tmp/mysql3706.sock


  #下面使用套接字方式连接到实例

  suse11:~ # mysql -uroot -pxxx -S /tmp/mysql3606.sock

  root@localhost[(none)]>


  suse11:~ # mysql -uroot -pxxx -S /tmp/mysql3706.sock

  root@localhost[(none)]>


  #下面使用TCP方式连接到实例

  suse11:~ # mysql -uroot -pxxx -P3606 --protocol=tcp

  root@localhost[(none)]> exit


  suse11:~ # mysql -uroot -pxxx -P3706 --protocol=tcp

  root@localhost[(none)]>


  #关闭mysql实例

  suse11:~ # mysqladmin -uroot -pxxx -S /tmp/mysql3606.sock shutdown

  suse11:~ # mysqladmin -uroot -pxxx -S /tmp/mysql3706.sock shutdown