Skip to content

MariaDB 变更规范

变更规范概述

变更规范是确保数据库变更安全、高效、一致的重要准则,旨在减少变更风险,提高变更成功率。对于MariaDB数据库,变更规范涵盖了DDL、DML、配置、版本和安全等各类变更的实施标准。

DDL变更规范

表结构设计规范

  1. 表名规范

    • 使用小写字母、数字和下划线
    • 避免使用关键字和保留字
    • 表名应具有明确的业务含义
    • 示例:user_infoorder_detail
  2. 字段规范

    • 字段名使用小写字母、数字和下划线
    • 字段类型选择合适的类型和长度
    • 必须定义主键
    • 适当使用NOT NULL约束
    • 合理设置默认值
    • 示例:
      sql
      CREATE TABLE user_info (
        id BIGINT PRIMARY KEY AUTO_INCREMENT COMMENT '用户ID',
        username VARCHAR(50) NOT NULL UNIQUE COMMENT '用户名',
        email VARCHAR(100) NOT NULL UNIQUE COMMENT '邮箱',
        status TINYINT DEFAULT 1 COMMENT '状态:1-启用,0-禁用',
        created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
        updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间'
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
  3. 索引规范

    • 合理创建索引,避免过度索引
    • 主键使用自增ID
    • 唯一键用于确保数据唯一性
    • 普通索引用于常用查询条件
    • 复合索引遵循最左前缀原则
    • 示例:
      sql
      CREATE INDEX idx_user_info_status ON user_info(status);
      CREATE INDEX idx_user_info_created_at ON user_info(created_at);
      CREATE INDEX idx_order_detail_user_id_created_at ON order_detail(user_id, created_at);

DDL变更实施规范

  1. 变更前准备

    • 执行EXPLAIN分析变更影响
    • 在测试环境验证变更
    • 评估变更对性能的影响
    • 准备回滚方案
  2. 实施时间

    • 选择业务低峰期执行
    • 预留足够的回滚时间
    • 避免在业务高峰期执行
  3. 实施命令

    • 使用ALTER TABLE语句时,指定LOCK=NONELOCK=SHARED减少锁影响(MariaDB 10.0+)
    • 对于大表变更,使用pt-online-schema-changegh-ost工具
    • 示例:
      sql
      -- 使用最小锁影响变更
      ALTER TABLE user_info ADD COLUMN phone VARCHAR(20) COMMENT '手机号' LOCK=NONE;
      
      -- 使用pt-online-schema-change工具
      pt-online-schema-change --alter "ADD COLUMN phone VARCHAR(20) COMMENT '手机号'" D=test,t=user_info --execute
  4. 变更后验证

    • 验证表结构变更是否成功
    • 验证数据完整性
    • 验证查询性能
    • 检查错误日志

DML变更规范

数据插入规范

  1. 批量插入

    • 使用INSERT INTO ... VALUES (...)批量插入
    • 控制单次插入数据量,建议不超过1000行
    • 使用事务包裹批量插入
    • 示例:
      sql
      START TRANSACTION;
      INSERT INTO user_info (username, email) VALUES 
        ('user1', 'user1@example.com'),
        ('user2', 'user2@example.com'),
        ('user3', 'user3@example.com');
      COMMIT;
  2. 自增ID管理

    • 避免手动指定自增ID
    • 定期检查自增ID使用情况
    • 对于大表,考虑使用分布式ID生成器

数据更新规范

  1. 条件更新

    • 必须包含WHERE条件
    • 使用索引字段作为更新条件
    • 避免全表更新
    • 示例:
      sql
      -- 推荐:使用索引字段更新
      UPDATE user_info SET status = 0 WHERE id = 1;
      
      -- 不推荐:全表更新
      UPDATE user_info SET status = 0;
  2. 批量更新

    • 控制单次更新的数据量
    • 使用事务包裹批量更新
    • 考虑使用LIMIT限制更新行数
    • 示例:
      sql
      -- 批量更新,每次更新1000行
      UPDATE user_info SET status = 0 WHERE created_at < '2023-01-01' LIMIT 1000;

数据删除规范

  1. 条件删除

    • 必须包含WHERE条件
    • 使用索引字段作为删除条件
    • 避免全表删除
    • 示例:
      sql
      -- 推荐:使用索引字段删除
      DELETE FROM user_info WHERE id = 1;
      
      -- 不推荐:全表删除
      DELETE FROM user_info;
  2. 批量删除

    • 控制单次删除的数据量
    • 使用事务包裹批量删除
    • 考虑使用LIMIT限制删除行数
    • 示例:
      sql
      -- 批量删除,每次删除1000行
      DELETE FROM user_info WHERE created_at < '2023-01-01' LIMIT 1000;
  3. 历史数据处理

    • 对于大量历史数据,考虑使用分区表
    • 历史数据归档到归档表
    • 定期清理过期数据

大数据操作规范

  1. 数据导入

    • 使用LOAD DATA INFILE代替INSERT语句
    • 关闭二进制日志(仅用于非主库)
    • 关闭唯一性检查
    • 示例:
      sql
      -- 优化数据导入
      SET sql_log_bin = 0;
      SET unique_checks = 0;
      LOAD DATA INFILE '/data/user_info.csv' INTO TABLE user_info FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';
      SET unique_checks = 1;
      SET sql_log_bin = 1;
  2. 数据导出

    • 使用SELECT ... INTO OUTFILEmariadb-dump工具
    • 对于大表,考虑分批次导出
    • 示例:
      bash
      # 使用mariadb-dump导出
      mariadb-dump -u root -p test user_info > user_info.sql
      
      # 使用SELECT ... INTO OUTFILE导出
      mysql -u root -p -e "SELECT * FROM test.user_info INTO OUTFILE '/data/user_info.csv' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'";

配置变更规范

参数分类

参数类型生效方式示例
全局动态参数立即生效,无需重启innodb_buffer_pool_size
会话动态参数仅当前会话生效sql_mode
静态参数需要重启生效innodb_data_file_path

参数变更规范

  1. 参数评估

    • 了解参数的作用和影响范围
    • 参考官方文档和最佳实践
    • 在测试环境验证参数效果
    • 评估参数变更对性能的影响
  2. 参数修改

    • 对于动态参数,使用SET GLOBAL语句修改
    • 同时修改配置文件,确保重启后生效
    • 对于静态参数,修改配置文件后重启服务
    • 示例:
      sql
      -- 修改动态参数
      SET GLOBAL innodb_buffer_pool_size = 8589934592;
      
      -- 修改配置文件
      # vi /etc/my.cnf
      [mysqld]
      innodb_buffer_pool_size = 8G
  3. 参数监控

    • 监控参数修改后的系统性能
    • 定期检查参数配置
    • 记录参数变更历史

常用参数配置建议

参数名称建议值说明
innodb_buffer_pool_size物理内存的50%-70%InnoDB缓冲池大小
innodb_log_file_size256M-1GInnoDB日志文件大小
max_connections根据业务需求调整最大连接数
query_cache_size0(建议关闭)查询缓存大小
sort_buffer_size2M-4M排序缓冲区大小
read_buffer_size1M-2M顺序读取缓冲区大小
read_rnd_buffer_size4M-8M随机读取缓冲区大小

版本变更规范

补丁升级规范

  1. 升级前准备

    • 查看补丁说明,了解修复内容
    • 备份数据库和配置文件
    • 在测试环境验证升级
    • 评估升级对业务的影响
  2. 升级实施

    • 选择业务低峰期执行
    • 按照官方文档执行升级步骤
    • 监控升级过程
    • 示例:
      bash
      # RHEL/CentOS系统升级
      yum update -y mariadb-server
      systemctl restart mariadb
      mysql_upgrade -u root -p
      
      # Debian/Ubuntu系统升级
      apt update
      apt install -y mariadb-server
      systemctl restart mariadb
      mysql_upgrade -u root -p
  3. 升级后验证

    • 验证版本升级是否成功
    • 验证业务功能正常
    • 检查错误日志
    • 监控系统性能

版本升级规范

  1. 升级规划

    • 制定详细的升级计划
    • 评估升级风险
    • 准备回滚方案
    • 安排升级时间窗口
  2. 升级步骤

    • 备份数据库和配置文件
    • 升级测试环境
    • 执行预演升级
    • 升级生产环境
    • 示例:
      bash
      # 备份数据库
      mariadb-dump --all-databases --single-transaction --routines --triggers > full_backup.sql
      
      # 升级MariaDB 10.5到10.6
      # 1. 停止服务
      systemctl stop mariadb
      
      # 2. 备份数据目录
      cp -r /var/lib/mysql /var/lib/mysql.bak
      
      # 3. 更新软件源
      # 根据不同发行版更新对应的源
      
      # 4. 安装新版本
      yum install -y mariadb-server-10.6
      
      # 5. 启动服务
      systemctl start mariadb
      
      # 6. 运行升级脚本
      mysql_upgrade -u root -p
  3. 升级后验证

    • 验证版本升级是否成功
    • 验证数据完整性
    • 验证业务功能正常
    • 检查错误日志
    • 监控系统性能

安全变更规范

权限管理规范

  1. 用户管理

    • 遵循最小权限原则
    • 定期清理无用用户
    • 避免使用root用户直接连接数据库
    • 示例:
      sql
      -- 创建用户并授权
      CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'StrongPassword123!';
      GRANT SELECT, INSERT, UPDATE, DELETE ON test.* TO 'app_user'@'192.168.1.%';
      FLUSH PRIVILEGES;
  2. 密码策略

    • 使用强密码,包含大小写字母、数字和特殊字符
    • 定期更换密码
    • 启用密码过期策略
    • 示例:
      sql
      -- 设置密码策略
      SET GLOBAL validate_password_policy = STRONG;
      SET GLOBAL validate_password_length = 12;
      SET GLOBAL default_password_lifetime = 90;

访问控制规范

  1. 网络访问控制

    • 限制数据库监听地址
    • 禁止使用0.0.0.0监听
    • 使用防火墙限制访问IP
    • 示例:
      ini
      # 配置文件中设置监听地址
      [mysqld]
      bind_address = 192.168.1.100
  2. SSL/TLS配置

    • 启用SSL/TLS加密
    • 定期更新证书
    • 禁用弱加密算法
    • 示例:
      ini
      # 配置SSL/TLS
      [mysqld]
      ssl-ca=/etc/mysql/ssl/ca.pem
      ssl-cert=/etc/mysql/ssl/server-cert.pem
      ssl-key=/etc/mysql/ssl/server-key.pem
      require_secure_transport=ON

数据安全规范

  1. 数据加密

    • 启用透明数据加密(TDE)
    • 对敏感字段进行加密存储
    • 示例:
      sql
      -- 创建加密表
      CREATE TABLE sensitive_data (
        id INT PRIMARY KEY,
        data VARCHAR(255)
      ) ENGINE=InnoDB ENCRYPTED=YES DEFAULT ENCRYPTION='Y';
  2. 审计日志

    • 启用审计日志
    • 记录关键操作
    • 定期审查审计日志
    • 示例:
      ini
      # 启用审计日志
      [mysqld]
      plugin-load-add = server_audit.so
      server_audit_logging = ON
      server_audit_events = CONNECT,QUERY,TABLE

变更规范执行

规范执行流程

  1. 规范培训

    • 定期组织变更规范培训
    • 确保所有DBA和开发人员了解规范
    • 定期更新规范内容
  2. 规范检查

    • 对变更申请进行规范审查
    • 定期检查数据库结构和配置
    • 对违规变更进行通报和整改
  3. 规范改进

    • 收集变更过程中的问题和反馈
    • 定期修订和完善变更规范
    • 持续优化变更流程

工具支持

  1. 自动化检查工具

    • 使用mysqlcheck检查表结构
    • 使用pt-table-checksum检查数据一致性
    • 使用mysqltuner.pl检查配置
    • 示例:
      bash
      # 使用mysqltuner.pl检查配置
      perl mysqltuner.pl --host 127.0.0.1 --user root --pass password
      
      # 使用pt-table-checksum检查数据一致性
      pt-table-checksum h=master --replicate test.checksums
  2. 变更管理工具

    • 使用LiquibaseFlyway管理数据库变更
    • 使用版本控制管理变更脚本
    • 示例:
      yaml
      # Liquibase变更集示例
      databaseChangeLog:
        - changeSet:
            id: 1
            author: dba
            changes:
              - createTable:
                  tableName: user_info
                  columns:
                    - column:
                        name: id
                        type: bigint
                        autoIncrement: true
                        constraints:
                          primaryKey: true
                          nullable: false
                    - column:
                        name: username
                        type: varchar(50)
                        constraints:
                          nullable: false
                          unique: true

最佳实践

  1. 变更前充分测试

    • 在测试环境验证所有变更
    • 模拟生产环境负载进行测试
    • 测试回滚方案的可行性
  2. 变更过程监控

    • 实时监控变更过程中的系统状态
    • 监控错误日志和慢查询日志
    • 监控数据库连接数和资源使用率
  3. 变更后验证

    • 验证变更是否达到预期效果
    • 验证业务功能正常
    • 监控系统性能变化
    • 检查数据完整性
  4. 变更文档管理

    • 详细记录每一次变更
    • 包括变更原因、执行步骤、回滚方案和验证结果
    • 变更文档定期归档,便于查询和审计
  5. 持续优化

    • 定期审查变更规范和流程
    • 收集变更过程中的问题和反馈
    • 持续优化变更管理体系

版本差异

MariaDB 10.3及以上

  • 支持ALTER TABLE ... LOCK=NONE语法,减少DDL变更锁影响
  • 增强了透明数据加密功能
  • 支持更多动态参数

MariaDB 10.5及以上

  • 引入了数据 masking 和动态列加密
  • 增强了审计日志功能
  • 支持密码验证插件

MariaDB 10.6及以上

  • 支持TLS 1.3
  • 增强了连接控制插件
  • 改进了密码策略

常见问题(FAQ)

Q1:如何处理大表DDL变更?

A:对于大表DDL变更,建议使用以下方法:

  1. 使用pt-online-schema-changegh-ost工具,避免锁表
  2. 选择业务低峰期执行
  3. 分批次执行变更
  4. 考虑使用影子表方案

Q2:如何优化数据导入性能?

A:可以通过以下方式优化数据导入性能:

  1. 使用LOAD DATA INFILE代替INSERT语句
  2. 关闭二进制日志(仅用于非主库)
  3. 关闭唯一性检查和外键约束
  4. 调整innodb_buffer_pool_sizeinnodb_log_file_size参数
  5. 使用并行导入

Q3:如何确保变更的安全性?

A:确保变更安全性的方法:

  1. 遵循最小权限原则
  2. 所有变更必须有回滚方案
  3. 变更前进行充分测试
  4. 变更过程中实时监控
  5. 变更后进行全面验证
  6. 详细记录变更过程

Q4:如何管理大量的小变更?

A:管理大量小变更的方法:

  1. 使用变更管理工具(如Liquibase、Flyway)
  2. 将相关变更合并为一个变更集
  3. 定期执行批量变更
  4. 使用版本控制管理变更脚本

Q5:如何处理紧急变更?

A:紧急变更处理方法:

  1. 简化变更申请流程,通过电话/即时通讯工具进行紧急审批
  2. 确保有完整的回滚方案
  3. 变更过程中详细记录
  4. 变更完成后补充完整的变更文档
  5. 组织事后评审,分析紧急变更原因

总结

MariaDB变更规范是保障数据库稳定运行的重要准则,涵盖了DDL、DML、配置、版本和安全等各类变更的实施标准。通过遵循变更规范,可以减少变更风险,提高变更成功率,确保数据库的安全性、可靠性和性能。DBA团队应定期培训和审查变更规范,持续优化变更管理体系,适应不断变化的业务需求和技术发展。