假设在一个测试数据库中,一年的数据被删除了。我最早在一年内获得了数据的两个 id,最迟在另一个中获得数据,因此这里缺少一系列内容。我的问题; 从数据库的完整实例中使用以下命令是否有任何危险,以便获得可用于修复其中缺少信息块的数据库的工作转储?命令:
mysqldump -t --insert-ignore --skip-opt --single-transaction --quick --where="id<156789339" -w"id>124054297" -u root -p database table > partial.sql
这是在压缩/移动它之后导入的:
zcat partial.sql.gz | mysql -u root -p database table
可能有一个值得一提的警告 - 数据来自 mysql 5.5 (percona),同时导入到 mysql 5.1 实例中,尽管我认为我不知道由此产生的兼容性问题。
我的理解-t
是避免创建CREATE TABLE
语句(--no-create-info
),--insert-ignore
以防我的范围重叠,因此如果该 id 已经存在,它会忽略它,并--skip-opt
确保它不会做一大堆会在导入时破坏事物的事情(--add-drop-tab, --add-locks, --create-options, --disable-keys, --extended-insert, --lock-tables, --quick, and --set-charset
根据手册页对于mysqldump)。只是想确定这就是我在出口方面所需要的一切,以及在最终犯下任何可能的错误之前,我是否可能在进口方面遗漏了什么。
大概这样就好了。有一些特殊情况可能会失败。
您的数据库中有 FOREIGN KEYs 使用 ON DELETE CASCADE 语句指向您的表,在这种情况下,您会因先前的删除而丢失其他数据,并且您还必须找到并复制该数据。如果您的数据库使用的是 MISAM,则您没有外键,因此您是安全的。
您正在使用以前版本中不支持的特殊功能,例如。FULLTEXT 索引。既然你说它是一个测试数据库,我想模型是相同的。在这种情况下应该没有问题。
您在两个数据库中使用不同的编码/排序规则,并且表中有非 ASCII(本地化)文本字段。同样,如果模型相同,应该没有问题。(如果您的表没有明确的编码定义并且 mysql 服务器中的默认编码不同,您可能会遇到问题,但这不太可能)。
如果您使用的是 INNODB,您可能希望在 TRANSACTION 中执行整个转储(在 BEGIN; 和 COMMIT; 之间)