快速转储停顿的数据库:
将“-T”选项与 mysqldump 结合使用会在指定目录中生成大量 .sql 和 .txt 文件。转储大型表比使用 INSERT 语句的单个 .sql 文件快约 50%(所需时间减少 1/3)。
此外,如果您可以并行加载多个表并使多个核心饱和,那么在恢复时会有巨大的好处。在 8 核机器上,除了“-T”提供的效率改进之外,恢复转储的挂钟时间可能相差 8 倍。由于“-T”导致每个表存储在单独的文件中,因此并行加载它们比拆分大型 .sql 文件更容易。
将上述策略发挥到逻辑极限,我们可以创建一个脚本来广泛并行地转储数据库。嗯,这正是 Maakit mk-parallel-dump 的内容(请参阅http://www.maatkit.org/doc/mk-parallel-dump.html http://www.maatkit.org/doc/mk-parallel-dump.html) 和 mk-parallel-restore 工具是;对底层 mysqldump 程序进行多次调用的 perl 脚本。然而,当我尝试使用这些时,我很难在不出现普通转储中不会出现的重复关键错误的情况下完成恢复,因此请记住,您的情况可能会有所不同。
从实时数据库转储数据(不中断服务):
--single-transaction 开关对于转储实时数据库而无需停顿它或转储从属数据库而无需停止从属数据库非常有用。
遗憾的是,-T 与 --single-transaction 不兼容,所以你只能得到一个。
通常,获取转储比恢复要快得多。对于获取传入的整体转储文件并将其分成多个部分以并行加载的工具来说,仍有空间。据我所知,这样的工具还不存在。
通过网络传输转储通常是一个胜利
要侦听一台主机上传入的转储,请运行:
nc -l 7878 > mysql-dump.sql
然后在您的数据库主机上运行
mysqldump $OPTS | nc myhost.mydomain.com 7878
这减少了主服务器上磁盘轴的争用,将转储写入磁盘,从而稍微加快转储速度(假设网络足够快,可以跟上,对于同一数据中心中的两个主机来说,这是一个相当安全的假设)。另外,如果您正在构建一个新的从站,这可以节省完成后必须传输转储文件的步骤。
注意事项 - 显然,您需要有足够的网络带宽,以免速度减慢到难以忍受的程度,如果 TCP 会话中断,您必须重新开始,但对于大多数转储来说,这不是一个主要问题。
最后,我想澄清一个常见的困惑。
尽管您经常在 mysqldump 示例和教程中看到这些标志,但它们是多余的,因为默认情况下它们是打开的:
--opt
--add-drop-table
--add-locks
--create-options
--disable-keys
--extended-insert
--lock-tables
--quick
-
--set-charset
.
From http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html:
--opt 的使用与指定 --add-drop-table、--add-locks、--create-options、--disable-keys、--extended-insert、--lock-tables、-- 相同快速,以及--set-charset。 --opt 代表的所有选项默认也是打开的,因为 --opt 默认是打开的。
在这些行为中,“--quick”是最重要的行为之一(在传输第一行之前跳过在 mysqld 中缓存整个结果集),并且可以与“mysql”一起使用(默认情况下不会打开 --quick)显着加快返回大型结果集的查询(例如转储大表的所有行)。