当前位置: 首页 > news >正文

数据库备份与策略【全量备份、增量备份、日志恢复】

数据库备份策略与SQL语句实现

一、基础备份SQL语句

1. 全量备份(逻辑备份)

-- 备份单个数据库
mysqldump -u [username] -p[password] --single-transaction --routines --triggers 
--events --master-data=2 [database_name] > backup.sql-- 备份所有数据库
mysqldump -u [username] -p[password] --all-databases --single-transaction 
--routines --triggers --events --master-data=2 > full_backup.sql-- 压缩备份
mysqldump -u [username] -p[password] [database_name] | gzip > backup_$(date +%Y%m%d).sql.gz

2. 增量备份(基于二进制日志)

-- 查看当前二进制日志状态
SHOW MASTER STATUS;-- 刷新日志并开始新日志文件(用于定时增量备份)
FLUSH BINARY LOGS;-- 备份二进制日志
mysqlbinlog --start-datetime="2023-07-01 00:00:00" --stop-datetime="2023-07-02 00:00:00" 
/mysql/data/binlog.000123 > binlog_backup_20230701.sql

二、自动化备份策略实现

1. 创建备份存储过程

DELIMITER //
CREATE PROCEDURE sp_daily_backup()
BEGINDECLARE backup_path VARCHAR(255) DEFAULT '/backup/mysql/';DECLARE backup_file VARCHAR(255);SET backup_file = CONCAT(backup_path, 'full_', DATE_FORMAT(NOW(), '%Y%m%d'), '.sql');-- 执行全量备份(通过系统调用)SET @cmd = CONCAT('mysqldump -u backup_user -pbackup_pass --all-databases --single-transaction --routines --triggers --events > ', backup_file);SET @output = sys_exec(@cmd);-- 记录备份日志INSERT INTO backup_logs (backup_type, backup_file, start_time, end_time, status)VALUES ('FULL', backup_file, NOW(), NOW(), IF(@output=0, 'SUCCESS', 'FAILED'));-- 刷新二进制日志FLUSH BINARY LOGS;
END //
DELIMITER ;

2. 创建备份日志表

CREATE TABLE backup_logs (id INT AUTO_INCREMENT PRIMARY KEY,backup_type ENUM('FULL', 'INCREMENTAL') NOT NULL,backup_file VARCHAR(255) NOT NULL,start_time DATETIME NOT NULL,end_time DATETIME NOT NULL,status ENUM('SUCCESS', 'FAILED', 'IN_PROGRESS') NOT NULL,file_size BIGINT,checksum VARCHAR(64),notes TEXT
);

三、备份策略SQL实现

1. 全量备份策略(每周日)

CREATE EVENT ev_weekly_full_backup
ON SCHEDULE EVERY 1 WEEK STARTS '2023-07-02 02:00:00'
DO
BEGINCALL sp_daily_backup();-- 清理30天前的旧备份SET @old_backups = CONCAT('find /backup/mysql/ -name "full_*.sql" -mtime +30 -exec rm {} \\;');SET @output = sys_exec(@old_backups);
END;

2. 增量备份策略(每日)

CREATE EVENT ev_daily_incremental
ON SCHEDULE EVERY 1 DAY STARTS '2023-07-01 01:00:00'
DO
BEGINDECLARE last_log_file VARCHAR(255);DECLARE last_log_pos INT;DECLARE backup_file VARCHAR(255);-- 获取上次备份位置SELECT MAX(backup_file) INTO @last_backup FROM backup_logs WHERE backup_type = 'FULL' OR backup_type = 'INCREMENTAL' ORDER BY id DESC LIMIT 1;-- 备份自上次以来的二进制日志SET backup_file = CONCAT('/backup/mysql/incr_', DATE_FORMAT(NOW(), '%Y%m%d'), '.sql');SET @cmd = CONCAT('mysqlbinlog --read-from-remote-server --host=localhost --user=backup_user --password=backup_pass ','--raw --stop-never --result-file=', backup_file, ' binlog.000123');SET @output = sys_exec(@cmd);-- 记录备份日志INSERT INTO backup_logs (backup_type, backup_file, start_time, end_time, status)VALUES ('INCREMENTAL', backup_file, NOW(), NOW(), IF(@output=0, 'SUCCESS', 'FAILED'));
END;

四、物理备份策略(XtraBackup)

