最佳的mysqldump设置是什么?[关闭]


14

经过一番搜索后,我得到了以下设置:

    mysqldump\
    --host=localhost\
    --port=3306\
    --databases ****\
    --user=****\
    --password=****\
    --default-character-set=utf8\
    --add-drop-database\
    --add-drop-table\
    --add-locks\
    --complete-insert\
    --extended-insert\
    --lock-all-tables\
    --create-options\
    --disable-keys\
    --quick\
    --order-by-primary\
    --set-charset\
    --tz-utc\
    > dump/test.sql

到目前为止,还不错,但是我对参数以及执行有一些疑问。

关于我的第一个问题,我只想确保所有这些都是必需的,并且一起使用时不会引起任何冲突。最终,我想制作一个非常健壮和一致的转储文件,其中包含数百万条记录,用于创建表,数据库和插入数据。好处是,使数据库暂时不可用对我来说不是问题。我唯一的目标是制作一个健壮且一致的转储文件。

关于我的第二场音乐会,我想知道如何在命令出错时得到通知,如果出错,则抛出异常。

有任何想法吗?

编辑

这是我根据RolandoMySQLDBA的反馈更新的mysqldump命令。

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--default-character-set=utf8\
--opt\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
--add-drop-table\
--complete-insert\
--delayed-insert\
--tz-utc\
> dump/test.sql

阅读每个参数及其优势,然后选择适合您的参数。还了解脚本以在发生故障时触发。
Mannoj 2014年

凉。但这并不能真正回答我的问题。例如,您始终使用哪个?
user706838 2014年

原谅我的无知,这个问题不是关于推荐书籍或网站。因此,我认为这不应该是基于意见的问题。话虽这么说,但根据专业知识并得到测试的支持,某些答案肯定质量更高。我认为,该问题已明确提出,目标明确。
user10089632 '18

Answers:


30

您会发现这令人震惊,但是您只需要一个主要选项:-- opt

什么是--opt

此选项,默认情况下启用,对于组合速记--add-drop-table在 --add锁 --create选项 -禁用键 --extended-插入 --lock桌 --quick -设置字符集。它提供了快速的转储操作并生成了一个转储文件,可以将其快速重新加载到MySQL服务器中。

因为--opt选项默认情况下处于启用状态,所以您仅指定它的反选项,-- skip -opt可关闭一些默认设置。有关有选择地启用或禁用受--opt影响的选项子集的信息,请参见mysqldump选项组的讨论。

由于--opt已启用,因此无需指定--opt。尽管如此,您可能需要一些未包含的必要选项。

在您的数据库上运行此查询

SELECT engine,COUNT(1) TableCount
FROM information_schema.tables
WHERE engine IN ('InnoDB','MyISAM')
AND table_schema NOT IN ('information_schema','mysql','performance_schema')
GROUP BY engine;

如果您拥有所有InnoDB表,则需要指定--single-transaction。这将自动停用--lock-tables,并允许您在同一时间点转储所有表,并允许同时进行新的写入。

如果您有一个或多个MyISAM表,则需要指定--lock-all-tables。这将自动停用--lock-tables,停用--single-transaction,锁定所有数据库中的所有表,然后创建转储。仍然可以进行对InnoDB表的写操作,但是它们只会排队等待,直到释放锁为止。任何尝试写入任何MyISAM表的数据库连接实际上都会被挂起,直到释放所有锁为止。

运行此查询: SELECT COUNT(1) Number_Of_Stored_Procedures FROM mysql.proc;

如果Number_Of_Stored_Procedures大于零,请使用--routines

运行此查询: SELECT COUNT(1) Number_Of_Triggers FROM information_schema.triggers;

如果Number_Of_Triggers大于零,请使用--triggers

CAVEAT:请不要使用--order-by-primary来转储所有数据库,因为它可能会使BTREE索引在重新加载时变得不正确。--order-by-primary仅应在转储您知道具有整数主键并且将从应用程序进行大量范围扫描的单个表时使用。

如果您需要更多创造性的mysqldump备份类型,请参阅我的旧文章如何优化大型数据库的mysqldump?

阅读mysqldump的所有选项

更新2014-12-29 09:44 EST

我已经更新了mysqldump命令(请参阅我的编辑)。我还有最后一个问题。您认为也值得使用以下所有参数吗?--add-drop-database \ --add-drop-table \ --complete-insert \ --delayed-insert \ --tz-utc

查看您的评论和最新编辑,让我们看看这些选项中的每个选项,看看是否需要其中任何一个

调整您的最新编辑,这是您特别需要的

mysqldump\
--host=localhost\
--port=3306\
--databases ****\
--user=****\
--password=****\
--single-transaction\
--routines\
--triggers\
--events\
--add-drop-database\
> dump/test.sql

同样,我说请阅读mysqldump的所有选项


关于--add-drop-database:这是否还可以确保数据库中没有其他没有在转储中的随机表?如果有人在您的数据库中手动创建了一个随机测试表,那么在没有此选项的情况下从转储重新加载后它仍然存在。因此,这取决于您是否想要。对?
jschultz410

--add-drop-trigger
lonix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.