一、知识点
1. 备份与恢复的基本概念
备份是指将数据库中的数据复制到其他存储介质上,以防止数据丢失。恢复是指在数据丢失或损坏后,利用备份将数据库还原到某个一致的状态。
2. 备份类型
备份类型 | 说明 | 优点 | 缺点 |
全量备份 | 备份整个数据库的所有数据 | 恢复简单,完整性高 | 占用存储大,备份时间长 |
增量备份 | 仅备份自上次备份(全量或增量)以来发生变化的数据 | 节省存储空间,备份速度快 | 恢复时需要依次应用所有增量,过程复杂 |
差异备份 | 备份自上次全量备份以来所有变化的数据 | 恢复时只需全量+最后一次差异 | 随时间累积,备份大小增大 |
事务日志备份 | 备份事务日志(记录所有修改操作) | 支持时间点恢复(PITR),粒度细 | 日志量可能很大 |
3. 恢复模式
简单恢复模式:仅支持全量备份和差异备份,事务日志自动截断,不能进行日志备份或时间点恢复。
完整恢复模式:支持全量、差异、日志备份,可恢复到任意时间点(需日志连续)。
大容量日志恢复模式:介于两者之间,减少日志空间占用。
4. 常见恢复技术
基于备份的恢复:从全量备份还原,再应用差异/日志备份。
基于日志的恢复:通过重做(REDO)和撤销(UNDO)操作来恢复未提交或已提交的事务。
检查点(Checkpoint):将内存中的脏页写入磁盘,并在日志中记录,缩短崩溃恢复时间。
5. 高可用与容灾
主从复制:一主多从,可读写分离,故障时可手动切换。
集群:多个节点共同提供服务,自动故障转移(如 MySQL Group Replication, Galera)。
异地灾备:在不同地理位置部署副本,应对区域性灾难。
6. 数据库安全基础
身份认证:验证用户身份(密码、证书、多因素等)。
权限管理:使用 GRANT / REVOKE 控制用户对数据库对象的访问权限(SELECT, INSERT, UPDATE, DELETE, DDL等)。
加密:传输加密(SSL/TLS)、静态加密(TDE,透明数据加密)。
审计:记录用户操作日志,用于安全审计和追溯。
SQL注入防护:使用参数化查询、预编译语句、输入验证。
二、具体事例
事例1:备份策略设计
某在线交易系统要求:最多丢失30分钟的数据,并且可以恢复到任意时间点。建议策略:
每周日凌晨进行全量备份。
每天凌晨进行差异备份。
每30分钟进行一次事务日志备份。
恢复步骤:
还原最近一次全量备份。
还原最后一次差异备份(如有)。
依次还原自差异备份之后的所有日志备份。
恢复到故障发生前的时间点(或最后可用日志)。
事例2:基于日志的时间点恢复(MySQL示例)
sql
-- 查看二进制日志列表SHOW BINARY LOGS;-- 恢复到指定时间点mysqlbinlog --stop-datetime="2024-05-01 10:00:00" binlog.000001 | mysql -u root -p
事例3:权限管理示例
sql
-- 创建用户CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password';-- 授予对 orders 表的查询、插入权限GRANT SELECT, INSERT ON db.orders TO 'app_user'@'192.168.1.%';-- 撤销插入权限REVOKE INSERT ON db.orders FROM 'app_user'@'192.168.1.%';-- 查看权限SHOW GRANTS FOR 'app_user'@'192.168.1.%';
事例4:SQL注入防护(Java PreparedStatement)
java
// 危险写法:直接拼接用户输入String sql = "SELECT FROM users WHERE name = '" + userName + "'";// 安全写法:参数化查询String sql = "SELECT FROM users WHERE name = ?";PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, userName);ResultSet rs = ps.executeQuery();

