Files
hzdyjs/docs/部署文档/生产环境双机部署方案/MySQL系统数据库说明.md
T
2025-11-27 00:02:01 +08:00

6.5 KiB
Raw Blame History

MySQL系统数据库说明(主从复制场景)

📋 问题说明

在配置MySQL主从复制时,用户可能会疑惑:系统自带的数据库(information_schema、mysql、performance_schema、sys)是否需要和主库一模一样?

✅ 答案:不需要,也不应该复制

核心结论

系统数据库不需要复制,每个MySQL实例的系统数据库都是独立管理的。


🔍 各系统数据库详解

1. information_schema(信息模式)

特点

  • 只读数据库:MySQL自动维护,用户无法修改
  • 元数据存储:包含数据库、表、列、索引等元数据信息
  • 实时生成:每次查询时动态生成,不存储实际数据

主从复制处理

  • ❌ 不需要复制:每个实例根据自身状态自动生成
  • ✅ 自动管理:MySQL自动维护,无需人工干预

示例

-- 查看所有数据库
SELECT * FROM information_schema.SCHEMATA;

-- 查看表信息
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'hzdyjs_xg';

2. mysql(系统数据库)

特点

  • 用户和权限:存储MySQL用户账户、权限信息
  • 系统表:包含user、db、tables_priv等系统表
  • 可修改:可以通过SQL语句修改(但不建议直接修改表)

主从复制处理

  • ⚠️ 选择性处理:
    • 业务数据库用户:如果业务数据库的用户在主库创建,且需要从库也能访问,可以手动同步
    • 复制用户:主从复制的repl用户需要在主库创建,从库不需要(从库只读)
    • 系统用户:root等系统用户每个实例独立管理

推荐做法

-- 在主库创建业务数据库用户(如果需要从库也能访问)
CREATE USER 'app_user'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON hzdyjs_xg.* TO 'app_user'@'%';

-- 在从库手动创建相同用户(如果需要)
-- 注意:主从复制不会自动复制用户创建语句(因为只复制业务数据库)

当前配置说明

  • 当前配置使用binlog-do-db = hzdyjs_xg,只复制业务数据库
  • mysql数据库的用户和权限不会自动复制
  • 如果需要从库也能访问,需要手动创建用户

3. performance_schema(性能模式)

特点

  • 性能监控:存储MySQL性能监控数据
  • 实例独立:每个MySQL实例独立收集和存储性能数据
  • 实时数据:存储当前实例的性能指标

主从复制处理

  • ❌ 不需要复制:每个实例独立收集性能数据
  • ✅ 自动管理:MySQL自动维护,无需人工干预

示例

-- 查看性能监控数据
SELECT * FROM performance_schema.events_statements_summary_by_digest 
ORDER BY sum_timer_wait DESC LIMIT 10;

4. sys(系统视图)

特点

  • 视图数据库:基于performance_schema和information_schema的视图
  • 便于查询:提供更友好的性能监控查询接口
  • 只读:所有表都是视图,只读

主从复制处理

  • ❌ 不需要复制:基于其他系统数据库的视图,自动生成
  • ✅ 自动管理:MySQL自动维护,无需人工干预

示例

-- 查看慢查询
SELECT * FROM sys.statement_analysis ORDER BY avg_timer_wait DESC LIMIT 10;

-- 查看表IO统计
SELECT * FROM sys.io_global_by_file_by_bytes LIMIT 10;

📊 主从复制配置说明

当前配置

# 主库配置(/etc/my.cnf)
[mysqld]
binlog-do-db = hzdyjs_xg    # 只记录业务数据库的binlog

# 从库配置(/etc/my.cnf)
[mysqld]
replicate-do-db = hzdyjs_xg  # 只复制业务数据库

配置含义

  • binlog-do-db = hzdyjs_xg:主库只记录业务数据库的binlog,系统数据库的变更不会记录
  • replicate-do-db = hzdyjs_xg:从库只复制业务数据库,系统数据库不会被复制

为什么这样配置?

  1. 系统数据库独立管理:每个MySQL实例的系统数据库都是独立的
  2. 避免冲突:如果复制系统数据库,可能导致用户权限冲突
  3. 性能优化:只复制业务数据,减少binlog大小和网络传输
  4. 安全性:系统数据库包含敏感信息,不应该跨实例复制

🔧 实际部署建议

1. 数据初始化

# ✅ 正确做法:只备份业务数据库
mysqldump -u root -p hzdyjs_xg > backup.sql

# ❌ 错误做法:不要备份系统数据库
# mysqldump -u root -p --all-databases > backup.sql  # 不推荐

2. 用户权限管理

场景A:从库只读,不需要业务用户

-- 从库只需要复制用户(repl),业务用户不需要
-- 从库设置为只读,业务应用不直接连接从库

场景B:从库需要业务用户(用于只读查询)

-- 在主库创建用户
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON hzdyjs_xg.* TO 'readonly_user'@'%';

-- 在从库手动创建相同用户
CREATE USER 'readonly_user'@'%' IDENTIFIED BY 'password';
GRANT SELECT ON hzdyjs_xg.* TO 'readonly_user'@'%';

3. 验证系统数据库

-- 在主库查看系统数据库
SHOW DATABASES;

-- 在从库查看系统数据库(应该和主库一样,但内容可能不同)
SHOW DATABASES;

-- 验证:系统数据库存在即可,内容不需要一致
-- information_schema、mysql、performance_schema、sys 都存在即可

✅ 总结

系统数据库处理原则

数据库 是否需要复制 原因 处理方式
information_schema ❌ 不需要 自动生成,只读 自动管理
mysql ⚠️ 选择性 用户权限,但只复制业务数据库 手动创建需要的用户
performance_schema ❌ 不需要 实例独立,性能监控 自动管理
sys ❌ 不需要 基于其他系统数据库的视图 自动管理
hzdyjs_xg ✅ 必须复制 业务数据库 主从复制

部署检查清单

  • ✅ 主库和从库都有系统数据库(自动存在)
  • ✅ 只复制业务数据库hzdyjs_xg
  • ✅ 系统数据库内容不需要一致
  • ✅ 如果需要从库访问,手动创建业务用户
  • ✅ 验证主从复制只同步业务数据库

📚 参考文档