MySQL / 简短指南

如何在 MySQL 中导出数据库和表 schema

分享到

简介

在关系型数据库中,数据库 schema 定义了数据库的结构及其组成部分,如表、字段和索引。提取和导出这些信息在许多场景中都很有用,包括备份、迁移到新环境、可视化数据结构以及在代码库中管理这些结构。

在本简短指南中,我们将讨论如何使用 mysqldump 命令导出 MySQL 数据库 schema。虽然此实用程序可以从 MySQL 导出多种类型的数据,但在此指南中,我们将重点介绍提取数据结构本身。

基本用法

从 MySQL 导出数据库 schema 所需的基本命令如下所示

mysqldump --user=USERNAME --host=HOSTNAME --password --no-data DATABASE > schema.sql

这里的选项可以分为两个不同的类别。

第一类定义了通用基本连接信息,你需要提供这些信息才能连接到任何 MySQL 实用程序

  • --user= / -u:你要使用其进行身份验证的数据库用户名
  • --password / -p:强制 mysqldump 提示输入密码进行身份验证
  • --host= / -h:MySQL 所在的主机名或 IP 地址
  • --port= / -p:MySQL 正在监听的端口号

如果您连接到在默认配置中运行的本地 MySQL 实例,通常可以省略主机和端口选项。

第二类告诉 mysqldump 要导出什么

  • --no-data / -d:这告诉实用程序仅导出结构本身,而不是它们包含的记录

此外,第一个非选项参数(此处由单词“DATABASE”表示)指示要导出的确切数据库。

使用此信息,您可以使用如下命令导出名为 SALES 的数据库的 schema,该数据库使用名为 sales_reporter 的受限用户

mysqldump --user=sales_reporter --password --no-data SALES > sales_database_schema.sql

修改导出行为

上面讨论的基本用法将输出与相关数据库相关的每个结构。我们可以使用许多附加选项来修改此行为。

定位多个数据库

您可以使用以下选项之一修改导出将定位的数据库数量

  • --databases / -B:将所有名称参数视为数据库名称。这允许您同时从多个数据库导出 schema。
  • --all-databases / -A:导出 MySQL 中的所有数据库(除了内部使用的 performance_schema 数据库)

因此,要转储所有数据库,您可以使用

mysqldump --user=USERNAME --password --no-data --all-databases > all_schemas.sql

或者,要从三个不同的数据库转储结构,您可以使用

mysqldump --user=USERNAME --password --no-data --databases FIRST SECOND THIRD > three_db_schemas.sql

仅导出某些结构

您还可以通过在数据库名称后命名要导出的特定表作为附加参数来减少导出的结构。

例如,如果您的 SALES 数据库中的三个表名为 EMPLOYEESTOREINVENTORY,则可以通过键入以下内容仅导出这些结构

mysqldump --user=USERNAME --password --no-data SALES EMPLOYEE STORE INVENTORY > some_sales_tables.sql

在此构造中,第一个参数始终假定为数据库名称,所有其他命名参数都被视为该数据库中的表。因此,此用法与 --databases 选项不兼容,后者修改了 mysqldump 解释附加参数的方式。

导出附加结构

除了数据库和表之外,您还可以通过包含以下选项显式导出事件和例程定义

  • --routines / -R:在导出的 schema 转储中包含存储过程和函数
  • --events / -E:在输出中包含事件调度器事件的定义

例如,要包含数据库 SALES 的转储,其中包含这些额外的定义,您可以键入

mysqldump --user=USERNAME --password --no-data --routines --events SALES > all_sales_schemas.sql

其他相关选项

根据您的目标,一些可能有用的附加选项包括

  • --add-drop-database:在每个 CREATE DATABASE 语句之前,向转储文件添加 DROP DATABASE 语句。这确保首先删除给定数据库的任何先前定义的结构,以避免冲突。
  • --single-transaction:将事务隔离级别设置为“可重复读”,以帮助在使用 InnoDB 等存储引擎时确保更一致的数据库状态。这会转储数据库在初始化转储时的快照。

这些选项可以添加到您的 schema 转储命令中,而不会改变其他组件的基本语义或含义。

结论

能够导出您的 schema 允许您将数据库结构保存在数据库本身之外。这在设置新环境、随着需求变化发展您的 schema 以及可视化您正在存储的信息的结构时非常有用。

关于作者
Justin Ellingwood

Justin Ellingwood

自 2013 年以来,Justin 一直在撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。