一个 MySQL 实例能管理多个数据库吗?
能,而且这是最常见、最轻量的多数据库组织方式。
mysql服务进程(即一个
mysqld实例)天然支持创建任意数量的逻辑数据库(
database),它们共享同一套配置、用户权限体系和存储引擎资源。不需要启动多个
mysqld进程,也不需要额外端口或数据目录。
典型场景:一个测试服务器上同时跑
shop_dev、
blog_test、
analytics_staging;或者 SaaS 系统为每个租户分配独立库名(如
tenant_001、
tenant_002)。
如何安全隔离多数据库间的访问?
靠 MySQL 的权限系统,不是靠物理隔离。必须显式为每个用户授予特定数据库的权限,否则默认无权访问任何库。
用CREATE USER创建独立账号,避免复用
root用
GRANT ... ON database_name.* TO 'user'@'host'限定作用域,不要用
ON *.*敏感库(如
mysql系统库)需单独
DENY或跳过授权 执行
FLUSH PRIVILEGES生效(仅在直接操作
mysql.user表时必需)
CREATE USER 'app_shop'@'10.0.1.%' IDENTIFIED BY 'p@ssw0rd'; GRANT SELECT, INSERT, UPDATE ON shop_dev.* TO 'app_shop'@'10.0.1.%'; GRANT SELECT ON analytics_staging.report_view TO 'app_shop'@'10.0.1.%'; -- 不给 DROP、CREATE、ALTER 权限,除非明确需要
什么时候必须启多个 MySQL 实例?
当出现以下任一情况时,单实例多库不再适用:
需要不同版本(如 5.7 和 8.0 并存) 要求完全独立的配置(如innodb_buffer_pool_size、
max_connections彼此冲突) 某库需启用
log_bin做主从,其他库严禁写 binlog 安全合规强制物理隔离(如金融类业务中生产/审计库必须分实例)
此时需用多实例部署:每个
mysqld使用独立的
my.cnf配置文件、
datadir、
port和
socket路径。Linux 下常用
mysqld_multi或 systemd 多 service 方式管理,但运维成本显著上升。
备份与恢复时最容易忽略的细节
用
mysqldump备份多库时,默认会把所有库一起 dump,极易误操作: 只备份指定库:必须加
--databases参数,否则
mysqldump db1 db2会被当作“导出 db1 中的表 db2” 还原前确认目标库是否存在:
mysql命令不自动建库,需先
CREATE DATABASE或加
--create-options含
CREATE DATABASE语句的 dump 文件,还原时若库已存在会报错,加
--force可跳过(慎用)
mysqldump --databases shop_dev blog_test > multi_db_backup.sql # 还原前检查: mysql -e "SHOW DATABASES LIKE 'shop_dev';" # 再执行: mysql < multi_db_backup.sql
跨实例迁移库时,注意
DEFINER子句和存储过程权限,常导致还原后函数无法执行。
