我认为阅读文档的那部分内容是一样的,但我发现了更多信息:
4.5.4. mysqldump — 数据库备份程序
http://dev.mysql.com/doc/en/mysqldump.html
对于 InnoDB 表,mysqldump 提供了一种进行在线备份的方法:
shell> mysqldump --all-databases --single-transaction > all_databases.sql
此备份在转储开始时获取所有表的全局读锁(使用 FLUSH TABLES WITH READ LOCK)。一旦获得了这个锁,就会读取二进制日志坐标并释放锁。如果在发出 FLUSH 语句时正在运行长更新语句,MySQL 服务器可能会停止,直到这些语句完成。之后,转储变为无锁并且不会干扰对表的读取和写入。如果 MySQL 服务器接收到的更新语句很短(就执行时间而言),那么即使有很多更新,初始锁定周期也不应该是明显的。
--opt
和--single-transaction
选项有冲突:
- 选择
此选项是简写。与指定 --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --quick --set-charset 相同。它应该给你一个快速的转储操作并生成一个可以快速重新加载到 MySQL 服务器的转储文件。
--opt 选项默认启用。使用 --skip-opt 禁用它。
如果我正确理解您的问题,您希望将实际数据和 DDL(数据定义语言)放在一起,因为如果您只想要 DDL,您将使用--no-data
. 有关这方面的更多信息,请访问:
http://dev.mysql.com/doc/workbench/en/wb-reverse-engineer-create-script.html
如果您希望创建数据库及其所有对象,请使用 --databases 选项和 mysqldump。如果脚本文件中没有 CREATE DATABASE db_name 语句,则必须将数据库对象导入现有模式,或者,如果没有模式,则创建新的未命名模式。
正如Michael Kofler 的 The Definitive Guide to MySQL 5所建议的那样,我建议以下选项:
--skip-opt
--single-transaction
--add-drop-table
--create-options
--quick
--extended-insert
--set-charset
--disable-keys
此外,--order-by-primary
如果您正在使用该--databases
选项,则还应该使用该选项,--add-drop-database
尤其是与此答案结合使用时。如果您要备份连接在不同网络上的数据库,则可能需要使用该--compress
选项。
因此 mysqldump 命令(不使用--compress
、--databases
或--add-drop-database
选项)将是:
mysqldump --skip-opt --order-by-primary --single-transaction --add-drop-table --create-options --quick --extended-insert --set-charset -h db_host -u username --password="myPassword" db_name | mysql --host=other_host db_name
我删除了--disable-keys
书中给出的参考,因为据我了解,它对 InnoDB 无效。MySql 手册指出:
对于每个表,用 /*!40000 ALTER TABLE tbl_name DISABLE KEYS /;包围 INSERT 语句 和 / !40000 ALTER TABLE tbl_name ENABLE KEYS */; 陈述。这使得加载转储文件更快,因为索引是在插入所有行之后创建的。此选项仅对 MyISAM 表的非唯一索引有效。
我还发现了这个错误报告http://bugs.mysql.com/bug.php?id=64309,它在底部有来自Paul DuBois 的评论,他还写了几本书,除了这个特定问题我没有参考在该错误报告中找到的那些评论。
现在要创建“终极备份”,我建议考虑一下这个 shell 脚本的内容
- https://github.com/red-ant/mysql-svn-backup/blob/master/mysql-svn.sh