用mysqldump导出、备份、迁移数据库
mysqldump是MySQL官方提供的一个数据库备份工具,利用它可以很方便地进行数据库的导出、备份和迁移。官方文档请查看这里,本文将对mysqldump的使用做一个简单的总结。
适用场景
数据库备份主要有两种方式:物理备份、逻辑备份。它们分别适用不同的场景,以下是这两种备份方式的对比:
官方工具 | 备份方式 | 优点 | 缺点 | |
---|---|---|---|---|
物理备份 | mysqlbackup | 复制实际的数据存储文件 | 速度较快 适合较大数据量 |
不够灵活 |
逻辑备份 | mysqldump | 将数据库结构和数据导出 | 速度较慢 适合少量数据 |
使用灵活 |
根据上面表格的对比,我们可以看出mysqldump适合的使用场景。它主要适用于数据量不大(几十GB以内)、对备份时间要求不高的场景,同时还可以方便地对备份的数据进行编辑和修改(例如修改表的定义等)。
使用
如下是一个简单的数据库导出、备份和迁移的流程图:
首先,我们需要用到mysqldump工具将源数据库中的结构以及数据进行导出。导出以后,如果还需要对其进行调整,可以直接编辑导出的文件。
接下来,如果仅仅需要将导出的数据留作备份,那么就将导出的文件存储好即可。
如果需要做数据库迁移,那么就可以将导出的文件再导入到目标数据库中,这一操作可以使用mysql命令。
下面我们先来看一下基础的使用方式,然后后面再介绍具体的使用示例。
导出
mysqldump提供的最基础的一个功能就是导出数据库结构以及数据,最常用的导出操作有三种:
- 导出单个数据库中的多张表
- 导出多个数据库
- 导出全部数据库
导出单个库中的多张表
实现这个操作的命令如下:
其中 [options]
是可选的参数。db_name
是数据库的名称,[tbl_name ...]
是表的名称,多张表名之间用空格分隔。下面是一些示例:
导出 db
库中的 table
表:
导出 db
库中的 table1
、table2
、table3
三张表:
导出多个库
实现这个操作的命令如下:
其中 [options]
是可选的参数。--databases
表示导出多个库,db_name ...
是数据库的名称,多个库名之间用空格分隔。下面是一些示例:
导出 db
库:
导出 db1
、db2
、db3
三个库:
这里可以看出,如果不加 --databases
参数,mysqldump会把 db2
、db3
当做 db1
数据库中的表名,因此导出多个库时一定要加 --databases
参数。
导出全部库
实现这个操作的命令如下:
其中 [options]
是可选的参数。--all-databases
表示导出全部数据库。
但是这里需要注意,这个命令实际并不会导出所有的库,它默认会忽略某些数据库(例如performance_schema、sys数据库)。如果确实需要导出这些数据库,可以使用导出多个库中的方法,用 --databases
参数来指定要导出的数据库。
将导出的内容存入sql文件
前面介绍的命令只会将导出的内容打印在控制台,为了保存这些内容,我们需要将其写入sql文件中。
大多数情况,我们只需要将导出的内容重定向到一个sql文件即可:
该命令会将导出的内容写入到 dump.sql
这个文件中。
注意在Windows的PowerShell中使用这个命令时,会导出成一个UTF-16字符集的sql文件。当需要将这个文件导入到目标数据库时,可能会出现无法正确加载的情况。为了避免这个问题,可以使用 --result-file
参数来导出:
导入
将数据导入目标数据库使用的是mysql命令。
如果已经有了sql文件,那么可以用如下命令将sql文件中的数据导入目标数据库:
该命令会将 dump.sql
中的内容导入到数据库中,其中 [options]
是mysql命令的参数,具体请参考官方文档。
如果没有sql文件,那么也可以直接结合mysqldump命令和mysql命令,将源数据库的数据迁移到目标数据库:
参数
了解了mysqldump的基础使用,我们再来看一下它的命令参数,下表是mysqldump的一些常用参数:
参数名 | 示例 | 简写 | 功能 |
---|---|---|---|
--host | --host=host_name | -h host_name | 数据库的主机名 默认值:localhost |
--port | --port=port_num | -P port_num | 数据库连接端口 默认值:3306 |
--user | --user=user_name | -u user_name | 访问用户名 |
--password | --password[=password] | -p[password] 注意中间没有空格 |
访问密码[] 及其中的内容是可选的。如果选项后面不输入密码, 会在执行命令后提示用户输入密码 |
--all-databases | -A | 导出全部数据库 | |
--databases | --databases db_name ... | -B | 导出多个数据库 |
--ignore-table | --ignore-table=db_name.tbl_name | 导出时忽略某些表 必须同时用库名和表名来指定。 如果需要忽略多张表, 可以多次使用该参数 |
|
--no-data | -d | 不导出数据,只导出表结构 | |
--hex-blob | 将二进制数据以十六进制形式导出 | ||
--help | -? | 打印帮助信息 | |
--version | -V | 打印版本信息 |
以上参数的详细信息以及其他不常用参数的使用请参考官方文档。
使用示例
将全部数据库的结构和数据导出到sql文件中:
将 db1
、db2
、db3
三个数据库的结构和数据导出到sql文件中:
将 db
数据库的结构和数据导出到sql文件中,除了 table1
和 table2
表:
将 db
数据库的结构导出到sql文件中,不导出数据: