基本用法
mysqldump是一个客户端应用程序,可用于进行逻辑备份。它将生成必要的 SQL 语句来重现原始数据库。
以下语句是 mysqldump 的一些常见用法:
mysqldump -u username -p database_name [table_name] > dump.sql
mysqldump -u username -p --databases db1_name db2_name > dump.sql
mysqldump -u username -p --all-databases > dump.sql
第一个示例用于备份单个数据库。如果您需要备份一些特定的表而不是整个数据库,请写下它们的名称,以空格分隔。
通过该--databases
选项,您可以备份两个或多个数据库,它们的名称必须以空格分隔。
要备份 MySQL 服务器中的所有数据库,只需附加该--all-databases
选项即可。
该dump.sql
文件不包含创建数据库 SQL 语句。如果您需要它,请使用-B
选项添加它。如果您使用mysqldump
和--databases
选项运行,则这是不必要的--all-databases
。
使用该选项也可以在备份数据库时忽略表--ignore-tables
。
$ mysqldump -u username -p database_name --ignore-tables=database_name.table1 > database_name.sql
如果您需要忽略多个数据库,只需根据需要多次使用该选项。
代码语言:javascript复制$ mysqldump -u root -p database_name --ignore-table=database_name.table1 --ignore-table=database_name.table2 > database_name.sql
库表架构备份
如果您只需要备份没有数据的数据库架构,请使用以下选项运行 mysqldump --no-data
:
$ mysqldump -u username -p database_name --no-data > dump.sql
mysqldump
您还可以在运行时使用--databases
和选项备份架构--all-databases
。
$ mysqldump -u username -p --all-databases --no-data > dump.sql
代码语言:javascript复制$ mysqldump -u username -p --databases db1_name db2_name --no-data > dump.sql
数据还原
要恢复文件中的数据库dump.sql
,请运行以下命令:
$ mysqldump -u root -p < dump.sql
如果您需要从完整备份中恢复单个数据库,您可以通过运行以下任何语句来完成:
代码语言:javascript复制$ mysqldump -u root -p -o database_name < dump.sql
代码语言:javascript复制$ mysqldump -u root -p --one-database database_name < dump.sql
在这两种情况下,数据库都必须存在于您的 MySQL 服务器中,因为它只会恢复模式和数据。
指定条件备份
如果您需要创建包含符合条件的数据的备份,您可以使用WHERE
带有 mysqldump 的子句。
您可以使用单个 where 条件:
代码语言:javascript复制$ mysqldump database_name table_name --where="id > 500" > dump.sql
或多个条件:
代码语言:javascript复制$ mysqldump database_name users --where="id > 500 and disabled = 0" > dump.sql
如mysqldump.guru网站中的此处所述。
例如,在具有以下模式的数据库中,该数据库是从Moviet数据集构建的:
如果您想备份在特定国家(如墨西哥)制作的电影,一种方法是运行带有子句的 mysqldump WHERE
。
$ mysqldump -u root -p movienet movies --where=”country = 22” > dump.sql
22
是这个特定数据库中的墨西哥,可以通过执行以下 SQL 语句来获取这些值:
select movies.movie_id, movies.title, countries.name as country from movies inner join countries on movies.country = countrie
s.country_id and movies.country = '22';
代码语言:javascript复制 ----------- ----------------------------------------------------------- ---------
| movie_id | title | country |
----------- ----------------------------------------------------------- ---------
| tt0047501 | Sitting Bull (1954) | Mexico |
| tt0049046 | Canasta de cuentos mexicanos (1956) | Mexico |
| tt0076336 | Hell Without Limits (1978) | Mexico |
| tt0082048 | El barrendero (1982) | Mexico |
| tt0082080 | Blanca Nieves y sus 7 amantes (1980) | Mexico |
| tt0083057 | El sexo de los pobres (1983) | Mexico |
| tt0110185 | El jardín del Edén (1994) | Mexico |
| tt0116043 | De jazmín en flor (1996) | Mexico |
| tt0121322 | El giro, el pinto, y el Colorado (1979) | Mexico |
| tt0133354 | Algunas nubes (1995) | Mexico |
| tt0207055 | La risa en vacaciones 4 (TV Movie 1994) | Mexico |
| tt0208889 | To and Fro (2000) | Mexico |
| tt0211878 | La usurpadora (TV Series 1998– ) | Mexico |
| tt0220306 | El amarrador 3 (1995) | Mexico |
| tt0229008 | El vampiro teporocho (1989) | Mexico |
跳过指定数据库
生成备份时没有mysqldump
跳过数据库的选项,但这里有一个适合您的解决方案:
DATABASES_TO_EXCLUDE="db1 db2 db3"
EXCLUSION_LIST="'information_schema','mysql'"
for DB in `echo "${DATABASES_TO_EXCLUDE}"`
do
EXCLUSION_LIST="${EXCLUSION_LIST},'${DB}'"
done
SQLSTMT="SELECT schema_name FROM information_schema.schemata"
SQLSTMT="${SQLSTMT} WHERE schema_name NOT IN (${EXCLUSION_LIST})"
MYSQLDUMP_DATABASES="--databases"
for DB in `mysql -u username -p -ANe"${SQLSTMT}"`
do
MYSQLDUMP_DATABASES="${MYSQLDUMP_DATABASES} ${DB}"
done
MYSQLDUMP_OPTIONS="--routines --triggers"
mysqldump -u username -p ${MYSQLDUMP_OPTIONS} ${MYSQLDUMP_DATABASES} > MySQLDatabases.sql
上面的 BASH 脚本将生成您的 MySQL 服务器的备份,不包括变量中列出的information_schema
和数据库,以及您在变量中选择的数据库。mysql``EXCLUSION_LIST``DATABASES_TO_EXCLUDE
不要忘记将要排除的数据库添加到DATABASES_TO_EXCLUDE
变量中,替换和命令username
中的, 并将所需的选项添加到变量中。mysql``mysqldump``MYSQLDUMP_OPTIONS
安全注意事项
一些常见问题是关于如何从完整备份进行部分恢复。例如,当您使用 备份数据库时mysqldump
,您将获得用于创建数据库架构和从备份中插入数据的语句。
如果您只需要架构,则可以使用 --no-data 选项运行 mysqldump。但是如果你需要从一个完整的备份中恢复特定数据库的模式,我发现了一个有趣的解决方案:
代码语言:javascript复制cat dump.sql | grep -v ^INSERT | mysql -u username -p
上面的命令将恢复数据库的模式,跳过用于插入数据的 SQL 语句。当您备份单个数据库时,它运行良好,但没有理由使用它,因为您可以使用该选项获取模式--no-data
,而不是删除插入。
如果您尝试使用包含服务器中所有数据库的备份运行此命令,会发生什么情况?您必须小心,因为这会尝试覆盖数据库中的系统模式,mysql
这是危险的。此数据库存储身份验证详细信息并覆盖数据将使您无法访问您的服务器。
如果您不需要备份mysql
数据库,请mysqldump
使用选项运行以指定您需要哪些数据库或使用跳过数据库--databases
部分中共享的脚本。