使用navicat for mysql 误清空表操作恢复数据方法

本文介绍如何使用flushlog定位MySQL日志,通过mysqlbinlog工具生成特定位置的SQL删除语句,并演示如何将删除操作转换为插入操作进行数据恢复的方法。此过程涉及定位日志位置、生成SQL脚本及编辑器操作等关键技术步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、flush log 方便定位

2、定位删除位置 获取 start pos ,end pos 具体行数

3、在mysql bin 文件下 使用下面语句生成 sql ( 删除日志记录)
mysqlbinlog --base64-output=DECODE-ROWS --start-position=35712458 --stop-position=35746614 -v D:\java\mysql\logs\login-bin.000007 > C:\Users\Administrator\Desktop\data\data.sql

4、恢复 替换sql文件删除字段 使其变成 insert 语句 (编辑器: notepad++ )

<think>好的,我需要仔细检查用户提供的存储过程代码是否存在,并指导他们如何在Navicat中运行。首先,我会通读整个代码,查看是否有明显的语法。比如,DELIMITER的使用是否正确,语句结束符是否遗漏,变量声明和游标处理是否符合规范。 接下来,检查临时的创建和使用。用户创建了一个临时temp_combined_data,并在之后进行了TRUNCATE和INSERT操作。需要注意的是,临时在会话结束后会自动删除,但显式地DROP是个好习惯。这里可能存在一个问题:如果临时已经存在且结构不同,CREATE TEMPORARY TABLE IF NOT EXISTS不会覆盖现有结构,可能导致后续操作。不过,用户先TRUNCATE再插入,可能不会有问题,但需要确认。 然后,合并两个的SELECT语句使用了UNION ALL,这没有问题。但字段名在临时中是file_storage_id,而来源字段是img_path和logo_path,需要确保这些字段的类型匹配,都是VARCHAR(255)。此外,WHERE条件过滤了非空和非空字符串的值,这没问题。 在游标部分,声明了游标cur来遍历临时数据。DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 这是正确的,用于处理游标读取结束的情况。循环中使用LEAVE read_loop;退出循环,这部分结构正确。 在UPDATE语句中,使用CONCAT(v_id, v_source_key)生成source_id。这里需要注意v_id是INT类型,与v_source_key(VARCHAR)连接时,可能会隐式转换,但最好显式转换v_id为字符类型,避免潜在问题。例如,使用CONCAT(CAST(v_id AS CHAR), v_source_key)。 另外,需要考虑sys_file_storage中的id字段是否与v_file_storage_id的类型和长度匹配,避免更新失败。如果id是INT类型,而v_file_storage_id是VARCHAR(255),可能会有类型不匹配的问题,需要确认结构是否一致。 关于性能问题,如果数据量较大,使用游标逐行更新可能效率低下。建议改用批量更新,但用户可能因业务逻辑需要逐行处理,所以这点可能需要提醒,但不算。 在Navicat中运行存储过程的部分,需要指导用户如何创建存储过程,执行它,以及处理可能出现的。比如使用查询窗口、分隔符设置是否正确,执行CALL语句等。同时,提醒用户注意事务处理,确保在测试环境中运行,避免操作生产数据。 最后,检查是否有遗漏的分号,尤其是在存储过程体内的语句之间。例如,在TRUNCATE和INSERT之后是否有分号,游标声明和HANDLER声明顺序是否正确。代码中的分号看起来是正确的,DELIMITER也正确设置为$$,避免与存储过程中的分号冲突。 总结可能的问题点:CONCAT的类型隐式转换、游标性能、临时的结构兼容性,以及sys_file_storage字段类型匹配。需要将这些反馈给用户,并提供Navicat的具体操作步骤,包括创建、执行、调试等。</think>### 一、代码检查结果 #### 1. 语法问题 - **游标声明顺序问题**:MySQL要求`DECLARE`语句必须放在其他可执行语句之前。当前代码中`DECLARE cur`前有`TRUNCATE`和`INSERT`语句,会导致 - **缺少处理**:未添加事务回滚机制,批量更新时若中途出会导致数据不一致 - **潜在类型转换问题**:`CONCAT(v_id, v_source_key)`中`v_id`是INT类型,与字符串拼接可能导致隐式转换异常 #### 2. 优化建议 - **游标性能问题**:数据量较大时逐行更新效率低,建议改用批量更新 - **临时改进**:可添加索引提升查询效率 ```sql ALTER TABLE temp_combined_data ADD INDEX idx_id (id); ``` - **添加事务控制**: ```sql START TRANSACTION; -- 更新操作 COMMIT; ``` #### 3. 修正版代码 ```sql DELIMITER $$ CREATE PROCEDURE update_file_source() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE v_id INT; DECLARE v_file_storage_id VARCHAR(255); DECLARE v_source_key VARCHAR(50); -- 必须先声明所有变量再执行其他语句 DECLARE cur CURSOR FOR SELECT id, file_storage_id, source_key FROM temp_combined_data; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 创建临时(调整字段类型匹配) CREATE TEMPORARY TABLE IF NOT EXISTS temp_combined_data ( id INT, file_storage_id VARCHAR(255), source_key VARCHAR(50) ) ENGINE=MEMORY; TRUNCATE TABLE temp_combined_data; -- 显式类型转换 INSERT INTO temp_combined_data SELECT id, img_path, '_imgPath' FROM starry_facility WHERE COALESCE(img_path, '') <> '' UNION ALL SELECT id, logo_path, '_logoPath' FROM os_tablet_design_mst WHERE COALESCE(logo_path, '') <> ''; START TRANSACTION; -- 添加事务 OPEN cur; read_loop: LOOP FETCH cur INTO v_id, v_file_storage_id, v_source_key; IF done THEN LEAVE read_loop; END IF; UPDATE sys_file_storage SET source_id = CONCAT(CAST(v_id AS CHAR), v_source_key) WHERE id = v_file_storage_id; END LOOP; CLOSE cur; COMMIT; -- 提交事务 DROP TEMPORARY TABLE IF EXISTS temp_combined_data; END$$ DELIMITER ; ``` ### 二、Navicat运行指南(以Navicat Premium 15为例) #### 1. 创建存储过程 1. **新建查询窗口**: - 顶部菜单栏点击 `查询` ➔ `新建查询` 2. **粘贴代码**: - 将修正后的代码完整粘贴到查询窗口 3. **设置分隔符**(关键步骤): - 点击工具栏上的 `分隔符` 图标(或按 `Ctrl+Shift+F5`) - 输入自定义分隔符 `$$` 4. **执行创建**: - 点击 `运行` 按钮(闪电图标) - 观察底部消息窗口显示"成功完成查询" #### 2. 执行存储过程 1. **新建查询窗口**: ```sql CALL update_file_source(); ``` 2. **恢复默认分隔符**: - 点击分隔符图标,改回 `;` 3. **执行调用**: - 按 `Ctrl+R` 运行 - 查看受影响行数是否符合预期 #### 3. 验证结果 1. **检查更新记录**: ```sql SELECT * FROM sys_file_storage WHERE source_id LIKE '%_imgPath' OR source_id LIKE '%_logoPath' LIMIT 100; ``` 2. **事务回滚测试**(可选): ```sql START TRANSACTION; CALL update_file_source(); ROLLBACK; -- 确认无后改为COMMIT ``` #### 4. 常见问题处理 1. ** 1449**: - 现象:`The user specified as a definer does not exist` - 解决:使用具有足够权限的数据库账号执行 2. **游标未关闭**: - 现象:`Cursor is already open` - 解决:确保代码中有`CLOSE cur`语句 3. **内存不足**: - 现象:`Can't create/write to temp file` - 解决:在临时创建语句后添加`ENGINE=MEMORY` #### 5. 性能优化建议 1. **分批处理**(适用于大数据量): ```sql INSERT INTO temp_combined_data SELECT ... LIMIT 1000 OFFSET 0; -- 分页插入 ``` 2. **添加批处理日志**: ```sql CREATE TABLE update_log ( batch_time DATETIME, rows_updated INT ); ``` 建议先在测试环境运行完整流程,确认无后再在生产环境执行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sinJack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值