Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以从完整的mysql转储文件中恢复单个表吗?_Mysql_Backup_Restore - Fatal编程技术网

我可以从完整的mysql转储文件中恢复单个表吗?

我可以从完整的mysql转储文件中恢复单个表吗?,mysql,backup,restore,Mysql,Backup,Restore,我有一个mysql数据库的mysqldump备份,它由我们所有的表组成,大约440兆。我只想从mysqldump恢复其中一个表的内容。这可能吗?从理论上讲,我可以删掉重建我想要的表的部分,但我甚至不知道如何有效地编辑这样大小的文本文档。无论如何,任何这样做的过程都必须遍历转储的整个文本,并以某种方式对其进行解析。我只想为你祈祷 INSERT INTO `the_table_i_want` 并将输出导入mysql。之前,请查看转储中的第一个表,以确保以正确的方式获取INSERT 编辑:好的,这次

我有一个mysql数据库的mysqldump备份,它由我们所有的表组成,大约440兆。我只想从mysqldump恢复其中一个表的内容。这可能吗?从理论上讲,我可以删掉重建我想要的表的部分,但我甚至不知道如何有效地编辑这样大小的文本文档。

无论如何,任何这样做的过程都必须遍历转储的整个文本,并以某种方式对其进行解析。我只想为你祈祷

INSERT INTO `the_table_i_want`
并将输出导入mysql。之前,请查看转储中的第一个表,以确保以正确的方式获取INSERT


编辑:好的,这次格式设置正确。

一种可能的处理方法是恢复到临时数据库,并从临时数据库中转储该表。然后使用新脚本。

大多数现代文本编辑器都应该能够处理这样大小的文本文件,如果您的系统能够胜任的话

不管怎样,我必须很快地做一次,我没有时间找到任何工具。我设置了一个新的MySQL实例,导入了整个备份,然后只输出了我想要的表

然后我将该表导入主数据库

`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`

这很乏味,但相当容易。祝你好运。

找一个像样的文本编辑器,比如记事本++或Vim(如果你已经精通的话)。搜索表名,您应该能够突出显示该表的CREATE、ALTER和INSERT命令。用键盘导航可能比用鼠标导航更容易。我会确保你在一台有足够内存的机器上,这样一次加载整个文件就不会有问题。一旦突出显示并复制了所需的行,最好只将复制的部分备份到自己的备份文件中,然后将其导入MySQL。

您可以尝试使用sed,以便只提取所需的表

假设您的表名为
mytable
,文件
mysql.dump
是包含您的巨大转储的文件:

$ sed -n -e '/CREATE TABLE.*`mytable`/,/Table structure for table/p' mysql.dump > mytable.dump
这将复制到文件
mytable.dump
中,该文件位于
CREATE TABLE mytable
和下一个
CREATE TABLE
对应的下一个表之间


然后,您可以调整文件
mytable.dump
,该文件包含表
mytable
的结构和数据(插入
的列表)。

SQL块被“表
myu表的表结构”和“表
myu表的转储数据”阻止

您可以按如下所示使用Windows命令行来获取各个部分的行号。根据需要调整搜索的字符串

查找/n“for table`”sql.txt

将返回以下内容:

----------SQL.TXT

[4384]--表的表结构
my\u表

[4500]--转储表的数据
my_表

[4514]--表的表结构
some\u other\u表

。。。等等


这会让你得到你需要的行号。。。现在,如果我知道如何使用它们。。。正在调查。

此工具可能就是您想要的:tbdba-restore-mysqldump.pl

e、 g.从数据库转储文件还原表:

tbdba-restore-mysqldump.pl-t yourtable-s yourdb-f backup.sql


早在08年,我也需要这样做。我编写了一个Perl脚本来完成它,现在它是我选择的方法。还总结了如何在awk中执行此操作,或者如何在其他地方恢复和提取。最近,我也在列表中添加了这个sed方法。您可以在这里找到脚本和其他方法:

我使用了uloBasEI的sed命令的修改版本。它包括前面的DROP命令,并一直读取,直到mysql将数据转储到表中为止(解锁)。为我工作(重新)将wp_用户导入到一堆Wordpress网站

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql

这样做更容易吗?我就是这样做的:

创建临时数据库(例如恢复):

mysqladmin-u root-p创建还原

恢复临时数据库中的完整转储:

mysql-u root-p restore 转储要恢复的表:

mysqldump还原mytable>mytable.sql

在另一个数据库中导入该表:

mysql-u root-p数据库
一个简单的解决方案是,只需创建一个您希望单独恢复的表的转储。您可以使用mysqldump命令通过以下语法执行此操作:

mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql

然后按正常方式导入,它将只导入转储的表。

您应该尝试@bryn命令,但使用`分隔符',否则您还将提取带有前缀或后缀的表,这是我通常做的:

sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql
出于测试目的,您可能需要在导入之前更改表名:

sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql
要导入,可以使用mysql命令:

mysql -u root -p'password' mydatabase < mytable_restore.sql
mysql-u root-p'password'mydatabase
这可能也有帮助

# mysqldump -u root -p database0 > /tmp/database0.sql
# mysql -u root -p -e 'create database database0_bkp'
# mysql -u root -p database0_bkp < /tmp/database0.sql
# mysql -u root -p database0 -e 'insert into database0.table_you_want select * from database0_bkp.table_you_want'
#mysqldump-u root-p database0>/tmp/database0.sql
#mysql-u root-p-e“创建数据库0\u bkp”
#mysql-u root-p database0_bkp
前面提到的“sed”解决方案很好,但正如前面提到的,它不是100%安全的

  • 您可以使用包含以下数据的INSERT命令: ... 创建表格…(无论什么)…mytable

  • 甚至是确切的字符串“CREATE TABLE`mytable`;” 例如,如果您正在存储DML命令

(如果表格很大,您不想手动检查)

我将验证使用的转储版本的确切语法,并进行更严格的模式搜索:

避免使用“*”,并使用“^”确保从行的开头开始。 我更喜欢抓住开头的“下降”

总而言之,这对我来说更有效:

sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
YouC
$ mysqldump -A | gzip > mysqldump-A.gz
$ mysql -e "truncate TABLE_NAME" DB_NAME
$ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql.tar.gz | mysql -u<user> -p<password> database_name`
`zgrep -a ^"INSERT INTO \`table_name" DbDump-backup.sql | mysql -u<user> -p<password> database_name`