Mac10.13.6 Mysql5.7.23多实例部署

环境介绍

  • Mac 系统为最新的 macOS 10.13.6
  • MySQL 是使用官网下载安装的 mysql -V : Ver 14.14 Distrib 5.7.23, for macos10.13 (x86_64) using EditLine wrapper
  • 为什么不用homebrew安装,最后会说原因
  • 文中mysql的安装位置为 /usr/local/mysql,如果你的不是,请替换文中的命令路径

准备工作

本次示例使用 mysqld_multi 安装6个 MySQL 实例,端口分别为 3307 ~ 3312。

  1. 创建各实例的单独数据目录,我的目录在 /usr/local/var,data 目录是存放数据文件的,log 目录是存放慢查询日志文件的,执行如下命令:
mkdir -p mysql_3307/data mysql_3307/log mysql_3308/data mysql_3308/log mysql_3309/data mysql_3309/log mysql_3310/data mysql_3310/log mysql_3311/data mysql_3311/log mysql_3312/data mysql_3312/log
  1. 初始化data目录

这一步也很重要,如果跳过,mysql启动会报错导致无法启动

cd /usr/local/mysql/bin
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3307/data
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3308/data
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3309/data
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3310/data
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3311/data
./mysql_install_db --basedir=/usr/local/mysql  --datadir=/usr/local/var/mysql_3312/data
  1. 同理,创建 bin-log 日志文件目录,我的目录在 /usr/local/var/log
mkdir -p mysql_3307 mysql_3308 mysql_3309 mysql_3310 mysql_3311 mysql_3312
  1. 准备配置文件 /usr/local/etc/my_multi.cnf
[mysqld_multi]
mysqld     = /usr/local/mysql/bin/mysqld_safe
mysqladmin = /usr/local/mysql/bin/mysqladmin
user = root
pass = 123456  //注意不要写成password

[mysqld3307]
user = root
server-id  = 3307
port       = 3307
basedir = /usr/local/mysql
socket     = /tmp/mysql_3307.sock
pid-file   = /usr/local/var/mysql_3307/mysql.pid
datadir    = /usr/local/var/mysql_3307/data
log-bin    = /usr/local/var/log/mysql_3307/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3307/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3307/general.log

[mysqld3308]
user = root
server-id  = 3308
port       = 3308
basedir = /usr/local/mysql
socket     = /tmp/mysql_3308.sock
pid-file   = /usr/local/var/mysql_3308/mysql.pid
datadir    = /usr/local/var/mysql_3308/data
log-bin    = /usr/local/var/log/mysql_3308/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3308/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3308/general.log

[mysqld3309]
user = root
server-id  = 3309
port       = 3309
basedir = /usr/local/mysql
socket     = /tmp/mysql_3309.sock
pid-file   = /usr/local/var/mysql_3309/mysql.pid
datadir    = /usr/local/var/mysql_3309/data
log-bin    = /usr/local/var/log/mysql_3309/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3309/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3309/general.log

[mysqld3310]
user = root
server-id  = 3310
port       = 3310
basedir = /usr/local/mysql
socket     = /tmp/mysql_3310.sock
pid-file   = /usr/local/var/mysql_3310/mysql.pid
datadir    = /usr/local/var/mysql_3310/data
log-bin    = /usr/local/var/log/mysql_3310/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3310/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3310/general.log

[mysqld3311]
user = root
server-id  = 3311
port       = 3311
basedir = /usr/local/mysql
socket     = /tmp/mysql_3311.sock
pid-file   = /usr/local/var/mysql_3311/mysql.pid
datadir    = /usr/local/var/mysql_3311/data
log-bin    = /usr/local/var/log/mysql_3311/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3311/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3311/general.log

[mysqld3312]
user = root
server-id  = 3312
port       = 3312
basedir = /usr/local/mysql
datadir    = /usr/local/var/mysql_3312/data
socket     = /tmp/mysql_3312.sock
pid-file   = /usr/local/var/mysql_3312/mysql.pid
log-bin    = /usr/local/var/log/mysql_3312/mysql-bin
binlog_format = mixed
slow_query_log = on
slow_query_log_file = /usr/local/var/log/mysql_3312/slow.log
long_query_time = 1
log-queries-not-using-indexes
log_output = FILE,TABLE
general_log = on
general_log_file = /usr/local/var/log/mysql_3312/general.log

