Permalink
Branch: master
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
230 lines (165 sloc) 8.33 KB
layout title category tags
post
MySQL Multiple Instances
Database
DBA
MySQL

上周五下午,同事问到一个关于MySQL Multiple Instances的问题,参考一些教程配置后只能启动一个实例。当时正好要参加一个会议,晚上又是一年一度的晚会加抽奖环节(实际上我是奔着抽奖去的,无奈再次无缘),所以当天没有来得及处理。今天参考同事的配置进行测试,中间也遇到过一些错误,但感觉基础和关键都在MySQL的基本概念;以邮件的慢节奏,一去一来,一个上午就过去了,最后还是同事发现问题所在,很快就解决了。

另外,前几天正好看到阮一峰的PostgreSQL新手入门,开篇即提到“自从MySQL被Oracle收购以后,PostgreSQL逐渐成为开源关系型数据库的首选”,不是黑Oracle,我只想说,即使不是为了逐渐去IOE化,也应该试试PostgreSQL;另外,时下从MySQL迁移到各类NoSQL数据库的案例正在逐步增加。

这儿简单记录下配置过程,同时做几点延伸:

  • 对MySQL虽没有深究,但说不定以后会用到,所以我也来折腾下;
  • 顺便推荐一些关于MySQL的延伸阅读,以作收藏和扩散;
  • 最后,借此机会学习下如何提问,做好做足自身的准备工作,见How To Ask For Help

MySQL多实例配置

MySQL基本环境

1 . 主要信息

  • OS: Ubuntu 13.04 i386
  • MySQL: 5.5.34

2 . MySQL规划

MySQL Server使用apt-get安装,单实例使用默认配置,具体如下:

  • 配置文件: /etc/mysql/my.cnf
  • 数据库目录: /var/lib/mysql
  • 日志目录:/var/log/mysql

MySQL Multiple Instances,参考MySQL单实例目录结构(两个实例,分别为mysql1,mysql2),具体如下:

  • 配置文件: /etc/mysql/my_multi.cnf
  • 数据库目录: /var/lib/mysql1/var/lib/mysql2
  • 日志目录:/var/log/mysql1, /var/lib/mysql2

MySQL Single Instance

一般情况下我们安装MySQL Server后,即默认启动一个MySQL实例,并绑定3306端口。主要步骤如下:

安装数据库,自动添加mysql用户/用户组。

root@ubuntu:# apt-get install -y mysql-server

安装客户端

root@ubuntu:# apt-get install -y mysql-client

主要配置

root@ubuntu:# cat /etc/mysql/my.cnf 
[mysqld]
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysql/error.log
log-bin=/var/log/mysql/update.log
general_log-file=/var/log/mysql/all.log

[mysqld_safe]
pid-file=/var/run/mysqld/mysqld.pid

启动MySQL

root@ubuntu:# service mysql start

客户端测试

root@ubuntu:#mysql -uroot -p
... ...

MySQL Multiple Instances

有时需要在一台主机上运行多个MySQL实例,以便充分利用服务器资源。以两个实例mysql1,mysql2为例,主要步骤如下:

创建必须的目录结构,并分配权限。

#数据文件目录
root@ubuntu:#  mkdir /var/lib/mysql1 && chown mysql:mysql /var/lib/mysql1
root@ubuntu:#  mkdir /var/lib/mysql2 && chown mysql:mysql /var/lib/mysql2

#日志目录
root@ubuntu:#  mkdir /var/log/mysql1 && chown mysql:mysql /var/log/mysql1
root@ubuntu:#  mkdir /var/log/mysql2 && chown mysql:mysql /var/log/mysql2

安装数据库

root@ubuntu:# mysql_install_db --datadir=/var/lib/mysql1 --user=mysql
root@ubuntu:# mysql_install_db --datadir=/var/lib/mysql2 --user=mysql

编辑多实例参数配置

root@ubuntu:# cat /etc/mysql/my_multi.cnf 
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = root
password = root