# 全量备份
innobackupex --user=backup_user --password=backup_pass /backup/mysql/full_$(date +%Y%m%d)# 增量备份
innobackupex --user=backup_user --password=backup_pass 
--incremental /backup/mysql/incr_$(date +%Y%m%d) 
--incremental-basedir=/backup/mysql/full_20230701

五、备份验证与恢复

1. 验证备份完整性

-- 创建校验表
CREATE TABLE backup_verification (id INT AUTO_INCREMENT PRIMARY KEY,backup_file VARCHAR(255) NOT NULL,verification_time DATETIME NOT NULL,record_count INT,checksum VARCHAR(64),status ENUM('VALID', 'INVALID', 'PENDING')
);-- 定期验证备份(示例:验证最近的全量备份)
INSERT INTO backup_verification (backup_file, verification_time, status)
SELECT backup_file, NOW(), 'PENDING' FROM backup_logs 
WHERE backup_type = 'FULL' 
ORDER BY id DESC LIMIT 1;

2. 恢复测试SQL

-- 准备恢复脚本
CREATE TABLE restore_procedures (id INT AUTO_INCREMENT PRIMARY KEY,backup_file VARCHAR(255) NOT NULL,restore_command TEXT NOT NULL,last_test_time DATETIME,test_result ENUM('SUCCESS', 'FAILED', 'NOT_TESTED')
);-- 记录恢复步骤
INSERT INTO restore_procedures (backup_file, restore_command)
VALUES 
('full_20230701.sql', 'mysql -u root -p[password] < /backup/mysql/full_20230701.sql'),
('incr_20230702.sql', 'mysqlbinlog /backup/mysql/incr_20230702.sql | mysql -u root -p[password]');

六、备份策略最佳实践

  1. 3-2-1备份原则

    • 至少保留3份备份
    • 存储在2种不同介质上
    • 1份异地备份
  2. 备份保留策略

    -- 自动清理旧备份
    CREATE EVENT ev_clean_old_backups
    ON SCHEDULE EVERY 1 DAY
    DO
    BEGIN-- 删除超过30天的全量备份SET @cmd = 'find /backup/mysql/ -name "full_*.sql" -mtime +30 -delete';SET @output = sys_exec(@cmd);-- 删除超过7天的增量备份SET @cmd = 'find /backup/mysql/ -name "incr_*.sql" -mtime +7 -delete';SET @output = sys_exec(@cmd);
    END;sq
    
  3. 监控备份状态

    -- 检查最近备份状态
    SELECT * FROM backup_logs 
    ORDER BY end_time DESC 
    LIMIT 5;-- 检查备份失败情况
    SELECT * FROM backup_logs 
    WHERE status = 'FAILED' 
    AND start_time > DATE_SUB(NOW(), INTERVAL 7 DAY);
    
http://www.xdnf.cn/news/389647.html

相关文章:

  • python:trimesh 用于 STL 文件解析和 3D 操作
  • 深入剖析缓存与数据库一致性:Java技术视角下的解决方案与实践
  • 【连载14】基础智能体的进展与挑战综述-多智能体系统设计
  • MySQL 数据库故障排查指南
  • 网络安全设备配置与管理-实验5-p150虚拟防火墙配置
  • 【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践
  • JVM中的安全点是什么,作用又是什么?
  • python 新闻 api + react js 客户端。
  • MinIO自定义权限策略语法深度解析
  • 苍穹外卖-创建阿里云oss工具包
  • Agent杂货铺
  • 大模型知识蒸馏(Qwen2.5系列模型KL散度蒸馏)
  • leetcode热题100——day26
  • 当虚拟照进现实——《GTA6》如何重新定义开放世界的可能性‌
  • Git的核心作用详解
  • pwm控制
  • istio in action之服务网格和istio组件
  • LLM框架
  • Ubuntu 24服务器部署abp vnext应用程序的完整教程
  • 模块自动导入的小工具
  • 使用go开发安卓程序
  • 【漫话机器学习系列】252.零损失(0-1 Loss)
  • 豆包:国内 web 辅助开发的领头羊
  • 79.评论日记
  • Linux防火墙
  • Python模块与包以及工程文件管理
  • 【Python训练营打卡】day22 @浙大疏锦行
  • Linux-Ext系列文件系统
  • AI Agent(10):个人助手应用
  • Transformer Decoder-Only 参数量计算