6.5 KiB
6.5 KiB
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:从库只复制业务数据库,系统数据库不会被复制
为什么这样配置?
- 系统数据库独立管理:每个MySQL实例的系统数据库都是独立的
- 避免冲突:如果复制系统数据库,可能导致用户权限冲突
- 性能优化:只复制业务数据,减少binlog大小和网络传输
- 安全性:系统数据库包含敏感信息,不应该跨实例复制
🔧 实际部署建议
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 - ✅ 系统数据库内容不需要一致
- ✅ 如果需要从库访问,手动创建业务用户
- ✅ 验证主从复制只同步业务数据库