如何在机器上创建多个mysql实例

最近提供一个仿真环境的数据库(配置和数据量同线上一样),在现有的数据库服务器上再安装一个实例,目的:

  • 有效利用资源,大部分情况下CPU和内存还是有冗余的
  • 未来一些服务使用独立的数据库实例,可以提前做一些准备

以前也多次提过,在生产环境中不建议使用yum方式安装MySQL,因为太傻瓜化会屏蔽很多细节;同时如果了解不够,安装第二个实例很容易和原有实例冲突,所以建议编译安装。

在mysql有basedir目录(比如/usr/local/mysql)和datadir目录(比如第一个实例是/data/mysql3306),先初始化第二个实例的datadir:

bin/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql3307 --no-defaults --user=mysql

接下去就是启动,注意一些参数可能会冲突,比如 datadir、port、socket、pid、log-bin、log-error,注意这些就可以了,你可以手动运行实例:

bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql3307 --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/mysql3307/mysql.log --pid-file=/data/mysql3307/mysql.pid --socket=/data/mysql3307/3307.sock --port=3307

但是建议将启动参数放入mysql.cnf文件中,比如:

bin/mysqld_safe --defaults-file=/data/mysql3307/3307.cnf &

可是最方便的方式是使用service运行mysql,那么拷贝:

cp  ~/software/mysql-5.6.45/support-files/mysql.server.sh /etc/init.d/mysqld3307
chmod +x /etc/init.d/mysqld3307

不过运行会失败,因为在编译basedir的时候,默认的service会认为只有一个mysql实例运行,所以需要修改mysqld3307,话说回来,/etc/init.d/mysqld对于理解mysql启动和关闭非常有用,修改mysqld3307如下:

basedir=/usr/local/mysql
extra_args="/data/mysql3307/3307.cnf"
mysqld_pid_file_path="/data/mysql3307/3307.pid"
$bindir/mysqld_safe --defaults-file=/data/mysql3307/3307.cnf  --pid-file="/data/mysql3307/3307.pid" >/dev/null &

最后运行第二个实例:

service mysql3307 start

参考:https://dev.mysql.com/doc/refman/5.6/en/multiple-servers.html