[mysqld]
dmax_connections = 2000
wait_timeout = 10000

validate_password = off

character_set_server=utf8
init_connect='SET NAMES utf8'

#skip-grant-tables
# Only allow connections from localhost
bind-address = 127.0.0.1

启动

执行以下命令启动所有实例:

mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf start

注意,如果通过其他方式安装过mysql,注意cd到刚才安装的5.7.23版本目录下,使用 ./mysqld_multi 来执行,并且将 /usr/local/etc/my_multi.cnf 中配置的 mysqldmysqladmin 的也设置为此路径下的脚本,以确保没有纰漏出现

此时留意当前命令行日志输出,每个实例会生成一个随机的初始密码,后面第一次登录时需要用到。

可以单独启动某个实例或部分实例,只要在命令后面指定具体的实例id即可,实例id为上面配置文件里标签[mysqld3312] 后面的数字:

mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf start 3307
mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf start 3307,3310-3312

同理,停止所有实例:

mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf stop

停止指定实例:

mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf stop 3307,3310-3312

可以使用 report 命令查看实例运行状态:

mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf report

Reporting MySQL servers
MySQL server from group: mysqld3307 is not running
MySQL server from group: mysqld3308 is running
MySQL server from group: mysqld3309 is running
MySQL server from group: mysqld3310 is running
MySQL server from group: mysqld3311 is running
MySQL server from group: mysqld3312 is running

登录各实例服务器并修改密码

登录数据库需要指定各实例使用的socket文件,具体文件如上面配置文件所示。使用如下命令登录:

mysql -uroot -S/tmp/mysql_3307.sock -p

输入初始密码即可登录。登录后需要重置密码:

use mysql;
update user set authentication_string=PASSWORD("123456") where User='root';
update user set password_expired='N' where User='root';
quit

如果初始密码没有记住,可以通过以下方式修改初始密码

  1. 先通过 pa aux | grep mysqld 查找到指定的mysql实例,然后kill掉此实例
  2. 通过以下命令重启此实例,例如实例3312
/bin/sh /usr/local/mysql/bin/mysqld_safe --user=root --server-id=3312 --port=3312 --basedir=/usr/local/mysql --socket=/tmp/mysql_3312.sock --pid-file=/usr/local/var/mysql_3312/mysql.pid --datadir=/usr/local/var/mysql_3312/data --log-bin=/usr/local/var/log/mysql_3312/mysql-bin --binlog_format=mixed --slow_query_log=on --slow_query_log_file=/usr/local/var/log/mysql_3312/slow.log --long_query_time=1 --log-queries-not-using-indexes --log_output=FILE,TABLE --general_log=on --general_log_file=/usr/local/var/log/mysql_3312/general.log --skip-grant-tables --skip-networking &
  1. 无密码方式登录数据库
mysql -uroot -S/tmp/mysql_3312.sock -p
  1. 修改root用户密码和密码有效性
use mysql;
update user set authentication_string=PASSWORD("123456") where User='root';
update user set password_expired='N' where User='root';
quit

最后之我遇见的坑

我通过以上方式完成了步骤,但是无论如何都启动不了5个实例,最后通过ps查看进程发现,所有的mysqld实例使用的 datadir 都是一个默认的相同的路径,但是我查看了我的 /usr/local/etc/my_multi.cnf 文件,明明已经各自指定了不同的 datadir

出现这种情况的时候,我的mysql是通过 brew install mysql 安装的最新版本 8.0.12,这个版本不仅没有 mysql_install_db 脚本导致我安装data的时候历经磨难,没想到最后出现了 mysqld_multi.cnf 指定不了 datadir 这种奇怪的问题。

最后不得已,我从官网下载了 5.7.23 版本,安装后一次启动成功,没有出任何问题。

遗留的问题

我无法通过 mysqld_multi --defaults-file=/usr/local/etc/my_multi.cnf stop 来关闭实例,即使我已经正确的配置了 user 和 pass,最后只能通过以下命令关闭:

/usr/local/mysql/bin/mysqladmin -uroot -p123456 -S /tmp/mysql_3307.sock  shutdown
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容