我有一个我的mysql数据库的mysqldump备份,包括我们所有的表,大约440兆 . 我想从mysqldump中恢复其中一个表的内容 . 这可能吗?从理论上讲,我可以删除重建我想要的表的部分,但我甚至不知道如何有效地编辑大小的文本文档 .
这可以更轻松地完成吗?我就这样做了:
创建临时数据库(例如还原):
mysqladmin -u root -p create restore
恢复临时数据库中的完整转储:
mysql -u root -p restore <fulldump.sql
转储要恢复的表:
mysqldump恢复mytable> mytable.sql
在另一个数据库中导入表:
mysql -u root -p database <mytable.sql
一个简单的解决方案是简单地创建一个只想要单独恢复的表的转储 . 您可以使用mysqldump命令使用以下语法执行此操作:
mysqldump -u [user] -p[password] [database] [table] > [output_file_name].sql
然后像往常一样导入它,它只会导入转储的表 .
无论如何,执行该操作的任何进程都必须遍历转储的整个文本并以某种方式解析它 . 我只是为了
INSERT INTO `the_table_i_want`
并将输出传递给mysql . 看一下转储中的第一个表,确保你以正确的方式获得INSERT .
编辑:好的,这次格式正确 .
您可以尝试使用sed以仅提取所需的表 .
假设您的表名是 mytable ,文件mysql.dump是包含您的巨大转储的文件:
mytable
$ sed -n -e '/CREATE TABLE.*`mytable`/,/CREATE TABLE/p' mysql.dump > mytable.dump
这将复制到 mytable.dump 文件中 CREATE TABLE mytable 与下一个表格对应的下一个 CREATE TABLE 之间的内容 .
mytable.dump
CREATE TABLE mytable
CREATE TABLE
然后,您可以调整包含表 mytable 的结构的文件 mytable.dump 和数据( INSERT 的列表) .
INSERT
我使用了uloBasEI的sed命令的修改版本 . 它包括前面的DROP命令,并读取直到mysql完成将数据转储到您的表(UNLOCK) . 为我工作(重新)将wp_users导入到一堆Wordpress网站 .
sed -n -e '/DROP TABLE.*`mytable`/,/UNLOCK TABLES/p' mydump.sql > tabledump.sql
您应该尝试使用@bryn命令,但使用`delimiter,否则您还将提取具有前缀或后缀的表,这是我通常所做的:
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
$ 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'
如果您的系统符合要求,大多数现代文本编辑器应该能够处理大小的文本文件 .
无论如何,我必须非常快地做到这一点,我没有时间找到任何工具 . 我设置了一个新的MySQL实例,导入了整个备份,然后只吐出我想要的表 .
然后我将该表导入主数据库 .
这很乏味但很容易 . 祝好运 .
您可以使用vi编辑器 . 类型:
vi -o mysql.dump mytable.dump
打开整个转储 mysql.dump 和一个新文件 mytable.dump . 按 / 找到相应的插入行,然后键入短语,例如:"insert into mytable",然后使用 yy 复制该行 . 通过 ctrl+w 然后 down arrow key 切换到下一个文件,用 pp 粘贴复制的行 . 最后通过 :q 键入 :wq 和相当vi编辑器来保存新文件 .
mysql.dump
/
yy
ctrl+w
down arrow key
pp
:q
:wq
请注意,如果您使用多个插入转储数据,则可以使用 Nyy 一次复制(猛拉)所有数据,其中 N 是要复制的行数 .
Nyy
N
我用920 MB大小的文件完成了它 .
sed -n -e '/-- Table structure for table `my_table_name`/,/UNLOCK TABLES/p' database_file.sql > table_file.sql
这是比上述其他一些更好的解决方案,因为并非所有SQL转储都包含 DROP TABLE 语句 . 这个将工作将各种转储 .
DROP TABLE
获得一个体面的文本编辑器,如Notepad或Vim(如果你已经精通它) . 搜索表名,您应该只能突出显示该表的CREATE,ALTER和INSERT命令 . 用键盘而不是键盘导航可能更容易老鼠 . 我会确保你在一台有足够或RAM的机器上,以便一次加载整个文件不会有问题 . 一旦您突出显示并复制了所需的行,最好将复制的部分备份到自己的备份文件中,然后将其导入MySQL .
使用“表结构为表 my_table " and "转储表 my_table 的数据”来阻止SQL的块 .
my_table
您可以按如下方式使用Windows命令行来获取各个部分的行号 . 根据需要调整搜索的字符串 .
find / n“for table`”sql.txt
将返回以下内容:
---------- SQL.TXT
[4384] - 表格 my_table 的表格结构
[4500] - 转储表的数据 my_table
[4514] - 表 some_other_table 的表结构
some_other_table
...等
这可以获得你需要的行号...现在,如果我只知道如何使用它们......调查 .
回到'08 I had a need to do this too. I wrote a Perl script that' ll做到了,它现在是我选择的方法 . 还总结了如何在awk中执行此操作或如何在其他地方恢复并提取 . 最近我也将这个sed方法添加到列表中 . 您可以在此处找到脚本和其他方法:http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
我试了几个选项,速度非常慢 . 这会在几分钟内将360GB转储拆分到其表中:
How do I split the output from mysqldump into smaller files?
前面提到的'sed'解决方案很不错,但提到并非100%安全
您可能拥有包含以下数据的INSERT命令:... CREATE TABLE ...(无论如何)... mytable ...
甚至是确切的字符串“CREATE TABLEmytable;”如果你正在存储DML命令!
(如果表格很大,你不想手动检查)
我将验证所使用的转储版本的确切语法,并具有更严格的模式搜索:
避免使用“ . *”并使用“^”以确保我们从行的开始处开始 . 我宁愿 grab 最初的'DROP'
总而言之,这对我来说效果更好:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
表在转储和数据库中应该具有相同的结构 .
`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`
19 回答
这可以更轻松地完成吗?我就这样做了:
创建临时数据库(例如还原):
恢复临时数据库中的完整转储:
转储要恢复的表:
在另一个数据库中导入表:
一个简单的解决方案是简单地创建一个只想要单独恢复的表的转储 . 您可以使用mysqldump命令使用以下语法执行此操作:
然后像往常一样导入它,它只会导入转储的表 .
无论如何,执行该操作的任何进程都必须遍历转储的整个文本并以某种方式解析它 . 我只是为了
并将输出传递给mysql . 看一下转储中的第一个表,确保你以正确的方式获得INSERT .
编辑:好的,这次格式正确 .
您可以尝试使用sed以仅提取所需的表 .
假设您的表名是
mytable
,文件mysql.dump是包含您的巨大转储的文件:这将复制到
mytable.dump
文件中CREATE TABLE mytable
与下一个表格对应的下一个CREATE TABLE
之间的内容 .然后,您可以调整包含表
mytable
的结构的文件mytable.dump
和数据(INSERT
的列表) .我使用了uloBasEI的sed命令的修改版本 . 它包括前面的DROP命令,并读取直到mysql完成将数据转储到您的表(UNLOCK) . 为我工作(重新)将wp_users导入到一堆Wordpress网站 .
您应该尝试使用@bryn命令,但使用`delimiter,否则您还将提取具有前缀或后缀的表,这是我通常所做的:
同样出于测试目的,您可能希望在导入之前更改表名:
要导入,您可以使用mysql命令:
处理此问题的一种可能方法是还原到临时数据库,并从临时数据库中仅转储该表 . 然后使用新脚本 .
这个工具可能是你想要的:tbdba-restore-mysqldump.pl
https://github.com/orczhou/dba-tool/blob/master/tbdba-restore-mysqldump.pl
例如从数据库转储文件还原表:
这也可能有所帮助 .
如果您的系统符合要求,大多数现代文本编辑器应该能够处理大小的文本文件 .
无论如何,我必须非常快地做到这一点,我没有时间找到任何工具 . 我设置了一个新的MySQL实例,导入了整个备份,然后只吐出我想要的表 .
然后我将该表导入主数据库 .
这很乏味但很容易 . 祝好运 .
您可以使用vi编辑器 . 类型:
打开整个转储
mysql.dump
和一个新文件mytable.dump
. 按/
找到相应的插入行,然后键入短语,例如:"insert intomytable
",然后使用yy
复制该行 . 通过ctrl+w
然后down arrow key
切换到下一个文件,用pp
粘贴复制的行 . 最后通过:q
键入:wq
和相当vi编辑器来保存新文件 .请注意,如果您使用多个插入转储数据,则可以使用
Nyy
一次复制(猛拉)所有数据,其中N
是要复制的行数 .我用920 MB大小的文件完成了它 .
这是比上述其他一些更好的解决方案,因为并非所有SQL转储都包含
DROP TABLE
语句 . 这个将工作将各种转储 .获得一个体面的文本编辑器,如Notepad或Vim(如果你已经精通它) . 搜索表名,您应该只能突出显示该表的CREATE,ALTER和INSERT命令 . 用键盘而不是键盘导航可能更容易老鼠 . 我会确保你在一台有足够或RAM的机器上,以便一次加载整个文件不会有问题 . 一旦您突出显示并复制了所需的行,最好将复制的部分备份到自己的备份文件中,然后将其导入MySQL .
使用“表结构为表
my_table
" and "转储表my_table
的数据”来阻止SQL的块 .您可以按如下方式使用Windows命令行来获取各个部分的行号 . 根据需要调整搜索的字符串 .
find / n“for table`”sql.txt
将返回以下内容:
---------- SQL.TXT
[4384] - 表格
my_table
的表格结构[4500] - 转储表的数据
my_table
[4514] - 表
some_other_table
的表结构...等
这可以获得你需要的行号...现在,如果我只知道如何使用它们......调查 .
回到'08 I had a need to do this too. I wrote a Perl script that' ll做到了,它现在是我选择的方法 . 还总结了如何在awk中执行此操作或如何在其他地方恢复并提取 . 最近我也将这个sed方法添加到列表中 . 您可以在此处找到脚本和其他方法:http://blog.tsheets.com/2008/tips-tricks/extract-a-single-table-from-a-mysqldump-file.html
我试了几个选项,速度非常慢 . 这会在几分钟内将360GB转储拆分到其表中:
How do I split the output from mysqldump into smaller files?
前面提到的'sed'解决方案很不错,但提到并非100%安全
您可能拥有包含以下数据的INSERT命令:... CREATE TABLE ...(无论如何)... mytable ...
甚至是确切的字符串“CREATE TABLE
mytable
;”如果你正在存储DML命令!(如果表格很大,你不想手动检查)
我将验证所使用的转储版本的确切语法,并具有更严格的模式搜索:
避免使用“ . *”并使用“^”以确保我们从行的开始处开始 . 我宁愿 grab 最初的'DROP'
总而言之,这对我来说效果更好:
表在转储和数据库中应该具有相同的结构 .
要么