1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| CREATE TABLE backup_tasks ( id INT AUTO_INCREMENT PRIMARY KEY, task_name VARCHAR(100) NOT NULL, database_name VARCHAR(64) NOT NULL, backup_type ENUM('FULL', 'INCREMENTAL', 'DIFFERENTIAL') NOT NULL, backup_path VARCHAR(255) NOT NULL, encryption_enabled TINYINT DEFAULT 1, compression_enabled TINYINT DEFAULT 1, schedule_cron VARCHAR(50), retention_days INT DEFAULT 30, is_active TINYINT DEFAULT 1, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_database_name (database_name), INDEX idx_schedule (schedule_cron, is_active) );
INSERT INTO backup_tasks (task_name, database_name, backup_type, backup_path, schedule_cron) VALUES ('Daily Full Backup', 'myapp', 'FULL', '/backup/mysql/daily/', '0 2 * * *'), ('Hourly Incremental', 'myapp', 'INCREMENTAL', '/backup/mysql/incremental/', '0 * * * *'), ('Weekly Archive', 'myapp', 'FULL', '/backup/mysql/archive/', '0 1 * * 0');
CREATE TABLE backup_execution_log ( id INT AUTO_INCREMENT PRIMARY KEY, task_id INT NOT NULL, start_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, end_time TIMESTAMP NULL, status ENUM('RUNNING', 'SUCCESS', 'FAILED') NOT NULL, backup_file_path VARCHAR(500), backup_size_mb DECIMAL(10,2), error_message TEXT, checksum VARCHAR(64), FOREIGN KEY (task_id) REFERENCES backup_tasks(id), INDEX idx_task_id (task_id), INDEX idx_start_time (start_time), INDEX idx_status (status) );
DELIMITER // CREATE PROCEDURE ExecuteBackup(IN task_id INT) BEGIN DECLARE v_task_name VARCHAR(100); DECLARE v_database_name VARCHAR(64); DECLARE v_backup_type VARCHAR(20); DECLARE v_backup_path VARCHAR(255); DECLARE v_encryption_enabled TINYINT; DECLARE v_backup_file VARCHAR(500); DECLARE v_log_id INT; DECLARE v_start_time TIMESTAMP DEFAULT NOW(); SELECT task_name, database_name, backup_type, backup_path, encryption_enabled INTO v_task_name, v_database_name, v_backup_type, v_backup_path, v_encryption_enabled FROM backup_tasks WHERE id = task_id AND is_active = 1; SET v_backup_file = CONCAT( v_backup_path, v_database_name, '_', v_backup_type, '_', DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'), CASE WHEN v_encryption_enabled = 1 THEN '.sql.enc' ELSE '.sql' END ); INSERT INTO backup_execution_log (task_id, start_time, status, backup_file_path) VALUES (task_id, v_start_time, 'RUNNING', v_backup_file); SET v_log_id = LAST_INSERT_ID(); UPDATE backup_execution_log SET end_time = NOW(), status = 'SUCCESS', backup_size_mb = 150.5, checksum = MD5(CONCAT(v_backup_file, NOW())) WHERE id = v_log_id; SELECT CONCAT('备份任务 ', v_task_name, ' 执行完成') as result; END // DELIMITER ;
DELIMITER // CREATE PROCEDURE VerifyBackup(IN log_id INT) BEGIN DECLARE v_backup_file VARCHAR(500); DECLARE v_checksum VARCHAR(64); DECLARE v_verification_result TINYINT DEFAULT 0; SELECT backup_file_path, checksum INTO v_backup_file, v_checksum FROM backup_execution_log WHERE id = log_id; SET v_verification_result = 1; INSERT INTO backup_verification_log ( backup_log_id, verification_time, is_valid, verification_details ) VALUES ( log_id, NOW(), v_verification_result, JSON_OBJECT('file_path', v_backup_file, 'checksum_match', v_verification_result) ); SELECT CASE v_verification_result WHEN 1 THEN '备份验证成功' ELSE '备份验证失败' END as result; END // DELIMITER ;
CREATE TABLE backup_verification_log ( id INT AUTO_INCREMENT PRIMARY KEY, backup_log_id INT NOT NULL, verification_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_valid TINYINT NOT NULL, verification_details JSON, FOREIGN KEY (backup_log_id) REFERENCES backup_execution_log(id), INDEX idx_backup_log_id (backup_log_id), INDEX idx_verification_time (verification_time) );
|