备份
命令行下具体用法如下:
mysqldump -u user_name -p database_name table_name> file_name.sql;
一些常用的参数:
参数 | 缩写 | 含义 |
---|---|---|
–all-databases | -A | 导出全部数据库 |
–no-data | -d | 不导出任何数据,只导出数据库表结构 |
–add-drop-database | 每个数据库创建之前添加drop数据库语句 | |
–add-drop-table | 每个数据表创建之前添加drop数据表语句。(默认为打开状态,使用–skip-add-drop-table取消选项) | |
–default-character-set | 设置默认字符集,默认值为utf8 | |
–flush-privileges | 在导出mysql数据库之后,发出一条FLUSH PRIVILEGES 语句。为了正确恢复,该选项应该用于导出mysql数据库和依赖mysql数据库数据的任何时候 | |
–force | 在导出过程中忽略出现的SQL错误 | |
–host | -h | 需要导出的主机信息,如-ht=localhost |
–ignore-table | 不导出指定表。指定忽略多个表时,需要重复多次,每次一个表。每个表必须同时指定数据库和表名。例如:–ignore-table=database.table1 –ignore-table=database.table2 …… | |
–no-create-db | -n | 只导出数据,而不添加CREATE DATABASE 语句 |
–no-create-info | -t | 只导出数据,而不添加CREATE TABLE 语句。 |
–triggers | 导出触发器。该选项默认启用,用–skip-triggers禁用它。 | |
–single-transaction | 该选项在导出数据之前提交一个BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于多版本存储引擎,仅InnoDB。本选项和–lock-tables 选项是互斥的,因为LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话,应结合使用–quick 选项。 | |
–quick | -q | 不缓冲查询,直接导出到标准输出。默认为打开状态,使用–skip-quick取消该选项 |
–routines | -R | 导出存储过程以及自定义函数 |
–add-locks | 在每个表导出之前增加LOCK TABLES并且之后UNLOCK TABLE。(默认为打开状态,使用–skip-add-locks取消选项) | |
–opt | 等同于–add-drop-table, –add-locks, –create-options, –quick, –extended-insert, –lock-tables, –set-charset, –disable-keys 该选项默认开启, 可以用–skip-opt禁用 | |
–lock-all-tables | -x | 提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭–single-transaction 和–lock-tables 选项 |
需要注意的是--add-drop-table
参数,其默认是打开状态,所以会在sql的开头添加一个drop语句,执行该sql文件的时候会先drop对应的表,如果原本表里有数据的话可能会造成数据丢失。
以下为一些实例:
导出数据库为dbname的表结构(其中用户名为root,密码为dbpasswd,生成的脚本名为db.sql)
mysqldump -uroot -pdbpasswd -d dbname >db.sql;
导出数据库为dbname某张表(test)结构
mysqldump -uroot -pdbpasswd -d dbname test>db.sql;
导出数据库为dbname所有表结构及表数据(不加-d)
mysqldump -uroot -pdbpasswd dbname >db.sql;
导出数据库为dbname某张表(test)结构及表数据(不加-d)
mysqldump -uroot -pdbpasswd dbname test>db.sql;
还原
用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。
直接用 mysql 客户端
例如:
mysql -u xxxx -p xxxx db_name < db_name.sql
用 SOURCE 语法
其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,登入mysql之后:
use database_name;
SOURCE /tmp/db_name.sql;
这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。