以Linux环境使用包管理器安装的8.0为例,新加配置同理

创建数据目录

默认数据目录在/var/lib/mysql​,用户归属和权限已经属于mysql

在该目录下保存多开的数据目录可以避免一系列奇怪的权限问题,但使用root或其他用户创建的子目录需要手动修改给mysql

# 在目录下创建一个instances目录、和多开的数据目录
sudo mkdir -p /var/lib/mysql/instances/2-3307

# 修改两个子目录的用户归属和权限
sudo chown mysql:mysql /var/lib/mysql/instances
sudo chmod 750 /var/lib/mysql/instances
sudo chown mysql:mysql /var/lib/mysql/instances/2-3307
sudo chmod 750 /var/lib/mysql/instances/2-3307

复制配置文件

复制一个配置文件

sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql-2-3307.cnf

参考如下配置,重点修改:端口port​,数据目录datadir 、socket 、pid-file​,唯一IDserver-id​,日志路径log_error、slow_query_log_file​,可以只参照这几条配置进行修改

注意这里的内存配置比较大,如果要复制全部内容可以丢给AI修改成合适的参数

[mysqld]
# -------------------
# 基础设置
# -------------------
port = 3307
datadir = /var/lib/mysql/instances/2-3307
socket = /var/run/mysqld/mysqld-2-3307.sock
pid-file = /var/run/mysqld/mysqld-2-3307.pid
user = mysql
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
default_storage_engine = InnoDB
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
skip-name-resolve = 1

# ===== 唯一ID(如果开启binlog必须)=====
server-id = 2

# MyISAM
key_buffer_size = 16M
myisam-recover-options = BACKUP

# -------------------
# InnoDB 内存与性能优化
# -------------------
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 2G
innodb_flush_log_at_trx_commit = 2 
innodb_flush_method = O_DIRECT

# 临时表 / 大查询优化
tmp_table_size = 256M
max_heap_table_size = 256M
sort_buffer_size = 1M
join_buffer_size = 1M

performance_schema = OFF 
innodb_thread_concurrency = 0 
innodb_read_io_threads = 8 
innodb_write_io_threads = 8

# -------------------
# 连接与线程
# -------------------
max_connections = 1024
thread_cache_size = 512
table_open_cache = 10000

# -------------------
# 二进制日志
# -------------------
binlog_format = ROW
max_binlog_size = 100M
sync_binlog = 0

# -------------------
# 日志与监控
# -------------------
log_error = /var/log/mysql/error-2-3307.log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-2-3307.log
long_query_time = 2
log_queries_not_using_indexes = 1

修改mysqld数据权限

MySQL使用了AppArmor安全模块来严格限制数据权限,需要给新配置的文件添加权限,使用编辑工具修改文件/etc/apparmor.d/usr.sbin.mysqld​

在文件末尾的}​前面追加

# ========== 自定义 MySQL 多实例支持 (ID 2, 端口 3307) ==========
  # Socket 和锁文件
  /var/run/mysqld/mysqld-2-3307.sock rw,
  /var/run/mysqld/mysqld-2-3307.sock.lock rw,
  /run/mysqld/mysqld-2-3307.sock rw,
  /run/mysqld/mysqld-2-3307.sock.lock rw,

  # PID 文件
  /var/run/mysqld/mysqld-2-3307.pid rw,
  /run/mysqld/mysqld-2-3307.pid rw,

  # 日志文件
  /var/log/mysql/error-2-3307.log rw,
  /var/log/mysql/mysql-2-3307.log rw,

重载策略

sudo apparmor_parser -r /etc/apparmor.d/usr.sbin.mysqld

初始化数据目录

指定使用mysql用户初始化到/var/lib/mysql/instances/2-3307​

sudo mysqld --initialize-insecure \
  --user=mysql \
  --basedir=/usr \
  --datadir=/var/lib/mysql/instances/2-3307

这里附带的参数-insecure​是指创建无密码的实例,密码稍后修改,如果输出空白内容说明成功了

复制Service配置

复制service文件

sudo cp /lib/systemd/system/mysql.service /lib/systemd/system/mysql-2-3307.service

编辑/lib/systemd/system/mysql-2-3307.service​文件,修改ExecStart​部分

ExecStart=/usr/sbin/mysqld --defaults-file=/etc/mysql/mysql-2-3307.cnf

启动服务

# 重新加载 systemd 配置
sudo systemctl daemon-reload
# 启动新实例
sudo systemctl start mysql-2-3307
# 查看状态
sudo systemctl status mysql-2-3307

如果没问题,设置开机自启

sudo systemctl enable mysql-2-3307

连接数据库修改密码

通过socket文件连接

sudo mysql -S /var/run/mysqld/mysqld-2-3307.sock -u root

修改YourNewPassword​为新的密码并更新

CREATE USER 'root'@'%' IDENTIFIED BY 'YourNewPassword';
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

-- 修改完成,退出
exit

如果要外网访问且设置了防火墙,需要开放对应的3307​端口