mysql备份 只包含表格的某些行
使用 -where=... 选项指定 WHERE 子句以应用于备份中包含的表。
请注意,相同的 WHERE 子句将应用于同一备份中包含的所有表。
例如,如果我们正在备份世界示例数据库的 City 表,并且我们只想包含 CountryCode = 'USA' 的那些,我们可以这样做:
mysqldump --defaults-file=etc/my.cnf --tables --where="CountryCode = 'USA'" world City > City_USA.sql
选择要包含在备份中的数据库和表
通常,备份中包含以下内容:
- 备份中包含的每个表的 CREATE TABLE 语句
- 数据的 INSERT 语句
- 包含的表上的触发器
- 如果备份了多个数据库,则包含 CREATE DATABASE 和 USE;但不适用于单个数据库备份!
以下示例假定 ~/.my.cnf 包含连接到 MySQL 所需的选项以及将与 mysqldump 一起使用的其他选项(另请参见下文)。
mysql备份 同一个数据库中的多个表
使用 -tables 选项。
使用此选项,第一个参数是数据库的名称,其余参数是要备份的表的名称。
如果没有另外的选项,CREATE DATABASE 和 USE 语句将不会包含在备份中。
mysqldump ... --tables
例如备份 sakila 示例数据库中的 actor 和 film 表:
mysqldump --defaults-file=~/.my.cnf --tables sakila actor film > backup_sakila_actor_and_film.sql
其他选项
使用 mysqldump 创建部分备份时,一些有用的添加选项是:
-add-drop-database , -add-drop-table , -add-drop-trigger
-hex-blob :使用十六进制表示法转储二进制列(例如,'abc' 变为 0x616263)。
如果我们有二进制数据,请务必包含此选项。-master-data :这将包括一个 CHANGE MASTER TO 语句,其中包含二进制日志文件和创建备份的位置。
使用 -master-data=2 时,CHANGE MASTER TO 语句将在注释中,因此在恢复备份时不会自动执行。-no-create-db :不包括 CREATE DATABASE 语句(在备份多个数据库的情况下)。
-no-create-info :不包括 CREATE TABLE 语句。
-no-data :不包含任何数据。
这对于导出模式很有用。-routines:包括来自备份数据库的存储过程和存储函数。
-tab=... :生成制表符分隔的数据文件。
请注意,每个表将有一个以该表命名的文件。
这类似于 SELECT ... INTO OUTFILE ... 并且可以使用 LOAD DATA [LOCAL] INFILE 加载生成的数据转储。
请注意,无论表存在于哪个数据库中,所有文件都将在同一目录中创建,因此当仅备份单个数据库中的表时,此选项最有用。
还有几个选项可以指定数据文件的格式。
-triggers :包括备份中包含的表的触发器。
这是默认完成的。
如果我们不想包含触发器,请使用 -skip-triggers。
mysql备份时 忽略表
使用 -ignore-table 选项忽略表。
多次指定该选项以从备份中排除多个表。
例如,排除 sakila 示例数据库中的 actor 和 film 表,否则包括所有数据库和表(-all-databases 选项):
mysqldump --defaults-file=~/.my.cnf --ignore-table=sakila.actor --ignore-table=sakila.film --all-databases > backup_excluding_sakila_actor_and_film.sql
mysql备份设置锁定
创建部分备份时,我们还需要考虑我们需要的锁定级别。
选项与完整备份相同:
默认情况下,mysqldump read 一次锁定一个数据库。
但是还有其他选择:
- -single-transaction 如果我们正在备份 InnoDB 表,这是首选的锁定选项。
mysqldump 将使用一致的快照启动事务并在此事务中创建备份。
这意味着:
- 所有数据是一致的,例如:它对应于相同的时间点。
- 不需要锁(除非我们还使用 -master-data 来获取二进制日志文件和备份的位置,在这种情况下,在获取主状态时,在开始时会短暂地需要一个读锁)。
- 但是,如果备份中包含非 InnoDB 表并对这些表进行更改,则备份将不一致。
- 特别是如果备份需要很长时间,备份创建的读取视图可能会导致开销。
-lock-tables 这个相当于默认的。
例如:对于每个转储的数据库,在转储之前锁定所有要转储的表。-lock-all-tables 该读在整个备份期间锁定整个实例中的所有表(无论该表是否包含在备份中)。
根据我们是想要单个数据库中的数据库子集还是表的子集,有多种创建备份的选项。
mysql备份单一数据库
这是 mysqldump 的默认设置。
如果没有另外的选项,CREATE DATABASE IF NOT EXISTS 和 USE 语句将不会包含在备份中。
mysqldump ... > backup.sql
例如备份世界示例数据库:
mysqldump --defaults-file=~/.my.cnf world > backup_world.sql
mysql备份多个数据库
这可以使用 -databases 选项存档。
CREATE DATABASE 和 USE 语句包含在每个新数据库之前的输出中。
mysqldump ... --databases
例如备份 world 和 sakila 示例数据库:
mysqldump --defaults-file=~/.my.cnf --databases world sakila > backup_world_and_sakila.sql
mysql备份数据库中的单个表
这与单个数据库的工作方式相同,但只需要一个带有表名的添加参数:
mysqldump ... > backup.sql
例如从世界示例数据库备份 City 表:
mysqldump --defaults-file=~/.my.cnf world City > backup_world_City.sql