什么是最佳的 mysqldump 设置?

use*_*838 16 mysql mysqldump backup configuration

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

    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
Run Code Online (Sandbox Code Playgroud)

到目前为止一切顺利,但我对参数和执行有一些疑问。

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

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

有任何想法吗?

编辑

这是我根据 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
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 34

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

什么是--opt

此选项默认启用,是--add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --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;
Run Code Online (Sandbox Code Playgroud)

如果您拥有所有 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

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

如果您需要更多创意类型的 mysqldump 备份,请参阅我的旧帖子如何优化大型数据库的 mysqldump?.

阅读 mysqldump 的所有选项

更新 2014-12-29 09:44 美国东部时间

我已经更新了我的 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
Run Code Online (Sandbox Code Playgroud)

我再说一遍,请阅读 mysqldump 的所有选项