假设在测试数据库中,大约一年的数据被删除了。我获得了最早一年的数据的两个 ID,以及最晚一年的数据的两个 ID,因此可以确定这里缺失的数据的范围。我的问题是:从数据库的完整实例中使用以下命令是否有任何危险,以便获得可用于修复包含缺失信息块的数据库的有效转储?命令:
mysqldump -t --insert-ignore --skip-opt --single-transaction --quick --where="id<156789339" -w"id>124054297" -u root -p database table > partial.sql
经过 gzip 压缩/移动后导入如下内容:
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 的手册页)。只是想确定这是我在导出时所需要的全部内容,以及在可能出现任何错误之前,我是否可能在导入时遗漏了什么。
答案1
应该没问题。但有些特殊情况可能会失败。
您的数据库中有使用 ON DELETE CASCADE 语句指向您表的外键,在这种情况下,您会因之前的删除而丢失其他数据,并且您还必须找到并复制该数据。如果您的数据库使用的是 MYISAM,那么您没有外键,因此您是安全的。
您使用的是以前版本不支持的特殊功能,例如 FULLTEXT 索引。由于您说这是一个测试数据库,因此我认为模型是相同的。在这种情况下应该没有问题。
您正在使用不同的编码/排序规则在两个数据库中,并且表中有非 ASCII(本地化)文本字段。同样,如果模型相同,应该没有问题。(如果您的表没有明确的编码定义,并且 mysql 服务器中的默认编码不同你可能会遇到问题,但这种可能性不大。
如果您使用 INNODB,您可能希望在 TRANSACTION 中执行整个转储(在 BEGIN; 和 COMMIT; 之间)