MYSQL备份还原失败终极解决方法

news/2024/10/30 18:19:03/

MYSQL备份还原失败终极解决方法

问题是这样的:先用mysqldump -uroot -p magnetlib>magnetlib.sql备份数据库,成功。然后对magnetlib数据库中的数据记录进行修改。在还原备份的时候却失败了,不仅没有成功还原,反而把数据全删了…
用mysqldump -uroot -p magnetlib<magnetlib.sql还原数据库备份,mysql先是把原表删除,再建新表、执行Insert语句。如果在执行Insert语句的过程中遇到错误,那么最后数据库中就只剩表结构而无数据。
尝试用Source命令恢复,失败。尝试用navicat恢复,失败。但是在navicat中看到了执行的SQL语句。想起来SQL文件是由SQL语句组成的。想查看SQL文件的文本内容,记事本和notepad++都因为文件过大而大不开。最终在手机ES文件浏览器打开。
SQL文件内是多条SQL语句。添加数据的语句是INSERT INTO VALUES(…),(…)语句,且每条INSERT语句不分行。尝试复制一条INSERT语句到Idea的数据库查询控制台中,居然可以正常执行。用自己编写的代码也可以执行该INSERT语句。
对于当前只有表而没有数据的情况,可以读取SQL文件中的所有INSERT语句并执行。代码如下:

package background;import background.connection.ConnectionPool;
import background.connection.ConnectionPoolUtils;import java.io.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;public class ImportFromSQL {/**从SQL文件导入数据* 逐行读取,执行*/public void importFromSQL(String pathname){File file=new File(pathname);if(!file.exists()||file.isDirectory())return;try {BufferedReader reader=new BufferedReader(new FileReader(file));String line=null;int index=0;while ((line=reader.readLine())!=null){//这里只执行修改某个表的语句if(line.startsWith("INSERT INTO `magnets`")){// System.out.println(line);executeSQL(line);System.out.println(index++);}}reader.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/**执行一条SQL语句*/public void executeSQL(String sql){if(sql==null)return;try {statement.executeLargeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}finally {}}Statement statement;//只用一个statement来执行,否则sql可能报内存不足错误Connection conn;/**初始准备:加载连接和Statement*/void init(){ConnectionPool cp= ConnectionPoolUtils.getPoolInstance();conn= null;try {conn = cp.getConnection();statement = conn.createStatement();} catch (SQLException e) {e.printStackTrace();}finally {cp.returnConnection(conn);}}/**关闭数据库连接和语句*/public void close(){try {statement.close();conn.close();} catch (SQLException e) {e.printStackTrace();}}public static void main(String[] args) {ImportFromSQL importFromSQL = new ImportFromSQL();importFromSQL.init();importFromSQL.importFromSQL("D:\\mysql\\mysql-8.0.25-winx64\\bin\\magnetlib.sql");importFromSQL.close();}
}

要修改的部分是获取数据库连接和语句。注意只用一个数据库语句Statement来执行,否则可能使sql报内存不足错误。(猜测sql可能是先提交给语句再执行的,创建多个Statement执行,可能会由于并行而降低执行速度)
执行完成,全部成功,并无报错,3百万条学习记录又回来了。不明白的是:为什么mysql和navicat却还原失败了…


http://www.ppmy.cn/news/598435.html

相关文章

PostgreSQL数据库备份还原脚本

本文对数据库进行的操作主要用到的是PG自带的pg_dumpall、pg_dump、psql这几个命令 备份还原过程&#xff1a; 1&#xff1a;备份全局对象 2: 备份某一个数据库 3&#xff1a;还原全局对象 4&#xff1a;还原备份的数据库 备份详细过程&#xff1a; 第一步&#xff0…

七.deepin备份还原

鉴于deepin的不稳定性&#xff0c;备份还原功能需要多关注一下。 deepin官方提供了深度live系统&#xff0c;集成有系统修复和备份还原的功能&#xff0c;这个系统有点类似windows下的PE工具。 下载深度live系统&#xff1a;https://www.deepin.org/zh/download/ 制作深度liv…

【日常笔记】20230619——修改Linux镜像源

1.打开source.list vim /etc/apt/source.list2.拷贝一份source.list为souce.list.bak cp sources.list sources.list.bak2.修改source.list&#xff0c;将内容覆盖如下 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb-src…

DB2数据库的备份还原详解

备份&#xff1a; 一、连接数据库服务器&#xff08;在服务器端建立备份文件夹&#xff09; windows下&#xff08;winr mstsc&#xff09;输入db2cmd&#xff0c;linux下&#xff08;我使用的是xshell&#xff09; 若当前用户为root则需要切换用户至数据库管理员 db2inst1 …

使用 Navicat 备份还原数据库

基本步骤: 1.将服务器的备份文件夹复制到本&#xff1b; 2.打开软件&#xff1b; 3.选择要备份的数据库&#xff1b; 4.点击备份&#xff0c;然后点击确认。

SQL Server 备份还原教程

看了众多教程&#xff0c;自己也写个增强记忆&#xff0c;错误地方麻烦指出。 ----------------------------------------------------------------------备份-------------------------------------------------------------------- 1.打开数据库&#xff0c;成功连接 2.找到…

dism 如备份服务器系统,还在用 Ghost?系统备份还原 DISM 超详细使用方法

对于Vista及以前的操作系统来说,使用Ghost备份、还原系统无疑是最好的方法,但如果我们使用的是Win7或Win8系统,那么,使用系统自身提供的DISM命令备份、还原系统就是个不错的选择。和Ghost相比,使用DISM命令进行备份、还原系统具有三大优点:一是备份文件的体积极小,可极大…

达梦数据库联机与脱机备份还原

一、备份还原简介 数据库备份是 DBA 日常最重要的工作内容。备份的主要目的是数据容灾&#xff0c;保证数据的安全性&#xff0c;在数据库发生故障时&#xff0c;通过还原备份集&#xff0c;将数据恢复到可用状态。 下面主要讲一下以联机执行SQL 语句进行备份还原和脱机工具 D…