配置MySQL服务多实例
- 2024-08-25 23:06:00
- 丁国栋
- 原创 74
因为使用容器部署MySQL有一些弊端,例如性能损失、可维护性等,所以我们选择在同一个Linux性能主机上部署多个MySQL实例,每个MySQL实例都独立提供完整的MySQL服务。
为了实现这个目标我们需要使用通用二进制的安装方式。我们可以去查阅MySQL官方的手册,例如
- Installing MySQL on Unix/Linux Using Generic Binaries 在UNIX/Linux使用通用二进制方式安装MySQL
- Configuring Multiple MySQL Instances Using systemd 使用systemd配置MySQL多实例
实际测试发现,在Ubuntu 22.04(jammy)中无法使用systemd来配置MySQL的多实例,原因是默认安装的MySQL服务器并没有支持通过systemd配置并启动。
所以我们依然使用传统的安装配置方式,每个实例使用单独的目录,使用mysqld命令初始化数据库,使用support-files/mysql.server
来启动和关闭MySQL数据库。
因为主机上已经安装过MySQL server并且处于运行中,所以我们在安装第二个实例时就可以复用一些配置,比如省去了新增mysql用户和组。同时端口号需要用另外一个,不能使用默认的3306端口。
我们以 mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz 为例,演示在 Ubuntu 22.04 jammy 上配置,配置其服务端口为3307。
先准备一个基本的my.cnf配置文件:
[mysqld] datadir=/usr/local/mysql/3307/data socket=/usr/local/mysql/3307/mysql.sock port=3307 log-error=/usr/local/mysql/3307/error.log
基本命令大致如下:
groupadd mysql useradd -r -g mysql -s /bin/false mysql cd ~/downloads wget -c https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz tar xf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz mkdir -p /usr/local/mysql/3307/ rsync -a ~/downloads/mysql-5.7.30-linux-glibc2.12-x86_64/ /usr/local/mysql/3307/ cd /usr/local/mysql/3307 #find /usr/local/mysql/3307/data -delete echo |sudo tee /usr/local/mysql/3307/error.log chown mysql:mysql -R /usr/local/mysql /usr/local/mysql/3307/bin/mysqld --defaults-file=/usr/local/mysql/3307/my.cnf --basedir=/usr/local/mysql/3307 --datadir=/usr/local/mysql/3307/data --lc-messages-dir=/usr/local/mysql/3307/share --lc-messages=en_US --explicit_defaults_for_timestamp --initialize --user=mysql --console --log-error=/usr/local/mysql/3307/error.log /usr/local/mysql/3307/support-files/mysql.server start
以上步骤需要注意以下几点:
bin/mysqld
的第一个参数必须是--defaults-file=/usr/local/mysql/3307/my.cnf
,否则mysqld可能会加载其他 mysql 配置文件,导致初始化失败。- 在使用
mysqld
初始化数据库时使用了--console --log-error=/usr/local/mysql/3307/error.log
参数,数据库的默认密码会输出到/usr/local/mysql/3307/error.log
日志中,搜索字符串[Note] A temporary password is generated for root@localhost
; - Ubuntu系统特有的apparmor类似RHEL系的SELinux,需要进行配置或者禁用,否则可能会在
/var/log/syslog
里收到来自内核(apparmor运行在内核)的错误提示apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/usr/local/mysql/3307/share/english/errmsg.sys" pid=1036654 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=1000 ouid=1000
和apparmor="DENIED" operation="open" profile="/usr/sbin/mysqld" name="/usr/local/mysql/3307/data/" pid=1036654 comm="mysqld" requested_mask="r" denied_mask="r" fsuid=1000 ouid=135
。
使用密码登录到新的MySQL实例
sudo mysql -S /usr/local/mysql/3307/mysql.sock -p
使用ALTER USER
语句完成用户的初始化(就像首次使用必须更改密码),否则会收到mysql提示:ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'XXXXXXXX'
在配置和调试的过程中,我们需要有以下认知:
- 从可信的官网文档中查找最佳实践方法,确保方法是对的,可以行得通的,如果出现问题,那问题多数不在官方,而是在自己的环境和步骤中;
- 在遇到问题时,坚信没有诡异的问题,只有没有搞明白的问题,问题依然存在的原因只是因为我们没有找到问题的根源;
- 保持心平气和的心态,不浮躁;