Answers:
您可以尝试使用sed以便仅提取所需的表。
假设您的表的名称是mytable
,文件mysql.dump是包含巨大转储的文件:
$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump
这将在文件中复制mytable.dump
位于CREATE TABLE mytable
与下CREATE TABLE
一个表相对应的下一个之间的内容。
然后,您可以调整mytable.dump
包含表结构mytable
和数据(的列表INSERT
)的文件。
Table structure for table
注释匹配比按CREATE TABLE匹配更有用。这将确保如果忘记删除其DROP TABLE语句,则不会删除下一个表,并允许通过管道进行单命令表还原(gzip | sed | mysql)。但是,此解决方案取决于mysqldump注释语法(我不知道它的标准程度)。
我使用了uloBasEI的sed命令的修改版本。它包含前面的DROP命令,并读取直到mysql完成将数据转储到表中(UNLOCK)为止。为我工作(重新)将wp_users导入到多个Wordpress网站。
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
`mytable`
避免与表匹配mytable2
,以此类推。
sed
不应该干扰编码...
DROP TABLE
(我的MySQL转储没有此文件)的用户,可能要使用:sed -n -e '/-- Table structure for table ``<Table Name>/,/UNLOCK TABLES/p' <SQL File> > table.sql
这利用了MySQl转储中每个表之前提供的表注释,并确保/*!40101 SET @saved_cs_client = @@character_set_client */;
包含类似行。
这可以更容易做到吗?这是我的方法:
创建一个临时数据库(例如,还原):
mysqladmin -u root -p创建还原
恢复临时数据库中的完整转储:
mysql -u root -p恢复<fulldump.sql
转储您要恢复的表:
mysqldump恢复mytable> mytable.sql
将表导入另一个数据库:
mysql -u root -p数据库<mytable.sql
一种或另一种方式,任何执行此操作的过程都必须遍历转储的整个文本并以某种方式对其进行解析。我只是为了
INSERT INTO `the_table_i_want`
并将输出通过管道传递到mysql中。看一下转储中的第一个表,以确保您以正确的方式使用INSERT。
编辑:好的,这次得到了正确的格式。
您应该尝试@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
解决此问题的一种可能方法是还原到临时数据库,然后仅从临时数据库中转储该表。然后使用新脚本。
该工具可能就是您想要的:tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
例如,从数据库转储文件中还原表:
tbdba-restore-mysqldump.pl -t yourtable -s yourdb -f backup.sql
如果您的系统支持,大多数现代文本编辑器都应该能够处理该大小的文本文件。
无论如何,我不得不非常快地执行一次,而且我没有时间找到任何工具。我设置了一个新的MySQL实例,导入了整个备份,然后只吐出了我想要的表。
然后,我将该表导入了主数据库。
这很乏味但是很容易。祝好运。
您可以使用vi编辑器。类型:
vi -o mysql.dump mytable.dump
打开整个转储mysql.dump
和一个新文件mytable.dump
。按下/
,然后输入一个词组,找到合适的插入行,例如:“ insert into`mytable`”,然后使用复制该行yy
。ctrl+w
然后切换到下一个文件,并down arrow key
用复制粘贴行pp
。最后输入,使用,:wq
然后使用vi编辑器保存新文件:q
。
请注意,如果您使用多个插入转储了数据,则可以一次复制(抽出)所有这些数据Nyy
,其中使用的N
是要复制的行数。
我用920 MB大小的文件完成了此操作。
获得像Notepad ++或Vim这样的体面的文本编辑器(如果您已经精通它的话)。搜索表名称,您应该只可以突出显示该表的CREATE,ALTER和INSERT命令。使用键盘而不是鼠标进行导航可能更容易。而且我会确保您使用的机器上有很多内存或RAM,这样就不会立即加载整个文件。突出显示并复制了所需的行后,最好将复制的部分仅备份到其自己的备份文件中,然后将其导入MySQL。
早在08年,我也需要这样做。我写了一个Perl脚本来做,现在是我选择的方法。还总结了如何在awk中执行此操作或如何在其他位置还原并提取。最近,我也将此sed方法也添加到了列表中。您可以在此处找到脚本和其他方法:http : //blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
我尝试了一些选择,这些选择非常慢。这将在几分钟内将360GB转储拆分到其表中:
前面提到的“ sed”解决方案不错,但如上所述并非100%安全
您可能有INSERT命令,其数据包含:... CREATE TABLE ...(无论如何)... mytable ...
甚至确切的字符串“ CREATE TABLE`mytable`;” 例如,如果要存储DML命令!
(如果表很大,则您不想手动检查)
我将验证使用的转储版本的确切语法,并进行更严格的模式搜索:
避免使用“。*”并使用“ ^”来确保我们从该行的开头开始。而且我更愿意选择最初的“ DROP”
总而言之,这对我来说更好:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump