MySQL多实例安装配置
什么是MySQL多实例?
多实例就是在一台机器上开启多个不同服务端口,运行多个MySQL服务进程,这些服务通过进程通过不同饿socket监听不同的服务端口来提供各自的服务
这些MySQL多实例是公用一套MySQL安装程序,使用不同的my.conf配置文件,启动文件,数据文件。在提供服务同时,多实例MySQL在逻辑上看来就是各自独立的。但是他们是公用资源,所以会有影响。
多实例的作用与问题
1、 有效的利用服务器资源
当单个服务器资源有剩余时,可以充分利用剩余资源提供更多服务。
2、 节约服务器资源
当资金紧张但是数据库又需要各自尽量独立提供给服务,而且需要主从同步等技术时,多实例就很适合
3、 资源互相抢占问题
当某个服务实例并发很高或者有慢查询时,整个实例就会消耗更多的内存、CPU、磁盘io资源,导致服务器上其他实例提供服务的质量下降。这就相当于大家住在一个房子里,做一件事,其他人就需要等待
MySQL配置方案
多配置文件部署方案
通过配置多个配置文件及多个启动程序来实现多实例的方案;
以端口形式划分,3306,3307端口创建实例目录,每个目录下都有各自的实例的数据文件(data),实例的配置文件(my.conf),实例的启动文件(mysql)
单一配置文件部署方案
mysqld_multi
缺点,耦合性太高
安装多实例的数据库
创建MySQL多实例的数据文件目录
一般情况下我们采用/data目录作为MySQL多实例总的根目录然后规划不同的MySQL实例端口来作为/data下的二级目录,不同的端口号就是不同的实例目录,用来区别不同的实例
这里以cmake为例子安装多实例
安装MySQL依赖包
yum install -y ncurses-devel yum install -y libaio-deve
建立MySQL账号
group mysql
useradd -s /sbin/nologin -g mysql -M mysql
创建相关MySQL多实例的目录如下
[root@localhost ~]# mkdir -pv /data/{3306,3307}/data mkdir: created directory ‘/data’ mkdir: created directory ‘/data/3306’ mkdir: created directory ‘/data/3306/data’ mkdir: created directory ‘/data/3307’ mkdir: created directory ‘/data/3307/data’
先将我们单实例的MySQL给kill掉
[root@localhost ~]# pkill mysqld [root@localhost ~]# ps -ef | grep mysqld root 3314 2827 0 09:03 pts/0 00:00:00 grep --color=auto mysqld [root@localhost ~]# ps -ef | grep mysql root 3316 2827 0 09:03 pts/0 00:00:00 grep --color=auto mysql [root@localhost ~]# rm -f /etc/init.d/mysqld 这个操作相当于沃恩前面做实验中初始化之后的操作就不做了 [root@localhost ~]# tree /data/ /data/ 总的多实例根目录 ├── 3306 3306实例的目录 │ └── data 3306实例的数据文件目录 └── 3307 3307实例目录 └── data 3307实例的数据文件目录 4 directories, 0 files
MySQL数据库多实例的配置文件
MySQL数据库默认用户提供了多个配置文件模板,用户可以根据硬件配置大小来选择
my.cnf
port =3306 socket =/data/3306/mysql.sock port =3306 socket =/data/3306/mysql.sock datadir =/data/3306/data long_query_time = 1 #log-error= /data/3306/error.log #log-slow-queries = /data/3306/slow.log pid-file = /data/3306/mysql.pid log-bin = /data/3306/mysql-bin relay-log = /data/3306/relay-bin relay-log-info-file = /data/3306/relay-log.info server-id = 1 log-error = /data/3306/mysql_oldboy3306.err pid-file = /data/3306/mysql.pid 3307 port =3307 socket =/data/3307/mysql.sock port =3307 socket =/data/3307/mysql.sock datadir =/data/3307/data #long_query_time = 1 #log-error= /data/3307/error.log #log-slow-queries = /data/3307/slow.log pid-file = /data/3307/mysql.pid #log-bin = /data/3307/mysql-bin relay-log = /data/3307/relay-bin relay-log-info-file = /data/3307/relay-log.info server-id = 3 log-error = /data/3307/mysql_oldboy3307.err pid-file = /data/3307/mysql.pid
[root@localhost ~]# tree /data/ /data/ ├── 3306 │ ├── data │ └── my.cnf 这就是3306实例的配置文件 └── 3307 ├── data └── my.cnf 这就是3307实例的配置文件 4 directories, 2 files
然后创建多实例的启动文件
#!/bin/sh port=3306 mysql_user="root" mysql_pwd="oldboy" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL... " /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & else printf "MySQL is running... " exit fi } #stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped... " exit else printf "Stoping MySQL... " ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdo wn fi } #restart function function_restart_mysql() { printf "Restarting MySQL... " function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart} " esac 3307 #!/bin/sh port=3307 mysql_user="root" mysql_pwd="oldboy" CmdPath="/application/mysql/bin" mysql_sock="/data/${port}/mysql.sock" #startup function function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL... " /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf 2>&1 > /dev/null & else printf "MySQL is running... " exit fi } #stop function function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped... " exit else printf "Stoping MySQL... " ${CmdPath}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S /data/${port}/mysql.sock shutdo wn fi } #restart function function_restart_mysql() { printf "Restarting MySQL... " function_stop_mysql sleep 2 function_start_mysql } case $1 in start) function_start_mysql ;; stop) function_stop_mysql ;; restart) function_restart_mysql ;; *) printf "Usage: /data/${port}/mysql {start|stop|restart} " esac
多实例启动文件的启动MySQL服务实质 mysql_safe –defaults-file=/data/3306/my.cnf 2>&1 > /dev/nul & mysql_safe –defaults-file=/data/3307/my.cnf 2>&1 > /dev/nul & 多实例启动文件的停止MySQL服务实质 mysqladmin -u root -p123456 -S /data/3306/mysql.sock shutdown mysqladmin -u root -p123456 -S /data/3307/mysql.sock shutdown
[root@localhost ~]# tree /data/ /data/ ├── 3306 │ ├── data │ ├── my.cnf │ └── mysql └── 3307 ├── data ├── my.cnf └── mysql 4 directories, 4 files
配置MySQL多实例文件的权限
[root@localhost ~]# chown -R mysql.mysql /data [root@localhost ~]# find /data/ -type f -name "mysql" | xargs ls -l -rw-r--r--. 1 mysql mysql 1307 Oct 23 09:44 /data/3306/mysql -rw-r--r--. 1 mysql mysql 1307 Oct 23 09:44 /data/3307/mysql [root@localhost ~]# find /data/ -type f -name "mysql" | xargs chmod +x [root@localhost ~]# find /data/ -type f -name "mysql" | xargs ls -l -rwxr-xr-x. 1 mysql mysql 1307 Oct 23 09:44 /data/3306/mysql -rwxr-xr-x. 1 mysql mysql 1307 Oct 23 09:44 /data/3307/mysql
配置MySQL全局使用路径
[root@localhost ~]# tail -1 /etc/profile export PATH=/application/mysql/bin:$PATH
第二种办法
就是把/usr/local/mysql/bin下的命令拷贝到全局命令路径下/usr/local/sbin下 /bin/cp /usr/local/mysql/bin/* /usr/local/sbin
初始化数据库
cd /application/mysql/scripts/ ./mysql_install_db –basedir=/application/mysql –datadir=/data/3306/data –user=mysql ./mysql_install_db –basedir=/application/mysql –datadir=/data/3307/data –user=mysql
为什么要初始化,就是创建基础的数据库文件
最直接的结果就是在你data目录下放了库表的数据了
这个时候就可以启动数据库了
[root@root scripts]# /data/3306/mysql start Starting MySQL... [root@root scripts]# /data/3307/mysql start Starting MySQL...
此时服务已经启动了
如果出错,检查自己的错误日志,这里里面会告诉你
多实例的登录
[root@root scripts]# mysql -S /data/3306/mysql.sock Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.32-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> mysql> create database d3306; Query OK, 1 row affected (0.00 sec) mysql>
对于多实例的登录可以指定sock登录
[root@root ~]# mysql -S /data/3307/mysql.sock Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 1 Server version: 5.5.32 Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) mysql> create database d3307; Query OK, 1 row affected (0.01 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d3307 | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> system ls 2019 data.zip Downloads Music Templates zhangsan__01 anaconda-ks.cfg Desktop install.log Pictures Videos zhangsan__02 data Documents install.log.syslog Public zhangsan__00 mysql> system mysql -S /data/3306/mysql.sock Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 2 Server version: 5.5.32-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d3306 | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> exit Bye mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | d3307 | | mysql | | performance_schema | | test | +--------------------+ 5 rows in set (0.00 sec) mysql>
登录数据库
mysql -S /data/3306/mysql.sock mysql -S /data/3306/mysql.sock
重启数据库
/data/3306/mysql stop /data/3307/mysql stop /data/3306/mysql start /data/3307/mysql start
此时可以发现,MySQL无法停止,这是因为你的MySQL没有密码
[root@root 3306]# /data/3306/mysql stop Stoping MySQL... /application/mysql/bin/mysqladmin: connect to server at 'localhost' failed error: 'Access denied for user 'root'@'localhost' (using password: YES)'
MySQL安全配置
为root增加密码
mysqladmin -u root -S /data/3306/mysql.sock password ‘123456’ mysqladmin -u root -S /data/3307/mysql.sock password '123456'
此时会发现无法登录了
[root@root 3306]# mysql -S /data/3306/mysql.sock ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO) [root@root 3306]# vim /data/3306/mysql [root@root 3306]# vim /data/3307/mysql
修改其中mysql_pwd为自己设置的密码
但是由于密码是在脚本文件中的,我们出与安全的考虑需要设置一下他的权限
[root@root 3306]# find /data/ -type f -name "mysql" -exec chmod 700 {} ; [root@root 3306]# find /data/ -type f -name "mysql" -exec chown root.root {} ; [root@root 3306]# find /data/ -type f -name "mysql" -exec ls -l {} ; -rwx------. 1 root root 1307 Oct 23 21:28 /data/3306/mysql -rwx------. 1 root root 1307 Oct 23 21:28 /data/3307/mysql
此时我们将mysqldpkill掉
[root@root 3306]# pkill mysqld [root@root 3306]# pkill mysqld [root@root 3306]# netstat -lntup | grep 330
重新启动mysql
[root@root 3306]# /data/3306/mysql start Starting MySQL... [root@root 3306]# /data/3307/mysql start Starting MySQL...
也可以停止mysql服务了
[root@root 3306]# /data/3306/mysql stop Stoping MySQL... [root@root 3306]# /data/3307/mysql stop Stoping MySQL...
删除多余的mysql用户
mysql> select user,host from mysql.user; mysql> delete from mysql.user where user="";
如何再增加一个MySQL实例
以3308端口为例
[root@root ~]# mkdir /data/3308/data -p [root@root ~]# cp /data/3306/my.cnf /data/3308/ [root@root ~]# cp /data/3306/mysql /data/3308/ [root@root ~]# chown -R mysql.mysql /data/
Vim对内容做一个替换g/3306/s//3307/g或者:%s/3306/3307/g
[root@root scripts]# ./mysql_install_db --user=mysql --basedir=/application/mysql --datadir=/data/3308/data/
[root@root ~]# /data/3308/mysql start Starting MySQL... [root@root ~]# ss -tnl | grep --color=auto 330 LISTEN 0 128 *:3306 *:* LISTEN 0 128 *:3307 *:* LISTEN 0 128 *:3308 *:* 修改密码 [root@root ~]# mysqladmin -u root -S /data/3308/mysql.sock password '123456' 登录3308端口的mysql [root@root ~]# mysql -S /data/3308/mysql.sock -u root -p123456 Welcome to the MySQL monitor. Commands end with ; or g. Your MySQL connection id is 3 Server version: 5.5.32-log Source distribution Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or 'h' for help. Type 'c' to clear the current input statement. mysql> select user,host from mysql.user -> ; +------+-----------+ | user | host | +------+-----------+ | root | 127.0.0.1 | | root | ::1 | | | localhost | | root | localhost | | | root | | root | root | +------+-----------+ 6 rows in set (0.00 sec) mysql> mysql本地登录指定sock 远程登录mysql -uroot -p123456 -P3308 -h 192.168.17.13
至此,MySQL多实例结束