MySQL中怎么实现多实例配置,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
简单地说,MySQL多实例就是在一台服务器上同时开启多个不同的服务端口(如:3306,3307),同时运行多个MySQL服务进程,这些服务进程通过不同的socket监听不同的服务端口来提供服务。
这些MySQL多实例共用一套MySQL安装程序,使用不同的my.cnf(也可以相同)配置文件、启动程序(也可以相同)和数据文件。在提供服务时,多实例MySQL在逻辑上看来是各自独立的,它们根据配置文件的对应设定值,获得服务器相应数量的硬件资源。
打个比方吧,MySQL多实例就相当于房子的多个卧室,每个实例可以看作一间卧室,整个服务器就是一套房子,服务器的硬件资源(cpu,men,disk)、软件资源(CentOS操作系统)可以看作房子的卫生间、厨房、客厅,是房子的共用资源。若你是北漂的小伙伴,与朋友一起租房子,相信更好理解,大家蜗居在一起,休息在自己的卧室,出来活动肯定是要共用上述公共资源。这样就可以很好的理解MySQL多实例了。
其实很多网络服务都是可以配置多实例的,例如nginx、Apache、haproxy、redis等都可以配置多实例。这在门户网站使用都很广泛。
在一台物理机中需要多个测试环境,那么就需要用到了搭建数据库的多个实例,多个实例的意思就是运行多份程序,实例与实例之间没有影响。要注意监听的端口需要不同。
环境:CentOS7.5,编译安装MariaDB-10.2.15版本,软件安装目录:/app/mysql/
1)创建运行的目录环境
[root@centos7 ~]# mkdir -p /mysqldb/{3306,3307,3308}/{etc,socket,pid,log,data,bin} [root@centos7 ~]# chown -R mysql:mysql /mysqldb/
2)初始化数据库
[root@centos7 ~]# cd /app/mysql/ [root@centos7 mysql]# scripts/mysql_install_db --datadir=/mysqldb/3306/data/ --user=mysql --basedir=/app/mysql/ [root@centos7 mysql]# scripts/mysql_install_db --datadir=/mysqldb/3307/data/ --user=mysql --basedir=/app/mysql/ [root@centos7 mysql]# scripts/mysql_install_db --datadir=/mysqldb/3308/data/ --user=mysql --basedir=/app/mysql/
以上是编译安装的,安装目录为/app/mysql/,需要先进入软件的安装目录然后执行初始化脚本,如果是yum安装的包,则直接运行mysql_install_db命令即可
3)提供配置文件并按需要修改
[root@centos7 mysql]# cp support-files/my-huge.cnf /mysqldb/3306/etc/my.cnf [root@centos7 mysql]# cp support-files/my-huge.cnf /mysqldb/3307/etc/my.cnf [root@centos7 mysql]# cp support-files/my-huge.cnf /mysqldb/3308/etc/my.cnf [root@centos7 mysqldb]# cd /mysqldb/ [root@centos7 mysqldb]# vim 3306/etc/my.cnf [mysqld] port = 3306 datadir = /mysqldb/3306/data socket = /mysqldb/3306/socket/mysql.sock [root@centos7 mysqldb]# vim 3307/etc/my.cnf #按以上配置示例更改 [root@centos7 mysqldb]# vim 3308/etc/my.cnf
4)提供服务启动脚本
[root@centos7 ~]# cat mysqld #脚本示例 #!/bin/bash port=3306 #需要修改为当前实例的端口号 mysql_user="root" mysql_pwd="" cmd_path="/app/mysql/bin" #安装目录下的bin mysql_basedir="/mysqldb" #实例数据库文件所在目录 mysql_sock="${mysql_basedir}/${port}/socket/mysql.sock" function_start_mysql() { if [ ! -e "$mysql_sock" ];then printf "Starting MySQL...\n" ${cmd_path}/mysqld_safe --defaults-file=${mysql_basedir}/${port}/etc/my.cnf &> /dev/null & else printf "MySQL is running...\n" exit fi } function_stop_mysql() { if [ ! -e "$mysql_sock" ];then printf "MySQL is stopped...\n" exit else printf "Stoping MySQL...\n" ${cmd_path}/mysqladmin -u ${mysql_user} -p${mysql_pwd} -S ${mysql_sock} shutdown fi } function_restart_mysql() { printf "Restarting MySQL...\n" 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: ${mysql_basedir}/${port}/bin/mysqld {start|stop|restart}\n" esac [root@centos7 ~]# cp mysqld /mysqldb/3306/bin/ [root@centos7 ~]# cp mysqld /mysqldb/3307/bin/ [root@centos7 ~]# cp mysqld /mysqldb/3308/bin/ [root@centos7 ~]# vim /mysqldb/3306/bin/mysqld port=3306 [root@centos7 ~]# vim /mysqldb/3307/bin/mysqld port=3307 [root@centos7 ~]# vim /mysqldb/3308/bin/mysqld port=3308
5)修改脚本文件权限,防止密码被别人看到
[root@centos7 ~]# chmod 700 /mysqldb/3306/bin/mysqld [root@centos7 ~]# chmod 700 /mysqldb/3307/bin/mysqld [root@centos7 ~]# chmod 700 /mysqldb/3308/bin/mysqld
6)启动服务
[root@centos7 ~]# service mysqld stop #保证自己原来的服务停止,释放3306端口 [root@centos7 ~]# /mysqldb/3306/bin/mysqld start #启动服务 [root@centos7 ~]# /mysqldb/3307/bin/mysqld start [root@centos7 ~]# /mysqldb/3308/bin/mysqld start [root@centos7 ~]# ss -tnl #如果看到三个实例监听的端口都打开后说明服务启动正常 LISTEN 0 80 :::3306 :::* LISTEN 0 80 :::3307 :::* LISTEN 0 80 :::3308 :::*
7)连接测试
[root@centos7 ~]# mysql -S /mysqldb/3306/socket/mysql.sock #使用-S指定套接字文件 Server version: 10.2.15-MariaDB-log Source distribution MariaDB [(none)]> show variables like '%port'; #查看端口是否是3306 +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | extra_port | 0 | | large_files_support | ON | | port | 3306 | | report_port | 3306 | +---------------------+-------+ 4 rows in set (0.00 sec) [root@centos7 ~]# mysql -S /mysqldb/3307/socket/mysql.sock #再连接测试一下3307和3308 Server version: 10.2.15-MariaDB-log Source distribution MariaDB [(none)]> show variables like '%port'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | extra_port | 0 | | large_files_support | ON | | port | 3307 | | report_port | 3307 | +---------------------+-------+ 4 rows in set (0.00 sec) [root@centos7 ~]# mysql -S /mysqldb/3308/socket/mysql.sock Server version: 10.2.15-MariaDB-log Source distribution MariaDB [(none)]> show variables like '%port'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | extra_port | 0 | | large_files_support | ON | | port | 3308 | | report_port | 3308 | +---------------------+-------+ 4 rows in set (0.00 sec)
多实例搭建成功!
8)使用这条命令来停止实例
[root@centos7 ~]# /mysqldb/3306/bin/mysqld stop
9)最后一步:给root用户加个密码把~
[root@centos7 ~]# mysql -S /mysqldb/3307/socket/mysql.sock Server version: 10.2.15-MariaDB-log Source distribution MariaDB [(none)]> update mysql.user set password=PASSWORD("your_password") where user='root'; Query OK, 4 rows affected (0.00 sec) MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) MariaDB [(none)]> select user,host,password from mysql.user; +------+-----------+-------------------------------------------+ | user | host | password | +------+-----------+-------------------------------------------+ | root | localhost | *9E72259BA9214F692A85B240647C4D95B0F2E08B | | root | centos7 | *9E72259BA9214F692A85B240647C4D95B0F2E08B | | root | 127.0.0.1 | *9E72259BA9214F692A85B240647C4D95B0F2E08B | | root | ::1 | *9E72259BA9214F692A85B240647C4D95B0F2E08B | | | localhost | | | | centos7 | | +------+-----------+-------------------------------------------+ 6 rows in set (0.00 sec) [root@centos7 ~]# mysql -S /mysqldb/3307/socket/mysql.sock -uroot -p'your_password' #指定密码,再次登录OK~
看完上述内容,你们掌握MySQL中怎么实现多实例配置的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。