我有一个mysqldump备份我的mysql数据库,包括我们所有的表,这是大约440兆。我只想从mysqldump中恢复其中一个表的内容。这可能吗?从理论上讲,我可以只删除重建我想要的表的部分,但我甚至不知道如何有效地编辑这种大小的文本文档。
当前回答
SQL块被“表my_table的表结构”和“转储表my_table的数据”阻塞。
您可以如下所示使用Windows命令行获取各个部分的行号。根据需要调整搜索字符串。
查找/n "for table ' " sql.txt
将返回以下内容:
---------- SQL.TXT
[4384]——my_table的表结构
[4500]——转储表my_table的数据
[4514]——表some_other_table的表结构
... 等。
这就得到了你需要的行号……现在,如果我知道如何使用它们……调查。
其他回答
备份 mysqldump-A.gz - | gzip > 恢复单表 $ mysql -e "truncate TABLE_NAME $ zgrep ^"INSERT INTO \ ' TABLE_NAME" mysqldump-A.gz | mysql DB_NAME
我尝试了一些选择,它们都非常慢。这将在几分钟内将一个360GB的转储拆分到它的表中:
如何将mysqldump的输出分割成更小的文件?
前面提到的“sed”解决方案很好,但不是100%安全
你可以使用INSERT命令,其中的数据包含: ... 创建表(无论)……mytable… 或者甚至是精确的字符串"CREATE TABLE ' mytable ';" 如果您正在存储DML命令,例如!
(如果表很大,你不需要手动检查)
我会验证所使用的转储版本的确切语法,并有一个更严格的模式搜索:
避免”。*”并使用“^”来确保我们从行开头开始。 我更喜欢抓住最初的DROP
总而言之,这对我来说更好:
sed -n -e '/^DROP TABLE IF EXISTS \`mytable\`;/,/^UNLOCK TABLES;/p' mysql.dump > mytable.dump
不管怎样,任何这样做的进程都必须遍历转储的整个文本,并以某种方式解析它。我只要grep
INSERT INTO `the_table_i_want`
并将输出导入mysql。看一下之前转储中的第一个表,以确保您以正确的方式获取INSERT。
编辑:好的,这次格式正确。
这个工具可能就是你想要的: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
推荐文章
- 如何停止mysqld
- 检查MySQL表是否存在而不使用“select from”语法?
- 从NOW() -1天选择记录
- 从表中选择1是什么意思?
- 数据库性能调优有哪些资源?
- 如何更改表的默认排序规则?
- MySQL foreign_key_checks是否影响整个数据库?
- 设置NOW()为datetime数据类型的默认值?
- 在MySQL中Datetime等于或大于今天
- 删除MySQL中的主键
- 我如何在MySQL中添加更多的成员到我的enum类型列?
- 相当于varchar(max)在MySQL?
- PHP与MySQL 8.0+错误:服务器请求身份验证方法未知的客户端
- laravel5“LIKE”对等物(雄辩的)
- PHP PDO:字符集,集名称?