[mysql1]
ledir = /usr/sbin
socket = /var/lib/mysql1/mysql1.sock
port = 3301
server-id = 1
pid-file = /var/lib/mysql/mysql1.pid
datadir = /var/lib/mysql1
log-bin=/var/lib/mysql1/mysql1_update.log
log_slave_updates
expire_logs_days=7
general_log-file = /var/log/mysql1/all.log
log-error = /var/log/mysql1/error.log
slow-query-log-file=/var/lib/mysql1/slow.log
user = mysql

[mysql2]
ledir = /usr/sbin
socket = /var/lib/mysql2/mysql2.sock
port = 3302
server-id = 2
pid-file = /var/lib/mysql2/mysql2.pid
datadir = /var/lib/mysql2
log-bin=/var/lib/mysql2/mysql2_update.log
log_slave_updates
expire_logs_days=7
general_log-file = /var/log/mysql2/all.log
log-error = /var/log/mysql2/error.log
slow-query-log-file=/var/lib/mysql2/slow.log
user = mysql

启动多个实例

mysqld_multi --defaults-file=/etc/mysql/my_multi.cnf start 1,2

检查实例运行状态

root@ubuntu:# mysqld_multi report
Reporting MySQL servers
MySQL server from group: mysql1 is running
MySQL server from group: mysql2 is running

MySQL的几个异常

1 . mysql命令未找到

使用mysql客户端程序进行连接测试,发现mysql命令找不到,但是mysql-client已经安装。

root@ubuntu:~# mysql -uroot -p -P3301
The program 'mysql' is currently not installed. You can install it by typing:
apt-get install mysql-client-core-5.5

root@ubuntu:~# apt-get install -y mysql-client-core-5.5
Reading package lists... Done
Building dependency tree       
Reading state information... Done
mysql-client-core-5.5 is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.

root@ubuntu:~# apt-get install -y mysql-client
Reading package lists... Done
Building dependency tree       
Reading state information... Done
mysql-client is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 7 not upgraded.

root@ubuntu:~# whereis mysql
mysql: /etc/mysql /usr/lib/mysql /usr/share/mysql
root@ubuntu:~# locate mysql

先留着吧,看啥时候解决。

2 . 同事遇到的错误

因办公地点的物理阻隔,没有面对面的沟通,只是使用邮件在缓慢传递,一段时间后还没有解决,正准备使用SSH远程过去看看时,同事看出问题所在了,原来创建多个实例时定义的datadir定义有误,具体如下。

错误的定义:

/var/lib/mysql/mysql1
/var/lib/mysql/mysql2
/var/lib/mysql/mysql3

现在改为:

/var/lib/mysql1
/var/lib/mysql2
/var/lib/mysql3

重启即正常。

原来/var/lib/mysql为MySQL默认数据库的数据文件目录,在/etc/mysql/my.cnf中有定义,在此目录下,有类似如下的目录结构:

root@ubuntu:~# ls -l /var/lib/mysql
total 28700
-rw-r--r-- 1 mysql mysql        0 Dec 30 10:23 debian-5.5.flag
-rw-rw---- 1 mysql mysql 18874368 Dec 30 14:03 ibdata1
-rw-rw---- 1 mysql mysql  5242880 Dec 30 14:06 ib_logfile0
-rw-rw---- 1 mysql mysql  5242880 Dec 30 09:30 ib_logfile1
drwx------ 2 mysql mysql     4096 Dec 30 10:24 mysql
-rw-rw---- 1 mysql mysql        5 Dec 30 10:51 mysqld1.pid
-rw-rw---- 1 mysql mysql        6 Dec 30 10:37 mysqld2.pid
-rw-r--r-- 1 mysql mysql       91 Dec 30 09:44 mysqld_multi.log
srwxrwxrwx 1 mysql mysql        0 Dec 30 14:06 mysql.sock
drwx------ 2 mysql mysql     4096 Dec 30 10:23 performance_schema
drwx------ 2 mysql mysql     4096 Dec 30 09:39 test
-rw-rw---- 1 mysql mysql        5 Dec 30 14:06 ubuntu.pid

其中,目录mysqlperformance_schematest为启动MySQL的默认数据库。

以上即为此次配置过程,不管对错,以后再做深究;或许是用不做深究。

延伸阅读

参考