我可以从完整的mysql mysqldump文件恢复单个表吗?
我有我的MySQL数据库的mysqldump备份,包括我们所有的表大约440兆。 我想恢复mysqldump的其中一个表的内容。 这可能吗? 从理论上讲,我可以删除重build表格所需的部分,但我甚至不知道如何有效地编辑这个大小的文本文档。
你可以尝试使用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
结构的文件mytable.dump
和数据( INSERT
列表)。
我使用了uloBasEI的sed命令的修改版本。 它包含前面的DROP命令,并读取直到mysql完成将数据转储到表(UNLOCK)。 为我工作(重新)导入wp_users到一堆WordPress的网站。
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
这可以更容易地完成? 这是我做到的:
创build一个临时数据库(例如恢复):
mysqladmin -u root -p创build恢复
还原临时数据库中的完整转储:
mysql -u root -p restore <fulldump.sql
转储您要恢复的表:
mysqldump还原mytable> mytable.sql
在另一个数据库中导入表格:
mysql -u root -p database <mytable.sql
一个简单的解决scheme是简单地创build一个你想要单独恢复的表的转储。 您可以使用mysqldump命令使用以下语法执行此操作:
mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
然后正常导入它,它只会导入转储表。
无论如何,任何一个进程都必须通过转储的整个文本并以某种方式进行parsing。 我只是希望
INSERT INTO `the_table_i_want`
并输出到MySQL。 看看转储中的第一张表格,以确保您正确地获取INSERT。
编辑:好的,这次得到了格式化权。
你应该尝试@bryn命令,但是使用分隔符,否则你也将提取有前缀或后缀的表,这是我通常做的:
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' dump.sql > mytable.sql
另外为了testing目的,您可能需要在导入之前更改表名称:
sed -n -e 's/`mytable`/`mytable_restored`/g' mytable.sql > mytable_restored.sql
要导入,您可以使用mysql命令:
mysql -u root -p'password' mydatabase < mytable_restore.sql
-
备用
$ mysqldump -A | gzip > mysqldump-A.gz
-
还原单个表格
$ mysql -e "truncate TABLE_NAME" DB_NAME $ zgrep ^"INSERT INTO \`TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
解决这个问题的一种可能的方法是恢复到临时数据库,并从临时数据库中转储该表。 然后使用新的脚本。
这个工具可能是你想要的: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
这也可能有帮助。
# 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'
大多数现代的文本编辑器应该能够处理一个文本文件的大小,如果你的系统是由它决定的。
无论如何,我必须很快地做到这一点,我没有时间find任何工具。 我build立一个新的MySQL实例,导入整个备份,然后吐出我想要的表。
然后,我将该表导入主数据库。
这是乏味,但相当容易。 祝你好运。
创build一个testing数据库,还原整个数据库,然后将单个表转储到一个文件 – 然后将数据还原到“生产”数据库不是很容易吗?
你可以用vi编辑器。 types:
vi -o mysql.dump mytable.dump
打开整个转储mysql.dump
和一个新文件mytable.dump
。 按/
find合适的插入行,然后键入一个短语,例如:“insert into mytable`”,然后使用yy
复制该行。 按ctrl+w
切换到下一个文件,然后down arrow key
,粘贴复制的行与pp
。 最后通过input:wq
和相当vi编辑器来保存新文件:q
。
请注意,如果您已经使用多个插入来转储数据,则可以使用Nyy
一次性复制(抽出)所有这些Nyy
,其中N
是要复制的行数。
我已经做了920 MB大小的文件。
SQL的块被“表my_table
表结构”和“表my_table
转储数据”封锁。
您可以按如下所示使用Windows命令行来获取各个部分的行号。 根据需要调整search的string。
find/ n“表”sql.txt“
以下内容将被退回:
———- SQL.TXT
[4384] – 表my_table
表结构
[4500] – 为表my_table
转储数据
[4514] – 表some_other_table
表结构
…等
如果我只知道如何使用他们…调查,那么这就得到了你需要的行数。
回到08年,我也需要这样做。 我写了一个Perl脚本来做,现在是我select的方法。 还总结了如何在awk中做到这一点或如何恢复别处和提取。 最近我也将这个sed方法添加到列表中。 你可以在这里find脚本和其他方法: http : //blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
我尝试了几个非常慢的选项。 这在几分钟内将一个360GB转储分成几张表:
如何将mysqldump的输出分割成更小的文件?
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
这是比其他一些更好的解决scheme,因为并非所有的SQL转储都包含DROP TABLE
语句。 这一个将工作将各种倾倒。
前面提到的'sed'解决scheme很好,但是提到的不是100%的安全
-
你可能有INSERT命令的数据包含:… CREATE TABLE …(无论)… mytable …
-
甚至确切的string“CREATE TABLE mytable”;“ 如果你正在存储DML命令,例如!
(如果表是巨大的,你不想手动检查)
我会validation使用的转储版本的确切语法,并有一个更严格的模式search:
避免使用“*”,并使用“^”来确保我们从行首开始。 而我更愿意抓住最初的“DROP”
总而言之,这对我更好:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
得到像Notepad ++或Vim这样的像样的文本编辑器(如果你已经熟练的话)。 search表名,并且应该只能突出显示该表的CREATE,ALTER和INSERT命令。 用键盘而不是鼠标导航可能会更容易。 而且我会确保你的机器有足够的内存,所以一次加载整个文件不会有问题。 一旦你突出显示并复制了你所需要的行,最好把复制的部分备份到它自己的备份文件中,然后把它导入到MySQL中。