我有一个数据库“书籍”,其中包含 100,000 多个项目。
所有包含“Dostoevsky”作者的项目均已删除。但是,我有一个 cronjob 制作的备份 SQL 文件。
我想将陀思妥耶夫斯基的那 20,000 条内容从 SQL 文件放入数据库中。
注意:自备份 cronjob 运行以来,数据库已发生巨大变化。因此,我必须找到一种方法,不从当前数据库中删除任何内容,并从旧数据库中添加具有该特征的所有项目(而不仅仅是启动旧数据库)。
我不知道第一步是什么。 mysqldump 似乎没有这个功能,我在“导入”SQL 文件而不覆盖当前数据库时遇到了一些麻烦。
编辑 1
我做了一个sudo grep“books”backup.sql
它返回了:
INSERT INTO `db` VALUES ('localhost','books','selector','Y','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N','N');
-- Current Database: `books`
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `books` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `books`;
我应该将所有带有 books 的行替换为 old_books 吗?
编辑2
sed -i -- 's/books/old_books/g' *backup.sql*
用于使 sql 文件不覆盖当前数据库
最佳答案
将备份恢复到新架构中,这样您将拥有 books
和 old_books
。根据您创建备份的方式,无论其中是否有use books
,您都需要重写或者直接导入它。
一旦您有两个彼此相邻的模式,请针对旧模式编写一个选择,以选择您想要重新导入到新模式中的所有行。您必须进行查询,使其与新架构完美匹配。沿着这个思路
select title, author, 'invented value only found in new schema' from old_books.books where auther like '%dostojevski%';
然后,当该查询给出您想要的内容时,将其更改为 insert into ... select
,如下所示
insert into books.books
select title, author, 'invented value only found in new schema' from old_books.books where auther like '%dostojevski%';
应该就是这样。之前进行新的备份,这样如果失败,您可以返回。
关于sql - MySQL 将当前数据库与备份 SQL 文件合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147269/